leaflet中如何通过透明度控制layerGroup的显示隐藏

降级狂
• 阅读 1892

最近在leaflet开发过程中,遇到地图数据需要按时序播放的需求,处理思路是将每个时间节点的要素添加到layerGroup中,然后通过切换layerGroup的显示隐藏来实现效果。翻看leaflet的API文档,发现leaflet中没有直接控制layerGroup显示隐藏的方法,那如何来实现layerGroup的显示和隐藏呢?

通常有如下两种思路:

第一种,通过map.addLayer()map.removeLayer()添加、移除图层组的方式来实现,当数据量较小,并且不需要频繁切换图层显示隐藏时,使用这种方式较为方便。但是,当数据量较大,或需要频繁切换图层显示隐藏时,使用这种方式则会增加对浏览器的压力,出现卡顿现象。

第二种,遍历图层内部所有要素,通过控制要素透明度的方式,达到控制图层显示隐藏的目的。此方式可以解决在数据量较大,或需要频繁切换图层显示隐藏时,出现卡顿的情况,效果如下:

leaflet中如何通过透明度控制layerGroup的显示隐藏

核心代码如下:

leaflet中如何通过透明度控制layerGroup的显示隐藏

从上面代码中我们可以看出,由于maker要素 和 vector要素样式控制方式不同,需放在两个图层组,这样写起来感觉还是有些繁琐,而且也没有考虑图层初始化时样式。

通过对leaflet源码研究,了解到leaflet可以使用 include 方式对方法进行重写来做到修改源码。

include方式

通过例子了解一下:比如leaflet源码中 Polygon.toGeoJSON() 方法不是在 Polygon.js 文件中写的,而是用 include 方式写在了GeoJSON.js文件中。Polygon类本来是没有toGeoJSON()方法的,这样就增加了这个方法。如果Polygon类中已经有了toGeoJSON()方法,这样写会根据执行的顺序,后执行的会把先加载的重写。

leaflet中如何通过透明度控制layerGroup的显示隐藏

接下来,就采用include方式对layerGroup添加显示隐藏方法。在这里,我们不仅控制了layerGroup的显示隐藏,还记录了layerGroup中要素默认状态下的透明度,以保证切换到显示时样式一致。

代码如下:

leaflet中如何通过透明度控制layerGroup的显示隐藏

为方便使用,我们将上述代码封装成插件,只需引用这个插件,调用showLayer()hideLayer()就能实现对 layerGroup 中所有要素的显示隐藏控制。

看使用插件后的代码是不是很清爽。

leaflet中如何通过透明度控制layerGroup的显示隐藏

总结

  1. 控制layerGroup显示隐藏的方式有两种:添加、移除的方式;和遍历内部要素,控制每个要素透明度的方式。
  2. 控制透明度方式效率更高,体验更好,但leaflet中没有现成方法,需要自己写代码实现。
  3. 实现时需要注意,maker要素 和 vector要素样式控制方式不同。
  4. 把控制透明度方式封装成插件,通过showLayer()hideLayer()方法直接使用。

在线示例

在线示例

ShowHideLayerGroup.js 插件


原文地址:http://gisarmory.xyz/blog/index.html?blog=LeafletShowHideLayerGroup

关注《GIS兵器库》公众号, 第一时间获得更多高质量GIS文章。

leaflet中如何通过透明度控制layerGroup的显示隐藏

本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名《GIS兵器库》(包含链接: http://gisarmory.xyz/blog/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
vue 实现 leaflet的测绘,测距,测面
参考1:https://blog.csdn.net/lonly\_maple/article/details/83658608参考2:https://blog.csdn.net/xtfge0915/article/details/80275094\_60前提:vue项目在安装leaflet的基础上 cnpminstallleafletdra
Johnny21 Johnny21
4年前
MySQL8.0和MySQL5.7的区别
隐藏索引在8.0中,索引可以隐藏。隐藏索引对性能调试非常重要,索引可以被隐藏和显示,当一个索引隐藏时,不会被查询优化器所使用。隐藏一个索引,然后观察数据库性能是否下降,如果下降,说明该索引有效,否则无效,可以删除。隐藏索引语法:ALTERTABLEtALTERINDEXiINVISIBLE恢复索引语法:AL
lucien-ma lucien-ma
4年前
Java封装详解,通俗易懂
封装什么是封装?封装是指将类的属性隐藏在内部,外部不能直接访问和修改,必须通过类提供的方法来完成属性的访问和修改。封装的核心思想就是尽可能把属性都隐藏在内部,对外提供方法来访问,我们可以在这些方法中田间逻辑处理来实现过滤,以屏蔽错误的数据的赋值。封装的步骤1.修改属性的访问权限,使得外部不能直接访问2.提供外部可以直接调用的方法3.在方法中加入属性
Stella981 Stella981
3年前
Django之Django模板
1、问:html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2012082616:00:00,但是页面显示的却是Aug.26,2012,4p.m.答:为了页面和数据库中显示一致,需要在页面格式化时间,需要添加<td{{dayrecord.p\_time|date:
Stella981 Stella981
3年前
Photoshop键盘快捷键&nbsp;&nbsp;&nbsp;操作更方便
使用快捷键快速操作.F1帮助F2剪切F3拷贝F4粘贴F5隐藏/显示画笔面板F6隐藏/显示颜色面板F7隐藏/显示图层面板F8隐藏/显示信息面板F9隐藏/显示动作面板F12恢复ShiftF5填充ShiftF6羽化ShiftF7选择→反选Ctrlh隐藏选定区域Ctrld取消选定区域C
Stella981 Stella981
3年前
LeafLet 简单使用
Leaflet使用最近在Angular项目中,用到了地图,由于种种原因放弃了百度地图api使用,最后选择了leaflet,简单介绍一下。介绍:Leaflet是一个为移动设备设计的交互式地图的开源的javascript库,并只有38k,包含了大多数开发者需要的地图特点。准备:下载leaflet文件
Wesley13 Wesley13
3年前
# pc端个性化日历实现
pc端个性化日历实现技术:vuevfor、slotscop插槽域需求:需要实现日历上每一天动态显示不同的信息思路:运用vue中slotscop插槽域的知识点,将个性化的代码样式放到slot中再通过slotscop获取这个插槽中的所需数据一、实现日历组件
Stella981 Stella981
3年前
CSS 分类 (Classification)
★★CSS分类属性(Classification)★★⑴CSS分类属性允许你控制如何显示元素,设置图像显示于另一元素中的何处,相对于其正常位置来定位元素,使用绝对值来定位元素,以及元素的可见度。⑵下面是常用的属性以及描述:!(https://oscimg.oschina.net/oscnet/00cb565
陈杨 陈杨
2个月前
鸿蒙5莓创图表饼图title属性用法详解
大家好,欢迎回来鸿蒙5莓创图表组件的专场,我们这一期来讲解组合图组件中title属性的深度用法,带大家掌握标题模块的完整配置技巧!一、show属性作用:控制标题模块的显示与隐藏类型:Boolean默认值:true可选值:true(显示标题)、false(隐
陈杨 陈杨
2个月前
鸿蒙5莓创折线与柱状图legend属性详解
大家好,欢迎回来鸿蒙5莓创图表组件的专场,我们这一期来讲解组合图组件McLineBarChart中legend属性的详细用法。1.show属性作用:控制是否显示图例类型:Boolean默认值:true可选值:true|false场景:当需要隐藏图例时设置为
鸿蒙小林 鸿蒙小林
2个月前
《仿盒马》app开发技术分享-- 首页活动配置(5)
技术栈Appgalleryconnect开发准备上一篇文章中我们实现了项目端云一体化首页部分模块动态配置,实现了对模块模块的后端控制显示和隐藏,这能让我们的app更加的灵活,也能应对更多的情况。现在我们来对配置模块进行完善,除了已有的模块以外,我们还有一些