MapEngine API
地图引擎主类,负责初始化和管理整个地图应用。
构造函数
constructor(
canvas: HTMLCanvasElement | string,
options?: MapOptions
)
参数
canvas- Canvas 元素或选择器字符串options- 配置选项(可选)
MapOptions
interface MapOptions {
center?: [number, number]; // 中心点 [经度, 纬度],默认 [0, 0]
zoom?: number; // 缩放级别,默认 0
rotation?: number; // 旋转角度(弧度),默认 0
enableRotation?: boolean; // 启用右键旋转,默认 true
devicePixelRatio?: number; // 设备像素比,默认 window.devicePixelRatio
}
示例
import { MapEngine } from 'mapjar';
// 使用选择器
const engine = new MapEngine('#map', {
center: [116.4074, 39.9042],
zoom: 10,
rotation: 0,
enableRotation: true,
});
// 使用 Canvas 元素
const canvas = document.getElementById('map') as HTMLCanvasElement;
const engine = new MapEngine(canvas, {
center: [121.4737, 31.2304],
zoom: 12,
});
渲染控制
start()
启动渲染循环。
start(): void
示例:
engine.start();
stop()
停止渲染循环。
stop(): void
示例:
engine.stop();
图层管理
addLayer()
添加图层。
addLayer(layer: Layer): void
参数:
layer- 要添加的图层
示例:
import { TileLayer } from 'mapjar';
const tileLayer = new TileLayer('osm', 'https://...');
engine.addLayer(tileLayer);
removeLayer()
移除图层。
removeLayer(layerId: string): void
参数:
layerId- 图层 ID
示例:
engine.removeLayer('osm');
getLayer()
获取图层。
getLayer(layerId: string): Layer | undefined
参数:
layerId- 图层 ID
返回值:
- 图层对象,如果不存在则返回
undefined
示例:
const layer = engine.getLayer('osm');
if (layer) {
layer.setVisible(false);
}
相机控制
getCamera()
获取相机对象。
getCamera(): Camera
返回值:
- 相机对象
示例:
const camera = engine.getCamera();
camera.setCenterLonLat(116.4074, 39.9042);
setCenter()
设置地图中心点。
setCenter(lon: number, lat: number): void
参数:
lon- 经度lat- 纬度
示例:
engine.setCenter(116.4074, 39.9042);
setZoom()
设置缩放级别。
setZoom(zoom: number): void
参数:
zoom- 缩放级别(0-22)
示例:
engine.setZoom(12);
getZoom()
获取当前缩放级别。
getZoom(): number
返回值:
- 当前缩放级别
示例:
const zoom = engine.getZoom();
console.log(zoom); // 12
setRotation()
设置旋转角度。
setRotation(rotation: number): void
参数:
rotation- 旋转角度(弧度)
示例:
engine.setRotation(Math.PI / 4); // 45度
getRotation()
获取当前旋转角度。
getRotation(): number
返回值:
- 当前旋转角度(弧度)
示例:
const rotation = engine.getRotation();
console.log(rotation * 180 / Math.PI); // 转换为度
resetRotation()
重置旋转角度为 0。
resetRotation(): void
示例:
engine.resetRotation();
动画
flyTo()
平滑飞行到指定位置和缩放级别。
flyTo(
lon: number,
lat: number,
zoom?: number,
options?: FlyToAnimationOptions
): void
参数:
lon- 目标经度lat- 目标纬度zoom- 目标缩放级别(可选,默认保持当前缩放)options- 动画选项(可选)
FlyToAnimationOptions:
interface FlyToAnimationOptions {
duration?: number; // 动画时长(毫秒),默认自动计算
maxDuration?: number; // 最大时长(毫秒),默认 3000
easing?: (t: number) => number; // 缓动函数
}
示例:
// 飞到上海,缩放到 12 级
engine.flyTo(121.4737, 31.2304, 12);
// 自定义动画时长
engine.flyTo(121.4737, 31.2304, 12, {
duration: 2000,
});
// 只改变位置,保持当前缩放
engine.flyTo(113.2644, 23.1291);
fitBounds()
自动适配到指定边界。
fitBounds(
bounds: {
minLon: number;
minLat: number;
maxLon: number;
maxLat: number;
},
options?: FlyToAnimationOptions & { padding?: number }
): void
参数:
bounds- 边界对象options- 动画选项(可选)padding- 边界填充(像素),默认 50
示例:
// 适配中国边界
engine.fitBounds({
minLon: 73.5,
minLat: 18.2,
maxLon: 135.0,
maxLat: 53.5
});
// 自定义填充和动画时长
engine.fitBounds(
{
minLon: 110,
minLat: 30,
maxLon: 120,
maxLat: 40
},
{
padding: 100,
duration: 1500,
}
);
设备像素比
getDevicePixelRatio()
获取设备像素比。
getDevicePixelRatio(): number
返回值:
- 设备像素比
示例:
const dpr = engine.getDevicePixelRatio();
console.log(dpr); // 1, 2, 或 3
setDevicePixelRatio()
设置设备像素比。
setDevicePixelRatio(dpr: number): void
参数:
dpr- 设备像素比
示例:
engine.setDevicePixelRatio(2);
事件系统
on()
添加事件监听器。
on<K extends keyof MapEventMap>(
eventName: K,
listener: (event: MapEventMap[K]) => void
): () => void
参数:
eventName- 事件名称('click' 或 'mousemove')listener- 事件处理函数
返回值:
- 移除监听器的函数
示例:
// 添加监听器
engine.on('click', (event) => {
console.log('点击:', event.lon, event.lat);
});
// 使用返回的函数移除监听器
const removeListener = engine.on('click', (event) => {
console.log('点击:', event.lon, event.lat);
});
removeListener();
once()
添加一次性事件监听器。
once<K extends keyof MapEventMap>(
eventName: K,
listener: (event: MapEventMap[K]) => void
): () => void
参数:
eventName- 事件名称listener- 事件处理函数
返回值:
- 移除监听器的函数
示例:
engine.once('click', (event) => {
console.log('第一次点击:', event.lon, event.lat);
});
off()
移除事件监听器。
off<K extends keyof MapEventMap>(
eventName: K,
listener: (event: MapEventMap[K]) => void
): void
参数:
eventName- 事件名称listener- 要移除的事件处理函数
示例:
const handler = (event) => {
console.log('点击:', event.lon, event.lat);
};
engine.on('click', handler);
engine.off('click', handler);
removeAllListeners()
移除所有事件监听器。
removeAllListeners<K extends keyof MapEventMap>(eventName?: K): void
参数:
eventName- 事件名称(可选)
示例:
// 移除指定事件的所有监听器
engine.removeAllListeners('click');
// 移除所有事件的所有监听器
engine.removeAllListeners();
销毁
destroy()
销毁地图引擎,释放资源。
destroy(): void
示例:
engine.destroy();
完整示例
import { MapEngine, TileLayer, VectorLayer } from 'mapjar';
// 创建地图引擎
const engine = new MapEngine('#map', {
center: [116.4074, 39.9042],
zoom: 10,
enableRotation: true,
});
// 添加瓦片图层
const tileLayer = new TileLayer(
'osm',
'https://tile.openstreetmap.org/{z}/{x}/{y}.png'
);
engine.addLayer(tileLayer);
// 添加矢量图层
const vectorLayer = new VectorLayer('vector', {
fillColor: [0.2, 0.6, 1.0, 0.4],
strokeColor: [0.0, 0.4, 0.8, 1.0],
});
engine.addLayer(vectorLayer);
// 监听点击事件
engine.on('click', (event) => {
console.log(`点击位置: ${event.lon.toFixed(4)}, ${event.lat.toFixed(4)}`);
// 添加标记
vectorLayer.addFeature({
type: 'point',
coordinates: [event.lon, event.lat],
properties: { name: '标记' }
});
});
// 飞到上海
setTimeout(() => {
engine.flyTo(121.4737, 31.2304, 12, { duration: 2000 });
}, 2000);
// 清理
// engine.destroy();
下一步
- Camera API - 查看相机系统的完整 API
- 图层 API - 查看图层系统的完整 API