Render.getRenderer
# 概述
Renderer.getRenderer
在Leaflet中用于获取地图渲染器,实现了地图如何动态选择和管理矢量图形的渲染器Renderer
,确保每个路径(Path
)使用合适的渲染方式(SVG或Canvas)。
# 源码分析
# 源码实现
Renderer.getRenderer
的源码实现如下:
Map.include({
getRenderer: function (layer) {
var renderer =
layer.options.renderer || // 图层选项中的渲染器
this._getPaneRenderer(layer.options.pane) || // 窗格渲染器
this.options.renderer || // 地图选项中默认的渲染器
this._renderer;// 当前地图实例的默认渲染器
if (!renderer) {
renderer = this._renderer = this._createRenderer();
}
if (!this.hasLayer(renderer)) {
this.addLayer(renderer);
}
return renderer;
},
_getPaneRenderer: function (name) {
if (name === "overlayPane" || name == undefined) {
return false; //默认窗格不创建专用渲染器
}
var renderer = this._paneREnderers[name];
if (renderer === undefined) {
renderer = this._createRenderer({ pane: name }); // 创建并缓存
this._paneRenderers[name] = renderer;
}
return renderer;
},
_createRenderer: function (options) {
return (this.options.preferCanvas && canvas(options)) || svg(options);
},
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 源码解析
Renderer.getRenderer
本质上就是通过Map
类的includes
方法对Map
基类进行扩展,主要实现了如下三个方法:
getRenderer(layer)
:主入口,确定并返回用于渲染指定layer
的渲染器实例_getPaneRenderer(name)
:根据窗格的pane
名称获取对应的渲染器实例_createRenderer(options)
:根据地图选项创建新的渲染器实例
# getRenderer(layer)
方法
1.确定渲染器来源
- 优先级顺序:路径选项 > 窗格关联 > 地图选项 > 地图当前实例
- 设计意图:允许通过不同层级(图层/路径、窗格、地图)控制渲染方式
2.创建默认渲染器
- 触发条件:当所有来源均未找到有效渲染器时
- 结果:调用
_createRenderer()
创建新实例,并缓存到this._renderer
3.确保渲染器已添加到地图
- 必要性:渲染器本身是
Layer
子类,需添加到地图才能生效 - 自动管理:避免手动处理渲染器的添加
# _getPaneRenderer(name)
方法
1.条件过滤
overlayPane
:Leaflet默认的矢量图层窗格,共用地图猪渲染器- 其他窗格:根据
name
创建专用渲染器
2.缓存管理
- 缓存策略:
this._paneRenderers
对象存储已创建的渲染器实例 - 设计意图:避免重复创建相同窗格的渲染器,提高性能
# _createRenderer(options)
方法
1.选择渲染器类型
- 条件判断:优先选择
canvas
渲染器,否则使用svg
- 设计思想:
canvas
渲染器通常更高效,svg
渲染器更灵活 2.创建渲染器实例 - 调用
canvas(options)
或svg(options)
创建新实例 - 设计意图:通过
options
参数控制渲染器的配置
# 设计思想
灵活性 允许通过路径、窗格、地图选项多级控制渲染方式,适应不同场景需求。
自动化管理 自动创建并添加渲染器,减少开发者负担。
性能优化
- 优先使用 Canvas 提升渲染性能(适合大量动态路径)。
- 为不同窗格分配独立渲染器,避免相互影响。
兼容性 通过工厂函数 svg() 处理 VML 降级,支持旧版 IE
# 总结
Render.getRenderer
允许根据路径的选项、所在窗格、地图的选项等因素,动态选择或创建合适的渲染器实例,并确保该渲染器已添加到地图中。这样,每个路径都能使用正确的渲染器进行绘制,同时允许通过选项灵活控制渲染方式。
编辑 (opens new window)
上次更新: 2025/05/12, 07:40:30