首页 > 其他分享 >leaflet 用自定义pane实现图层顺序调整

leaflet 用自定义pane实现图层顺序调整

时间:2022-12-07 15:00:10浏览次数:63  
标签:map 自定义 标签 labels 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());

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

leaflet官网参考

标签:map,自定义,标签,labels,leaflet,pane,图层
From: https://www.cnblogs.com/tiandi/p/16963083.html

相关文章

  • view-design tabpane禁用后renderHeader失效问题
    需求是这样的在tabPane的renderHeader里面添加hover事件(使用组件自带的Poptip)能显示提示其实这个不算是问题,设置disabled属性后,原本的元素上面添加了 ivu-tabs-tab-disa......
  • Vue3必会技巧-自定义Hooks
    Vue3自定义Hooks定义:个人理解:一些可复用的方法像钩子一样挂着,可以随时被引入和调用以实现高内聚低耦合的目标,应该都能算是hook;为什么Vue3要用自定义Hook?:结论:就是为了......
  • 使用自定义类加载器打破双亲委派机制实现自定义String类
    今天我和大家如何用自定义加载器打破双亲委派机制。在介绍双亲委派机制前,我先来聊聊Java里面有几种类加载器。引导类加载器:Bootstrapclassloader扩展类加载器:ExtClassLoade......
  • 随笔(三)『SpringBoot自定义异常类』
    1、定义异常类,继承RuntimeExceptionpackagecom.baihua.common.exception;importlombok.Data;/***自定义异常*/@DatapublicclassMyExceptionextendsRunti......
  • gym——1自定义Gym环境并注册
    gym1——自定义Gym环境并注册目录gym1——自定义Gym环境并注册感谢开始Step0新建文件夹Step1:新建环境文件xxEnv.pyStep2:在env下的__init__.py下注册**Step3**......
  • 自定义RBAC(2)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 上一次把DAC、MAC、PBAC这三个都一口气介绍完了,本想一口气把RBAC也说完。想了想,饭还是要一口口吃,一次吃太多会消化不良,......
  • 自定义RBAC(2)
    您好,我是湘王,这是我的51CTO博客,欢迎您来,欢迎您再来~上一次把DAC、MAC、PBAC这三个都一口气介绍完了,本想一口气把RBAC也说完。想了想,饭还是要一口口吃,一次吃太多会消化不良,所......
  • 强化学习如何自定义环境?【写代码的时候如何与标准接轨】
    还是需要学习如何自定义一个可以交互的环境,走上标准的道路,才能调用很多东西。摸清楚套路,然后一步一步跟着实现。Justgetclosetoyouraim!这次的环境搭建主要模......
  • 记录--uniapp自定义相机 自定义界面拍照录像闪光灯切换摄像头
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助因公司业务需要,需要开发水印相机功能,而项目代码用的uniapp框架,App端只能简单调用系统的相机,无法自定义界......
  • jsdelivr被墙,hexo-next切换为自定义CDN
    1.Next主题需要升级到8.9以上,我的是多少忘记了,最好升级到最新使用npm管理gitclonehttps://github.com/next-theme/hexo-theme-nextthemes/next2.替换链接官方......