leaflet 用自定义pane实现图层顺序调整
在 Leaflet 中,map panes 隐式地将图层组合在一起,而开发者并不知道这一点。这种分组允许 Web 浏览器以比单独处理图层更有效的方式同时处理多个图层。
Map panes 使用 z-index CSS 属性来让某些图层始终显示在其他图层之上。默认的排序是:
TileLayer和GridLayerPath, 如线、折线、圆或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 ...
随机推荐
- #整体二分 or 主席树#洛谷 7424 [THUPC2017] 天天爱射击
题目 给定\(n\)条线段\(x_i,y_i,k_i\)和\(m\)个点(点有顺序), 对于每个点,问有多少条线段是第\(k_i\)次被该点经过. 分析(主席树) 将点按坐标排序建主席树那么就是一道静 ...
- Python 集合(Sets)1
集合 集合用于在单个变量中存储多个项.集合是 Python 中的 4 种内置数据类型之一,用于存储数据集合,其他 3 种是列表(List).元组(Tuple)和字典(Dictionary),它们都具有 ...
- jenkins安装卸载和下载
环境 :docker容器 卸载 jenkins 1.rpm卸载rpm -e jenkins 2.检查是否卸载成功rpm -ql jenkins 3.彻底删除残留文件:find / -iname jen ...
- Asp .Net Core 系列:集成 Refit 和 RestEase 声明式 HTTP 客户端库
背景 .NET 中 有没有类似 Java 中 Feign 这样的框架?经过查找和实验,发现 在 .NET 平台上,虽然没有直接的 Feign 框架的端口,但是有一些类似的框架和库,它们提供了类似的功能 ...
- HarmonyOS应用兼容稳定性云测试
兼容性测试 兼容性测试主要验证HarmonyOS应用在华为真机设备上运行的兼容性问题,包括首次安装.再次安装.启动.卸载.崩溃.黑白屏.闪退.运行错误.无法回退.无响应.设计约束场景.具体兼容性测 ...
- xilinx的serdes接收时钟坑
ilinx的7 series fpga transceivers wizard用于自定义的serdes编码. 要选择多个serdes端口,如下图,点击对应的名称,然后右边选择use该设备就可以. 生成 ...
- .net core的依赖注入学习
依赖注入(Dependency Injection,DI),简称DI,它可以降低各模块之间的耦合 首先需要安装两个Nuget包: Microsoft.Extensions.DependencyInje ...
- 力扣454(java&python)-四数相加 II(中等)
题目: 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, j, k, l &l ...
- 阿里云荣获可信云容器安全能力先进级认证, ACK/ACR为企业级安全护航
阿里云关注企业级用户的Kubernetes生产落地痛点,结合企业生产环境的大量实践,全面帮助企业真正落地云原生架构.安全侧问题,是众多大中型或金融领域企业的核心关注点. 端到端云原生安全架构 早在20 ...
- WPF 使用 ManipulationDemo 工具辅助调试设备触摸失效问题
本文将和大家介绍我所在的团队开源的 ManipulationDemo 工具.通过 ManipulationDemo 工具可以提升调试设备触摸失效的效率 此工具在 GitHub 上完全开源,请看 htt ...