源码分析之Leaflet中的LayerGroup
概述
LayerGroup
是一个图层组,通过继承Layer
基类,提供了一种管理多个图层(如标记、多边形等)的容器机制,比如地图的添加/移除操作等。
源码分析
源码实现
LayerGroup
的源码实现如下:
export var LayerGroup = Layer.extend({initialize:function(layers,options){Util.setOptions(this,options);this._layers={};var i,len;if(layers){for(i=0,len=layers.length;i<len;i++){this.addLayer(layers[i])}}},addLayer:function(layer){var id= this.getLayerId(layer);this._layers[id]=layer;if(this._map){this._map.addLayer(layer)}return this;},removeLayer:function(layer){var id = layer in this._layers ? layer :this.getLayerId(layer);if(this._map && this._layers[id]){this._map.removeLayer(this._layers[id])}delete this._layers[id];return this;},hasLayer:function(layer){var layerId = typeof layer === 'number' ? layer:this.getLayerId(layer);return layerId in this._layers;},clearLayers:function(){return this.eachLayer(this.removeLayer,this)},invoke:function(methodName){var args = Array.prototype.slice.call(argument,1),i,layer;for(i in this._layers){layer =this._layers[i];if(layer[methodName]){layer[methodName].apply(layer,args);}}return this;},onAdd:function(map){this.eachLayer(map.addLayer,map)},onRemove:function(map){this.eachLayer(map.removeLayer,map)},eachLayer:function(method,context){for(var i in this._layers){method.call(context,this._layers[i])}return this;},getLayer:function(id){return this._layers[id]},getLayers:function(){var layers = [];this.eachLayer(layers.push,layers);return layers},setZIndex:function(zIndex){return this.invoke('setZIndex',zIndex)},getLayerId:function(layer){return Util.stamp(layer)},
})export var layerGroup=function(layers,options){return new LayerGroup(layers,options)
}
源码解析
1.类定义与继承
-
继承:
LayerGroup
继承自Layer
,意味着LayerGroup
具有Layer
的所有属性和方法,本身也是一个图层,但其主要职责是负责管理子图层。 -
工厂函数:
LayerGroup
函数提供了创建实例的快捷方式
2.初始化方法initialize
-
选项处理:
Util.setOptions
将options
合并到实例属性中。 -
图层存储:
_layers
是一个对象,以键值对形式存储子图层,键是图层ID
(通过Util.stamp
生成) -
初始图层添加:如果传入
layers
数组,则遍历并调用addLayer
逐个添加
3.核心方法解析
-
addLayer(layer)
:- 生成唯一ID:通过
getLayerId
(内部调用Util.stamp
)为图层生成唯一标识 - 存储图层:将图层存入
_layers
对象 - 自动添加到地图:如果当前
LayerGroup
已添加到地图,则子图层也会立即加入地图
- 生成唯一ID:通过
-
removeLayer(layer)
:- 查找图层:通过
getLayerId
查找图层 - 从地图移除:如果当前
LayerGroup
已添加到地图,则子图层也会立即从地图移除 - 删除存储:从
_layers
中删除图层
- 查找图层:通过
-
hasLayer(layer)
:- 查找图层:通过
getLayerId
查找图层 - 返回存在性:返回
true
或false
- 查找图层:通过
-
clearLayers()
:- 遍历移除:调用
eachLayer
遍历所有子图层,调用removeLayer
逐个移除
- 遍历移除:调用
4.批量操作
-
invoke(methodName, ...args)
:- 批量调用:遍历所有子图层,调用指定方法(如
setZIndex
),并传递参数 - 返回
this
:支持链式调用
- 批量调用:遍历所有子图层,调用指定方法(如
-
eachLayer(method,context)
:- 遍历执行:遍历所有子图层,执行指定方法,可传递上下文
5.地图生命周期钩子
onAdd(map)
与onRemove(map)
- 自动代理子图层:当
LayerGroup
添加到地图时,会自动调用子图层的addLayer
方法,移除时调用removeLayer
方法
- 自动代理子图层:当
6.辅助方法
-
getLayer(id)
与getLayers()
- 按ID获取图层:直接通过ID查找
- 获取全部图层数组:利用
eachLayer
将对象形式的图层转换为数组
-
setZIndex(zIndex)
- 批量设置ZIndex:调用
invoke
批量设置子图层的ZIndex
- 批量设置ZIndex:调用
7.工具方法getLayerId
- 生成唯一ID:内部调用
Util.stamp
,确保每个图层都有唯一的ID
设计思想
1.组合模式:LayerGroup
本身是Layer
,同时管理多个子图层,形成树形结构
2.代理机制:通过重写onAdd
/onRemove
,自动管理子图层的地图添加/移除
3.批量操作:提供invoke
和eachLayer
实现高效批量控制
4.ID管理:利用Util.stamp
确保图层唯一标识,避免冲突
总结
LayerGroup
的核心就是维护一个图层集合,并代理这些图层的方法调用,通过组合模式,可以方便批量操作多个图层,提升代码复用性和易用性。
相关文章:
源码分析之Leaflet中的LayerGroup
概述 LayerGroup是一个图层组,通过继承Layer基类,提供了一种管理多个图层(如标记、多边形等)的容器机制,比如地图的添加/移除操作等。 源码分析 源码实现 LayerGroup的源码实现如下: export var Layer…...

小芯片大战略:Chiplet技术如何重构全球半导体竞争格局?
在科技飞速发展的今天,半导体行业作为信息技术的核心领域之一,其发展速度和创新水平对全球经济的发展具有举足轻重的影响。然而,随着芯片制造工艺的不断进步,传统的单片集成方式逐渐遇到了技术瓶颈,如摩尔定律逐渐逼近…...

普通IT的股票交易成长史--股价起伏的真相-缺口(2)
声明:本文章的内容只是自己学习的总结,不构成投资建议。价格行为理论学习可参考简介中的几位,感谢他们的无私奉献。 送给自己的话: 仓位就是生命,绝对不能满仓!!!!&…...

MindSpore框架学习项目-ResNet药物分类-模型优化
目录 5.模型优化 5.1模型优化 6.结语 参考内容: 昇思MindSpore | 全场景AI框架 | 昇思MindSpore社区官网 华为自研的国产AI框架,训推一体,支持动态图、静态图,全场景适用,有着不错的生态 本项目可以在华为云modelar…...
基于阿里云DataWorks的物流履约时效离线分析
基于阿里云DataWorks的物流履约时效离线分析2. 数仓模型构建 ORC和Parquet区别: 压缩率与查询性能 压缩率 ORC通常压缩率更高,文件体积更小,适合存储成本敏感的场景。 Parquet因支持更灵活的嵌套结构,压缩率略…...

Kubernetes(k8s)学习笔记(八)--KubeSphere定制化安装
1执行下面的命令修改上一篇中yaml文件来实现定制化安装devops kubectl edit cm -n kubesphere-system ks-installer 主要是将devops几个配置由False改为True 然后使用下面的命令查看安装日志 kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l …...

养生:为健康生活筑牢根基
养生并非遥不可及的目标,而是贯穿于日常生活的点滴之中。从饮食、运动到心态调节,每一个环节都对我们的健康有着重要意义。以下为你详细介绍养生的实用策略,助力你开启健康生活模式。 饮食养生:科学搭配,滋养生命 合…...

Linux510 ssh服务 ssh连接
arning: Permanently added ‘11.1.1.100’ (ECDSA) to the list of known hosts. rooot11.1.1.100’s password: Permission denied, please try again. rooot11.1.1.100’s password: Permission denied, please try again 还没生效 登不上了 失效了 sshcaozx26成功登录 …...

关键点检测--使用YOLOv8对Leeds Sports Pose(LSP)关键点检测
目录 1. Leeds Sports Pose数据集下载2. 数据集处理2.1 获取标签2.2 将图像文件和标签文件处理成YOLO能使用的格式 3. 用YOLOv8进行训练3.1 训练3.2 预测 1. Leeds Sports Pose数据集下载 从kaggle官网下载这个数据集,地址为link,下载好的数据集文件如下…...
Elasticsearch内存管理与JVM优化:原理剖析与最佳实践
#作者:孙德新 文章目录 一、Elasticsearch缓存分类1、Node Query Cache:2、Shard Request Cache:3、Fielddata Cache: 三、内存常见的问题案例一案例二案例三案例四 四、内参分配最佳实践1、jvm heap分配2、将机器上少于一半的内…...

独立按键控制LED
目录 1.独立按键介绍 2.原理图 3.C51数据运输 解释:<< >> 编辑 解释:& | 解释:^ ~ 编辑 4.C51基本语句 5.按键的跳动 6.独立按键控制LED亮灭代码 第一步: 第二步: 第三步࿱…...

计算机科技笔记: 容错计算机设计03 系统可信性的度量 偶发故障期 浴盆曲线 韦布尔分布
可靠性 简化表达式 偶发故障期,系统发生故障概率趋近于一个常数 浴盆曲线 MTTF和计算 韦布尔分布 马尔可夫链 可靠度...

爬虫准备前工作
1.Pycham的下载 网址:PyCharm: The only Python IDE you need 2.Python的下载 网址:python.org(python3.9版本之后都可以) 3.node.js的下载 网址:Node.js — 在任何地方运行 JavaScript(版本使用18就可…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】7.1 主流可视化工具对比(Tableau/Matplotlib/Python库)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 第七章 可视化工具集成:Tableau、Matplotlib与Python库深度对比7.1 主流可视化工具对比:技术选型的决策框架7.1.1 工具定位与核心能力矩阵7.1.2 数据…...

操作系统实验习题解析 上篇
孤村落日残霞,轻烟老树寒鸦,一点飞鸿影下。 青山绿水,白草红叶黄花。 ————《天净沙秋》 白朴 【元】 目录 实验一: 代码: 解析: 运行结果: 实验二: 代码解析 1. 类设计 …...
复习javascript
1.修改元素内的内容 <div>zsgh</div> <script> const box1document.querySelector("div") box1.innerText"ppp" box1.innerHtml<h1>修改</h1> </script> 2.随机点名练习 <!DOCTYPE html> <html lang…...

基于Arduino Nano的DIY示波器
基于Arduino Nano的DIY示波器:打造属于你的口袋实验室 前言 在电子爱好者的世界里,示波器是不可或缺的工具之一。它能够帮助我们观察和分析各种电子信号的波形,从而更好地理解和调试电路。然而,市面上的示波器价格往往较高&…...

渠道销售简历模板范文
模板信息 简历范文名称:渠道销售简历模板范文,所属行业:其他 | 职位,模板编号:KRZ3J3 专业的个人简历模板,逻辑清晰,排版简洁美观,让你的个人简历显得更专业,找到好工作…...

JAVA练习题(1) 卖飞机票
import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scnew Scanner(System.in);System.out.println("请输入飞机的票价:");int pricesc.nextInt();System.out.println("请输入月份:");…...

杆件的拉伸与压缩变形
杆件的拉伸与压缩 第一题 Q u e s t i o n \mathcal{Question} Question 图示拉杆沿斜截面 m − m m-m m−m由两部分胶合而成。设在胶合面上许用拉应力 [ σ ] 100 MPa [\sigma]100\text{MPa} [σ]100MPa,许用切应力 [ τ ] 50 MPa [\tau]50\text{MPa} [τ]50MP…...
深入解析Vue3中ref与reactive的区别及源码实现
深入解析Vue3中ref与reactive的区别及源码实现 前言 Vue3带来了全新的响应式系统,其中ref和reactive是最常用的两个API。本文将从基础使用、核心区别到源码实现,由浅入深地分析这两个API。 一、基础使用 1. ref import { ref } from vueconst count…...
Makefile中 链接库,同一个库的静态库与动态库都链接了,生效的是哪个库
Makefile中 链接库,同一个库的静态库与动态库都链接了,生效的是哪个库 在 Makefile 中同时链接同一个库的静态库(.a)和动态库(.so)时,具体哪个库生效取决于链接顺序和编译器行为。以下是详细分析…...

企业开发平台大变革:AI 代理 + 平台工程重构数字化转型路径
在企业数字化转型的浪潮中,开发平台正经历着前所未有的技术革命。从 AST(抽象语法树)到 AI 驱动的智能开发,从微服务架构到信创适配,这场变革不仅重塑了软件开发的底层逻辑,更催生了全新的生产力范式。本文…...

《汽车噪声控制》复习重点
题型 选择 填空 分析 计算 第一章 噪声定义 不需要的声音,妨碍正常工作、学习、生活,危害身体健康的声音,统称为噪声 噪声污染 与大气污染、水污染并称现代社会三大公害 声波基本概念 定义 媒质质点的机械振动由近及远传播&am…...

Linux——MySQL约束与查询
表的约束 真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合 法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。 表的约束是为了防止插入不合法的…...

Asp.Net Core IIS发布后PUT、DELETE请求错误405
一、方案1 1、IIS管理器,处理程序映射。 2、找到aspNetCore,双击。点击请求限制...按钮,并在谓词选项卡上,添加两者DELETE和PUT. 二、方案2 打开web.config文件,添加<remove name"WebDAVModule" />&…...

STL-to-ASCII-Generator 实用教程
参阅:STL-to-ASCII-Generator 使用教程 开源项目网址 下载 STL-to-ASCII-Generator-main.zip 解压到 D:\js\ index.html 如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta id"ascii&q…...
关于数据库查询速度优化
本人接手了一个关于项目没有任何文档信息的代码,代码也没有相关文档说明信息!所以在做数据库查询优化的时候不敢改动。 原因1: 老板需要我做一个首页的统计查询。明明才几十万条数据,而且我加了筛选条件为什么会这么慢ÿ…...
sql serve 多表联合查询,根据一个表字段值动态改变查询条件
在SQL Server中进行多表联合查询时,如果需要根据一个表的字段值动态改变查询条件,可以采用几种不同的方法来实现这一需求。这里介绍两种常用的方法:CASE表达式和动态SQL。 方法1: 使用 CASE 表达式 这种方法适合于查询条件可以在单个SQL语句…...

巡检机器人数据处理技术的创新与实践
摘要 随着科技的飞速发展,巡检机器人在各行业中逐渐取代人工巡检,展现出高效、精准、安全等显著优势。当前,巡检机器人已从单纯的数据采集阶段迈向对采集数据进行深度分析的新阶段。本文探讨了巡检机器人替代人工巡检的现状及优势,…...