Skip to content

矢量图层

矢量图层提供 Leaflet 在地图上绘制几何图形的系统。矢量图层系统由形状类(PathPolylinePolygonCircleCircleMarkerRectangle)、渲染后端(CanvasSVG)和几何处理工具组成。

本页提供矢量图层架构的概览以及组件如何协同工作。关于各个矢量形状的详细信息,请参阅 3.4.1 页(矢量图形)。关于渲染器实现详情和绘制策略,请参阅 3.4.2 页(矢量渲染系统)。关于基于瓦片的栅格图层,请参阅 3.2 页。关于带图标的点标记,请参阅 3.3 页。

矢量图层架构

矢量图层系统围绕 Path 作为所有矢量形状的基类的层次类结构构建。架构通过 Renderer 抽象将几何定义与渲染实现分离。

矢量图层类层次结构

SVG
100%

关键架构组件

组件文件用途
Pathsrc/layer/vector/Path.js12抽象基类,提供通用样式和渲染器集成
Renderersrc/layer/vector/Renderer.js26渲染后端的抽象基类,扩展 BlanketOverlay
Canvassrc/layer/vector/Canvas.js35使用 <canvas> 元素的即时模式渲染器
SVGsrc/layer/vector/SVG.js35使用 SVG DOM 元素的保留模式渲染器

每个矢量图层定义其几何和样式选项,而渲染器处理坐标转换、裁剪和实际的绘制操作。这种分离允许相同的矢量图层使用不同的后端进行渲染。

Path 基类

Path 类 (src/layer/vector/Path.js12) 作为所有矢量覆盖物的抽象基类。它扩展 Layer 并提供通用样式选项、渲染器协调和生命周期管理。

Path 选项

选项类型默认值描述
strokeBooleantrue是否沿路径绘制描边
colorString'#3388ff'描边颜色
weightNumber3描边宽度(像素)
opacityNumber1.0描边不透明度
lineCapString'round'描边末端的形状
lineJoinString'round'描边拐角处的形状
dashArrayStringnull描边虚线模式
dashOffsetStringnull虚线模式中开始绘制前的距离
fillBooleanfalse是否用颜色填充路径
fillColorStringnull填充颜色(默认为 color
fillOpacityNumber0.2填充不透明度
fillRuleString'evenodd'如何确定形状内部
interactiveBooleantrue路径是否响应指针事件
bubblingPointerEventsBooleantrue事件是否冒泡到地图

Path 生命周期和渲染器协调

Path 类通过定义良好的生命周期与渲染器协调:

Path-渲染器交互生命周期

SVG
100%

生命周期中的关键方法:

方法位置用途
beforeAdd()src/layer/vector/Path.js78-82通过 map.getRenderer(this) 从地图获取渲染器
onAdd()src/layer/vector/Path.js84-88使用渲染器初始化路径并触发绘制
onRemove()src/layer/vector/Path.js90-92从渲染器中移除路径
_reset()src/layer/vector/Path.js134-138投影坐标并更新可视化
_clickTolerance()src/layer/vector/Path.js140-144返回点击检测容差(像素)

矢量形状类型概览

Leaflet 提供五个具体的矢量形状类。每个都扩展 Path 并添加特定于形状的几何处理。

形状类文件扩展用途
Polylinesrc/layer/vector/Polyline.js51Path连接的线段,支持多线
Polygonsrc/layer/vector/Polygon.js54Polyline带孔洞支持的闭合填充形状
Rectanglesrc/layer/vector/Rectangle.js30Polygon轴对齐的矩形边界
CircleMarkersrc/layer/vector/CircleMarker.js16Path固定像素半径的圆
Circlesrc/layer/vector/Circle.js25CircleMarker地理半径(米)

矢量形状处理管道

SVG
100%

形状处理步骤

每个矢量形状遵循以下通用处理管道:

  1. 坐标转换 - 将输入数组规范化为 LatLng 实例
  2. 投影 - 使用地图 CRS 将地理坐标转换为像素坐标
  3. 裁剪 - 移除视口边界外的部分以提高性能
  4. 简化 - 使用 Douglas-Peucker 算法减少点数(折线/多边形)
  5. 渲染 - 委托给渲染器的 _updatePoly()_updateCircle()

smoothFactor 选项(默认:1.0)控制简化的激进程度。较高的值提高性能但降低精度。

关于每个形状类的 API 和几何处理的详细信息,请参阅 3.4.1 页(矢量图形)。

渲染系统集成

矢量图层将所有绘制操作委托给 Renderer 实现。地图基于浏览器能力自动选择渲染器,或者开发者可以显式指定一个。

渲染器选择流程

SVG
100%

渲染器比较

特性CanvasSVG
绘制模式即时模式(所有图层到一个 canvas)保留模式(每个图层一个 DOM 元素)
性能大量图层(100+)时更好少量交互图层时更好
点击检测通过 _containsPoint() 手动检测原生浏览器事件
内存使用低(单个 canvas 缓冲区)较高(每个图层的 DOM 节点)
CSS 样式不适用通过 className 选项支持
DOM 集成最小化完整的 DOM 树
实现src/layer/vector/Canvas.js35src/layer/vector/SVG.js35

渲染器接口方法

两个渲染器都实现了这些 Path 调用的关键方法:

方法用途Canvas 实现SVG 实现
_initPath(layer)初始化图层结构创建设绘制顺序节点创建 <path> 元素
_addPath(layer)注册进行渲染链接到绘制列表追加到 SVG 容器
_removePath(layer)取消注册图层从绘制列表取消链接从 DOM 移除
_updatePath(layer)重绘几何触发重绘请求更新路径 d 属性
_updateStyle(layer)应用样式更改触发重绘更新 SVG 属性
_updatePoly(layer, closed)渲染折线/多边形绘制到 2D 上下文生成路径字符串
_updateCircle(layer)渲染圆形绘制弧线到上下文生成弧线路径

关于渲染器实现、绘制顺序管理和点击检测策略的详细信息,请参阅 3.4.2 页(矢量渲染系统)。

坐标系和投影流程

矢量图层在渲染期间使用多个坐标系。理解这个流程对于性能优化和正确定位至关重要。

坐标转换管道

SVG
100%

坐标系

系统类型原点用途
LatLng地理赤道/本初子午线来自用户的输入坐标
Layer Point像素地图像素原点(缩放相关)内部几何计算
Container Point像素地图容器的左上角DOM 定位(pane、覆盖层)

每个形状类中的 _project() 方法使用地图的 CRS(坐标参考系统)将地理坐标转换为图层点。然后渲染器使用这些图层点进行绘制。

投影实现示例:

// 来自 Polyline._projectLatlngs()
const ring = latlngs.map(latlng => this._map.latLngToLayerPoint(latlng));

样式和交互

矢量图层通过路径选项系统和事件处理集成支持动态样式和用户交互。

动态样式

setStyle() 方法允许运行时样式更改:

layer.setStyle({
    color: 'red',
    weight: 5,
    opacity: 0.8
});

样式更新触发特定于渲染器的更新方法,这些方法有效地应用视觉更改而无需重新创建几何数据。

图层排序

矢量图层通过 bringToFront()bringToBack() 方法支持 Z 顺序操作。实现因渲染器而异:

  • Canvas:维护绘制顺序列表并触发重绘
  • SVG:使用 toFront()/toBack() 重新排序 DOM 元素