【Leaflet专题篇】L.tileLayer图层顺序问题

【Leaflet专题篇】L.tileLayer图层顺序问题

1 问题复现

使用L.tileLayer加载底图(A、B、C)并使用layerControl管理、在用L.tileLayer.wms添加wms服务(D),当切换ABC时会压盖D
20230710_111941.gif
视频中右下角的wms服务(D)只有在切换ing看得到,切换完成就被压盖了
有问题代码如下

const mapUrl = "http://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=xxx";
const vecUrl = "http://t0.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=xxx";
// 天地卫星图
const layerA = L.layerGroup([ 
  L.tileLayer(mapUrl, {
    maxZoom: 20,
    minZoom: 3
  })
])
// 天地矢量图
const layerB = L.layerGroup([ 
  L.tileLayer(vecUrl, {
    maxZoom: 20,
    minZoom: 3
  })
])
// 高德卫星
const layerC = L.layerGroup([
  L.tileLayer('https://webst0{s}.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}', {
    maxZoom: 18,
    maxNativeZoom: 16,
    minZoom: 3,
    attribution: '高德地图 AutoNavi.com',
    subdomains: '1234'
  })
])
const baseLayers = {
  'A': layerA,
  'B': layerB,
  'C': layerC
}

// 记载wms服务
let layerName = 'layerName' // 修改为可访问的图层名
let url = 'url' // 修改为可访问地址
const layerD = L.layerGroup([
  L.tileLayer.wms(url, {
    layers: layerName,
    format: 'image/png',
    transparent: true,
    attribution: layerName
  })
])
// 
var map = L.map('map', {attributionControl: false, layers: [layerA]}).setView([29.04656, 112.86254], 8);
L.control.layers(baseLayers,null, {position: 'topleft', sortLayers: true}).addTo(map)

2 解决方案

2.1 使用layerControl的overlayer

layerControl可以将图层分为baselayer (基础层) 和overlayer(覆盖层)两种。
基础层是互斥的,一次只能显示一个,覆盖层是可以叠加的,并且在基础层之上。
将D图层放在overlayer中可以避免覆盖。

 const overlayers = {
   'D': layerD
 }
 L.control.layers(baseLayers, overlayers, {position: 'topleft', sortLayers: true}).addTo(map)

效果
20230710_114350.gif

2.2 使用setZIndex

setZIndex方法可以设置图层的顺序 (适用于 L.imageOverlay、L.layerGroup、L.GridLayer)。
使用setZIndex可以更加灵活配置

L.control.layers(baseLayers, null, {position: 'topleft', sortLayers: true}).addTo(map)
layerD.addTo(map)
layerD.setZIndex(10) // 如果10不够可以往上调

效果
20230710_122535.gif

上面的L.tileLayer和L.tileLayer.wms都是用layerGroup管理,也可以不用layerGroup管理,直接addTo(map),但是没有setZIndex方法不好控制图层顺序。

### 如何在 Leaflet 地图库中添加图层Leaflet 中,添加图层是构建交互式地图的核心功能之一。以下是一个详细的说明,包括如何加载基础地图、叠加多个图层以及控制它们的层级。 #### 1. 加载基础地图 Leaflet 提供了 `L.tileLayer` 方法来加载瓦片图层作为基础地图。通过指定一个瓦片服务 URL 和其他选项(如归属信息),可以轻松创建并添加基础地图图层到地图对象上[^1]。 ```javascript var osm = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap contributors' }); osm.addTo(map); // 将基础地图图层添加到地图 ``` #### 2. 添加叠加图层 除了基础地图外,还可以添加其他类型的叠加图层,例如雷达图层或网格图层。这些图层可以通过类似的 `L.tileLayer` 方法创建,并通过 `addLayer` 方法将其添加到地图实例中[^1]。 ```javascript var nexrad = L.tileLayer('https://example.com/nexrad/{z}/{x}/{y}.png'); // 示例雷达图层 var grid = L.tileLayer('https://example.com/grid/{z}/{x}/{y}.png'); // 示例网格图层 this.map.addLayer(osm).addLayer(nexrad).addLayer(grid).fitBounds(bounds); ``` 上述代码片段展示了如何将多个图层依次添加到地图上,并调整视图以适应所有图层的边界[^1]。 #### 3. 图层控制 为了增强用户体验,Leaflet 提供了内置的图层控制功能,允许用户选择显示哪些图层。这可以通过 `L.control.layers` 方法实现,该方法接受基础图层和叠加图层作为参数[^2]。 ```javascript var baseMaps = { "OpenStreetMap": osm }; var overlayMaps = { "NEXRAD": nexrad, "Grid": grid }; L.control.layers(baseMaps, overlayMaps).addTo(map); ``` 这样,用户可以在运行时切换不同的底图或启用/禁用某些叠加图层。 #### 4. 控制图层层级 如果需要调整图层的显示顺序,可以使用 `setZIndex` 方法设置每个图层的 Z 索引值。具有较高 Z 索引值的图层会覆盖较低索引值的图层[^3]。 ```javascript osm.setZIndex(10); // 设置基础地图的层级为10 nexrad.setZIndex(20); // 设置雷达图层的层级为20,确保其位于基础地图之上 grid.setZIndex(30); // 设置网格图层的层级为30,确保其位于雷达图层之上 ``` #### 5. 加载其他类型的地图数据 除了 OpenStreetMap,Leaflet 还支持加载来自其他提供商的数据,例如谷歌地图。通过自定义瓦片服务 URL,可以加载不同类型的地图数据,如卫星图像或地形图[^4]。 ```javascript var googleSatellite = L.tileLayer('http://{s}.google.com/vt/lyrs=s&x={x}&y={y}&z={z}', { maxZoom: 20, subdomains: ['mt0', 'mt1', 'mt2', 'mt3'] }); googleSatellite.addTo(map); ``` ### 结论 通过以上步骤,可以灵活地在 Leaflet 地图中添加基础地图和叠加图层,并根据需求调整图层的显示顺序和交互性。这些功能使得 Leaflet 成为开发交互式地图应用的强大工具。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值