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 ...
随机推荐
- ET介绍——更为便捷高效的AI框架-行为机(Behavior Machine)
什么是行为机 顾名思义,类比状态机每个节点是一个状态,行为机每个节点是描述一种行为.行为机每个节点之间是互斥的,并且节点相互之间完全不用关心是怎么切换的.这里就不讲状态机跟行为树是怎么做ai的了,这里 ...
- 【WCH以太网接口系列芯片】CH9121\20的使用和测试
本篇文章将介绍沁恒微电子的以太网转接芯片CH9121(CH9120和CH9121使用上没有区别,注意配置工具不一样,可以在沁恒微电子官网自行下载测试),该芯片支持网口和串口相互透传,可以通过串口AT指 ...
- #模型转换#洛谷 6075 [JSOI2015]子集选取
题目 分析 \(n\)个元素可以独立操作,考虑单个元素, 则选不选择一定有一道分界线, 而这条分界线正好要走\(k\)次, 每次可以选择向上走或向右走,所以为\(2^k\), 由于\(n\)个元素相互 ...
- #网络流,dinic,最小割#洛谷 3227 [HNOI2013]切糕
题目传送门 题目大意 \(P\)行\(Q\)列的楼房高度均为\(R\),每一层改造要花费一定的金钱, 每个楼房都要挑选有且仅有一层进行改造,并且相邻两个楼房改造位置的相对高度不能超过\(D\), 问最 ...
- #线性基,点分治#洛谷 3292 [SCOI2016]幸运数字
题目 分析 题目就是将\(x\)到\(y\)路径上的线性基合并求解, 这里用的是点分治,每次换根到重心的时候维护前缀线性基, 查询的时候如果属于不同的子树就能询问答案,记得\(x=y\)要特判 代码 ...
- Bootstrap实战 - 评论列表
一.介绍 社交媒体网站盛行,人们常常会使用评论表达自己的观点,评论功能已然成为网站的一部分. 二.知识点 2.1 媒体对象 官方解释:这是一个抽象的样式,用以构建不同类型的组件,这些组件都具有在文本内 ...
- 【福利活动】深度体验OpenHarmony对接华为云IoT
本文主要介绍基于OpenHarmony 3.0来接入IoTDA,以BearPi-HM_Nano开发板为例,使用huaweicloud_iot_link SDK对接华为云物联网平台的简单流程.文末为 ...
- [UAC]C++判断某进程是否有管理员权限
BOOL IsAdminProcess(UINT PID) { if (PID <= 0) PID = GetCurrentProcessId(); HANDLE hProcess = Open ...
- C# Dev GridControl小结
1. 如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 2. 如何新增一条记录 (1).gridView.Ad ...
- Android 开发入门(5)
0x07 数据存储 (1)共享参数 SharedPreferences a. 用法 用法 SharedPreferences 是 Android 的一个轻量级存储工具,采用的存储结构为键值对的方式 共 ...