leaflet 用自定义pane实现图层顺序调整
在 Leaflet 中,map panes 隐式地将图层组合在一起,而开发者并不知道这一点。这种分组允许 Web 浏览器以比单独处理图层更有效的方式同时处理多个图层。
Map panes 使用 z-index CSS 属性来让某些图层始终显示在其他图层之上。默认的排序是:
TileLayer
和GridLayer
Path
, 如线、折线、圆或GeoJSON
图层Marker
阴影Marker
图标Popup
这就是为什么在 Leaflet 地图中,popups 总是显示在其他层的 “上面”,markers 总是显示在瓦片图层的上面,等等。
Leaflet 1.0.0 的一个新功能(0.7.x 中没有)是自定义 map panes,它允许自定义这个顺序。
默认情况并不总是正确的
在某些特定情况下,默认顺序不是地图的正确顺序。我们可以用 Carto basemaps 底图和标签来证明这一点:

如果我们用这两个图层创建一个 Leaflet 地图,任何标记或多边形都会显示在这两个图层的上面,但是把标签放在上面看起来更好,我们怎样才能做到这一点呢?
自定义 pane
我们可以使用默认的底图瓦片(tile)和一些像 GeoJSON 图层这样的覆盖物, 然后我们必须为标签定义一个自定义窗格(pane),以便它们显示在 GeoJSON 数据之上。
自定义 map panes 是在每个地图的基础上创建的,所以首先创建一个 L.Map
的实例和 pane:
var map = L.map('map');
map.createPane('labels');
下一步是设置窗格的z-index。查看默认值为650,这将使带有标签的 TileLayer
显示在标记的上面和弹窗窗口的下面。通过使用 getPane()
,我们获得了对 HTMLElement
表示窗格的引用,并更改它的 z-index:
map.getPane('labels').style.zIndex = 650;
在其他地图层之上设置图像标签的一个问题是,这些标签会捕捉到点击和触摸事件。如果用户点击地图上的任何地方,网络浏览器会认为她点击的是标签瓦片,而不是 GeoJSON 或标记物。这个问题可以用 pointer-events
CSS 属性来解决:
map.getPane('labels').style.pointerEvents = 'none';
窗格(pane)准备就绪后,我们可以添加图层,注意使用标签瓦片(tile)上的 pane
选项:
var positron = L.tileLayer('https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png', {
attribution: 'OpenStreetMap, CartoDB'
}).addTo(map); var positronLabels = L.tileLayer('https://{s}.basemaps.cartocdn.com/light_only_labels/{z}/{x}/{y}.png', {
attribution: 'OpenStreetMap, CartoDB',
pane: 'labels'
}).addTo(map); var geojson = L.geoJson(GeoJsonData, geoJsonOptions).addTo(map);
最后,为 GeoJSON 层上的每个 feature 添加一些交互:
geojson.eachLayer(function (layer) {
layer.bindPopup(layer.feature.properties.name);
}); map.fitBounds(geojson.getBounds());
现在,示例地图已经完成了!
下面放一个实例:
addBoundLayer() {
//设置自定义窗格pane层级zIndex
let boundaryPane = this.map.createPane('boundaryPane')
boundaryPane.style.zIndex = 200
boundaryPane.style.pointerEvents = 'none' //加载geojson并显示
getGeojsonByName({ name: 'shengze' }).then(data => {
this.bondarylayer = L.geoJSON(data, {
style: {
color: '#555',
fillOpacity: 0,
weight: 2,
dashArray: 10
},
pane: 'boundaryPane'//指定pane名字
})
this.map.addLayer(this.bondarylayer)
this.drawBoundaryMask(data.geometries[0].coordinates[0])
})
},
leaflet 用自定义pane实现图层顺序调整的更多相关文章
- C# WinForm控件之Dock顺序调整
最近被.net winform中的控件布局搞困惑了,由于控件都是使用Dock方式的,操作起来也是比较方便,如果最大化,窗口大小调整等,都可以随着窗口大小的变化而变化. 但问题是,.net winfor ...
- CALayer 知识:创建带阴影效果的圆角图片图层和创建自定义绘画内容图层
效果如下: KMLayerDelegate.h #import <UIKit/UIKit.h> @interface KMLayerDelegate : NSObject @end KML ...
- 多个 WindowsFormsHost 叠加顺序调整
原文:多个 WindowsFormsHost 叠加顺序调整 工作中遇到多个 WindowsFormsHost 包装的控件叠加顺序的调整问题,用了 BingToFront 和 BringToBack,不 ...
- arcgis api 4.x for js 自定义叠加图片图层实现地图叠加图片展示(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 4.x for js:esri 官网 api,里面详细的介绍 arcgis api 4.x 各个类 ...
- Winform Dock顺序调整
在布局的时候,当一个窗体内有多个控件使用了Dock属性来布局,Dock顺序的调整: 最近被.net winform中的控件布局搞困惑了,由于控件都是使用Dock方式的,操作起来也是比较方便,如果最大化 ...
- Dubbo的Filter链梳理---分组可见和顺序调整
前言: 刚刚写了篇博文: Dubbo透传traceId/logid的一种思路, 对dubbo的filter机制有了一个直观的理解. 同时对filter也多了一些好奇心, 好奇filter链是如何组织的 ...
- web项目中的监听器,过滤器以及自定义servlet的执行顺序
可以看到web容器一启动就会实例化监听器的contextInitialized(ServletContextEvent event)方法,然后是过滤器的init()方法,最后在用户访问web应用的 时 ...
- ArcGIS 切片与矢量图图层顺序问题
在项目中有个需求:根据图层索引添加图层 看到这个需求一下子想到 map.addLayer(layer,index?) 接口 但是问题出现了,我切片图加载顺序在矢量图之后就不行! map = new M ...
- 微信公众号 分享接口 签名通过 分享无效果(JSSDK自定义分享接口的策略调整)
为规范自定义分享链接功能在网页上的使用,自2017年4月25日起,JSSDK“分享到朋友圈”及“发送给朋友”接口,自定义的分享链接,其域名或路径必须与当前页面对应的公众号JS安全域名一致,否则将调用失 ...
- intellij import包 顺序调整
intellij中自动import的包顺序与eclipse不太一致,可以参照以下方式进行调整: eclipse中(笔者用的是eclipse luna)导入包的顺序依次是: javajavaxorgco ...
随机推荐
- 关于商业智能(Business Intelligence,简称BI)的认识
一.早期(1958年)定义 商业智能描述了一系列的概念和方法,通过应用基于事实的支持系统来辅助商业决策的制定. 二.帆软数据调研 帆软数据应用研究院对770多家企业的1400多名从业人员进行了调研(云 ...
- .net和java串口通讯压力测试对比
最近由于工作要求,需要对一个串口通讯设备进行压力测试,要求连续持续对串口设备发送指令,无间隔,测试设备是否会死机. 要求做到毫秒级,测试第三方的工具,基本上都无法达到毫秒级,最少的也是10毫秒. 于是 ...
- #分治 or 线段树+单调栈#CF526F Pudding Monsters
题目 给定一个 \(n \times n\) 的棋盘,其中有 \(n\) 个棋子,每行每列恰好有一个棋子. 求有多少个 \(k \times k\) 的子棋盘中恰好有 \(k\) 个棋子. 分析 先将 ...
- 编译opencv: cmake编译opencv,不带版本号
在Linux上使用cmake编译OpenCV,默认都是协议版本号的,一般会生成三个文件,一个so和两个软链接. 在部分系统上移植的时候,软链接会成问题,所以需要重新编译OpenCV,解决软链接的问题. ...
- C++调用Python-6:调用Python类
# mytest.py class Test: def hello(self): print("this is test class hello function no params ret ...
- Jenkins首次启动慢
场景描述启动Jenkins后,打开网站,发现一直卡在这个启动页面,慢,很慢,非常慢 解决方法 进入Jenkins的安装目录,找到"hudson.model.UpdateCenter.xml& ...
- spring boot @propertySource @importResource @Bean [六]
@propertySource 指定property的配置源. 创建一个person.property: 然后修改person注解; 在运行test之后,结果为: @importResource 这个 ...
- jenkins 持续集成和交付 —— git hook(七)
前言 这个hook的意思叫做钩子哈,前端听得多. 正文 好吧,这个git hook 有什么用呢? 前面说了一个轮询SCM这个东西呢,我是真的觉得这东西没啥用,经常扫描仓储算怎么回事呢? 但是如果主动通 ...
- Scratch3之AI集成 - flappy bird AI版本
AI神秘且有趣,我们一个经典的游戏flappy bird集成AI,实现自训练成长的聪明的笨鸟.先上效果: 初始化的笨鸟拥有分身,每个分身都有自我学习功能,根据自己的移动轨迹和得分情况进行汇总,进行新一 ...
- 修改中文、英文参考文献在文末列表中的顺序:EndNote
本文介绍在EndNote软件中,使得参考文献按照语种排列,中文在前.英文在后的方法. 前期我们在EndNote参考文献格式Output Styles界面介绍一文中,详细介绍了文献管理软件End ...