Jinuss's blog Jinuss's blog
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

东流

前端可视化
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 框架

  • core模块

  • dom模块

  • control

  • geometry

  • geo

  • layer

    • marker

    • tile

    • vector

      • Renderer
      • Canvas
      • Path
      • Polyline
      • Polygon
      • Rectangle
      • Render.getRenderer
        • 概述
        • 源码分析
          • 源码实现
          • 源码解析
          • getRenderer(layer)方法
          • _getPaneRenderer(name)方法
          • _createRenderer(options)方法
          • 设计思想
        • 总结
      • SVG
      • SVG.Util
      • SVG.VML
      • CircleMarker
      • Circle
    • Layer
    • LayerGroup
    • FeatureGroup
    • DivOverlay
    • Popup
    • Tooltip
    • ImageOverlay
    • SVGOverlay
    • VideoOverlay
    • GeoJSON
  • Map

  • 《Leaflet源码》笔记
  • layer
  • vector
东流
2025-04-15
目录

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

# 源码解析

Renderer.getRenderer本质上就是通过Map类的includes方法对Map基类进行扩展,主要实现了如下三个方法:

  1. getRenderer(layer):主入口,确定并返回用于渲染指定layer的渲染器实例
  2. _getPaneRenderer(name):根据窗格的pane名称获取对应的渲染器实例
  3. _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
Rectangle
SVG

← Rectangle SVG→

最近更新
01
GeoJSON
05-08
02
Circle
04-15
03
CircleMarker
04-15
更多文章>
Theme by Vdoing | Copyright © 2024-2025 东流 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式