在 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());

现在,示例地图已经完成了!

leaflet官网参考

下面放一个实例:

    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实现图层顺序调整的更多相关文章

  1. C# WinForm控件之Dock顺序调整

    最近被.net winform中的控件布局搞困惑了,由于控件都是使用Dock方式的,操作起来也是比较方便,如果最大化,窗口大小调整等,都可以随着窗口大小的变化而变化. 但问题是,.net winfor ...

  2. CALayer 知识:创建带阴影效果的圆角图片图层和创建自定义绘画内容图层

    效果如下: KMLayerDelegate.h #import <UIKit/UIKit.h> @interface KMLayerDelegate : NSObject @end KML ...

  3. 多个 WindowsFormsHost 叠加顺序调整

    原文:多个 WindowsFormsHost 叠加顺序调整 工作中遇到多个 WindowsFormsHost 包装的控件叠加顺序的调整问题,用了 BingToFront 和 BringToBack,不 ...

  4. arcgis api 4.x for js 自定义叠加图片图层实现地图叠加图片展示(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 4.x for js:esri 官网 api,里面详细的介绍 arcgis api 4.x 各个类 ...

  5. Winform Dock顺序调整

    在布局的时候,当一个窗体内有多个控件使用了Dock属性来布局,Dock顺序的调整: 最近被.net winform中的控件布局搞困惑了,由于控件都是使用Dock方式的,操作起来也是比较方便,如果最大化 ...

  6. Dubbo的Filter链梳理---分组可见和顺序调整

    前言: 刚刚写了篇博文: Dubbo透传traceId/logid的一种思路, 对dubbo的filter机制有了一个直观的理解. 同时对filter也多了一些好奇心, 好奇filter链是如何组织的 ...

  7. web项目中的监听器,过滤器以及自定义servlet的执行顺序

    可以看到web容器一启动就会实例化监听器的contextInitialized(ServletContextEvent event)方法,然后是过滤器的init()方法,最后在用户访问web应用的 时 ...

  8. ArcGIS 切片与矢量图图层顺序问题

    在项目中有个需求:根据图层索引添加图层 看到这个需求一下子想到 map.addLayer(layer,index?) 接口 但是问题出现了,我切片图加载顺序在矢量图之后就不行! map = new M ...

  9. 微信公众号 分享接口 签名通过 分享无效果(JSSDK自定义分享接口的策略调整)

    为规范自定义分享链接功能在网页上的使用,自2017年4月25日起,JSSDK“分享到朋友圈”及“发送给朋友”接口,自定义的分享链接,其域名或路径必须与当前页面对应的公众号JS安全域名一致,否则将调用失 ...

  10. intellij import包 顺序调整

    intellij中自动import的包顺序与eclipse不太一致,可以参照以下方式进行调整: eclipse中(笔者用的是eclipse luna)导入包的顺序依次是: javajavaxorgco ...

随机推荐

  1. #整体二分 or 主席树#洛谷 7424 [THUPC2017] 天天爱射击

    题目 给定\(n\)条线段\(x_i,y_i,k_i\)和\(m\)个点(点有顺序), 对于每个点,问有多少条线段是第\(k_i\)次被该点经过. 分析(主席树) 将点按坐标排序建主席树那么就是一道静 ...

  2. Python 集合(Sets)1

    集合 集合用于在单个变量中存储多个项.集合是 Python 中的 4 种内置数据类型之一,用于存储数据集合,其他 3 种是列表(List).元组(Tuple)和字典(Dictionary),它们都具有 ...

  3. jenkins安装卸载和下载

    环境 :docker容器 卸载 jenkins 1.rpm卸载rpm -e jenkins 2.检查是否卸载成功rpm -ql jenkins 3.彻底删除残留文件:find / -iname jen ...

  4. Asp .Net Core 系列:集成 Refit 和 RestEase 声明式 HTTP 客户端库

    背景 .NET 中 有没有类似 Java 中 Feign 这样的框架?经过查找和实验,发现 在 .NET 平台上,虽然没有直接的 Feign 框架的端口,但是有一些类似的框架和库,它们提供了类似的功能 ...

  5. HarmonyOS应用兼容稳定性云测试

      兼容性测试 兼容性测试主要验证HarmonyOS应用在华为真机设备上运行的兼容性问题,包括首次安装.再次安装.启动.卸载.崩溃.黑白屏.闪退.运行错误.无法回退.无响应.设计约束场景.具体兼容性测 ...

  6. xilinx的serdes接收时钟坑

    ilinx的7 series fpga transceivers wizard用于自定义的serdes编码. 要选择多个serdes端口,如下图,点击对应的名称,然后右边选择use该设备就可以. 生成 ...

  7. .net core的依赖注入学习

    依赖注入(Dependency Injection,DI),简称DI,它可以降低各模块之间的耦合 首先需要安装两个Nuget包: Microsoft.Extensions.DependencyInje ...

  8. 力扣454(java&python)-四数相加 II(中等)

    题目: 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, j, k, l &l ...

  9. 阿里云荣获可信云容器安全能力先进级认证, ACK/ACR为企业级安全护航

    阿里云关注企业级用户的Kubernetes生产落地痛点,结合企业生产环境的大量实践,全面帮助企业真正落地云原生架构.安全侧问题,是众多大中型或金融领域企业的核心关注点. 端到端云原生安全架构 早在20 ...

  10. WPF 使用 ManipulationDemo 工具辅助调试设备触摸失效问题

    本文将和大家介绍我所在的团队开源的 ManipulationDemo 工具.通过 ManipulationDemo 工具可以提升调试设备触摸失效的效率 此工具在 GitHub 上完全开源,请看 htt ...