跳到主要内容

图层系统

图层(Layer)是 Mapjar 中组织和渲染地图内容的基本单位。每个图层负责渲染特定类型的数据。

图层类型

Mapjar 提供以下图层类型:

图层类型用途示例
TileLayer瓦片地图OSM、Google Maps
VectorLayer矢量要素点、线、面
GeoJSONLayerGeoJSON 数据行政区划、POI
ImageLayer单张图像历史地图、卫星影像
WindLayer风场动画风速、洋流
HeatmapLayer热力图温度、降水
OverlayLayerHTML 覆盖层标注、弹窗
CanvasLayer自定义绘制特殊效果

图层管理

添加图层

import { TileLayer } from 'mapjar';

const tileLayer = new TileLayer(
'osm', // 图层 ID(唯一)
'https://tile.openstreetmap.org/{z}/{x}/{y}.png'
);

engine.addLayer(tileLayer);

获取图层

const layer = engine.getLayer('osm');
if (layer) {
console.log('找到图层:', layer.getId());
}

移除图层

engine.removeLayer('osm');

图层属性

所有图层都继承自 Layer 基类,支持以下属性:

可见性

// 设置可见性
layer.setVisible(false); // 隐藏图层
layer.setVisible(true); // 显示图层

// 获取可见性
const visible = layer.isVisible();
console.log(visible); // true 或 false

透明度

// 设置透明度(0.0 - 1.0)
layer.setOpacity(0.5); // 半透明

// 获取透明度
const opacity = layer.getOpacity();
console.log(opacity); // 0.5

层级(Z-Index)

// 设置层级(数值越大越靠上)
layer.setZIndex(10);

// 获取层级
const zIndex = layer.getZIndex();
console.log(zIndex); // 10

图层按 Z-Index 从小到大渲染,Z-Index 相同时按添加顺序渲染。

设备像素比

// 设置设备像素比(用于高 DPI 屏幕)
layer.setDevicePixelRatio(2);

// 获取设备像素比
const dpr = layer.getDevicePixelRatio();
console.log(dpr); // 2

图层渲染顺序

图层的渲染顺序由 Z-Index 决定:

const baseLayer = new TileLayer('base', 'https://...'); // Z-Index: 0 (默认)
const vectorLayer = new VectorLayer('vector'); // Z-Index: 0 (默认)
const overlayLayer = new OverlayLayer('overlay'); // Z-Index: 0 (默认)

// 设置渲染顺序
baseLayer.setZIndex(0); // 底层
vectorLayer.setZIndex(10); // 中层
overlayLayer.setZIndex(20); // 顶层

engine.addLayer(baseLayer);
engine.addLayer(vectorLayer);
engine.addLayer(overlayLayer);

图层分类

栅格图层

栅格图层渲染基于像素的图像数据:

  • TileLayer:瓦片地图
  • ImageLayer:单张图像
  • HeatmapLayer:热力图
import { TileLayer, ImageLayer, HeatmapLayer } from 'mapjar';

// 瓦片图层
const tileLayer = new TileLayer('osm', 'https://...');

// 图像图层
const imageLayer = new ImageLayer('historical', {
url: 'https://example.com/map.png',
bounds: {
minLon: 116.2,
minLat: 39.8,
maxLon: 116.6,
maxLat: 40.1,
},
});

// 热力图层
const heatmapLayer = new HeatmapLayer('temperature', {
colorRamp: ['#0000FF', '#00FF00', '#FF0000'],
});

矢量图层

矢量图层渲染基于几何的要素数据:

  • VectorLayer:点、线、面要素
  • GeoJSONLayer:GeoJSON 格式数据
import { VectorLayer, GeoJSONLayer } from 'mapjar';

// 矢量图层
const vectorLayer = new VectorLayer('vector', {
fillColor: [0.2, 0.6, 1.0, 0.4],
strokeColor: [0.0, 0.4, 0.8, 1.0],
strokeWidth: 2.0,
});

// GeoJSON 图层
const geoJSONLayer = new GeoJSONLayer('geojson', {
url: 'https://example.com/data.geojson',
});

特效图层

特效图层提供动态可视化效果:

  • WindLayer:风场粒子动画
  • CanvasLayer:自定义 Canvas 绘制
import { WindLayer, CanvasLayer } from 'mapjar';

// 风场图层
const windLayer = new WindLayer('wind', {
particleCount: 5000,
speedFactor: 0.5,
});

// 自定义 Canvas 图层
class MyCanvasLayer extends CanvasLayer {
render(gl, viewMatrix) {
const ctx = this.getContext();
ctx.fillStyle = 'red';
ctx.fillRect(100, 100, 200, 200);
}
}

覆盖层

覆盖层在地图上叠加 HTML 元素:

  • OverlayLayer:HTML 元素覆盖层
import { OverlayLayer } from 'mapjar';

const overlayLayer = new OverlayLayer('overlays');

const element = document.createElement('div');
element.innerHTML = '<h3>北京</h3>';

overlayLayer.addOverlay({
id: 'beijing',
element: element,
position: {
lon: 116.4074,
lat: 39.9042,
},
});

图层组合示例

import { 
MapEngine,
TileLayer,
VectorLayer,
GeoJSONLayer,
OverlayLayer
} from 'mapjar';

const engine = new MapEngine('#map', {
center: [116.4074, 39.9042],
zoom: 10,
});

// 1. 底图(Z-Index: 0)
const baseLayer = new TileLayer(
'base',
'https://tile.openstreetmap.org/{z}/{x}/{y}.png'
);
baseLayer.setZIndex(0);
engine.addLayer(baseLayer);

// 2. GeoJSON 图层(Z-Index: 10)
const geoJSONLayer = new GeoJSONLayer('districts', {
url: 'https://example.com/districts.geojson',
style: {
fillColor: [0.2, 0.6, 1.0, 0.3],
strokeColor: [0.0, 0.4, 0.8, 1.0],
strokeWidth: 2.0,
},
});
geoJSONLayer.setZIndex(10);
engine.addLayer(geoJSONLayer);

// 3. 矢量图层(Z-Index: 20)
const vectorLayer = new VectorLayer('poi', {
pointSize: 12.0,
fillColor: [1.0, 0.0, 0.0, 1.0],
});
vectorLayer.setZIndex(20);
engine.addLayer(vectorLayer);

// 4. 覆盖层(Z-Index: 30)
const overlayLayer = new OverlayLayer('labels');
overlayLayer.setZIndex(30);
engine.addLayer(overlayLayer);

图层性能优化

1. 合理使用图层数量

  • 避免创建过多图层(建议 < 20 个)
  • 相同类型的数据尽量放在同一图层

2. 控制要素数量

  • 矢量图层建议 < 10000 个要素
  • 使用空间查询过滤不可见要素

3. 按需加载

  • 使用 setVisible(false) 隐藏不需要的图层
  • 动态添加/移除图层

4. 优化渲染

  • 设置合适的 Z-Index,减少重绘
  • 使用批量渲染(VectorLayer 自动支持)

下一步