mapbox控制缩放等级来显示隐藏视图里所有要素popup

贴个群号

WebGIS学习交流群461555818,欢迎大家。

同时打开所有popup

在Mapbox中,要同时打开图层的所有要素的弹窗,可以使用以下步骤:

1创建一个新的地图样式,并在该样式中添加要素图层。例如,您可以在Mapbox Studio中创建一个新的地图样式,然后添加一个GeoJSON源和相应的图层。

2在图层的属性中,确保“Interactive”选项被启用。这将允许用户与图层中的要素进行交互,并且可以通过点击要素来打开弹窗。

3使用Mapbox GL JS或其他Mapbox SDK加载地图,并将其绑定到页面元素。

4使用Mapbox GL JS的queryRenderedFeatures()方法查询图层中的所有要素,并使用forEach()方法迭代每个要素。

5对于每个要素,获取它的几何信息和属性信息,并将这些信息用于创建弹窗内容。

6使用Mapbox GL JS的Popup类创建一个新的弹窗,并将其添加到地图上。

7将弹窗内容设置为每个要素的属性信息,并将弹窗的位置设置为每个要素的几何信息。

8显示弹窗,以使所有要素的弹窗都同时打开。

以下是示例代码,展示了如何实现此操作:

map.on('load', function() {
  // 获取图层ID
  var layerId = 'my-layer';
  
  // 查询图层中的所有要素
  var features = map.queryRenderedFeatures({ layers: [layerId] });
  
  // 迭代每个要素,创建并打开弹窗
  features.forEach(function(feature) {
    // 获取要素的属性信息和几何信息
    var properties = feature.properties;
    var geometry = feature.geometry;
    
    // 创建弹窗内容
    var popupContent = '<h3>' + properties.title + '</h3>' +
                       '<p>' + properties.description + '</p>';
    
    // 创建新的弹窗,并将其位置设置为要素的几何信息
    var popup = new mapboxgl.Popup()
      .setLngLat(geometry.coordinates)
      .setHTML(popupContent);
      
    // 将弹窗添加到地图上并打开
    popup.addTo(map);
  });
});

请注意,这段代码仅供参考,并且可能需要根据您的具体情况进行自定义调整。

控制缩放等级展示popup

使用vue组件的方式挂载popup的方式在我的另一篇博客中

https://blog.csdn.net/Sakura1998gis/article/details/113383948?spm=1001.2014.3001.5502

注意HTML的dom元素不能以数字开头,但是我们需要绑定不一样的名字,建议使用zoomed,当缩放动作结束的时候判断

          
		import Vue from 'vue'
		import PopupVue from '@/components/popup/Popup'
		const PopupItem = Vue.extend(PopupVue)
		
		//控制缩放到一定层级 才会展示popup
          let popupZoomArray = []
          map.on('zoomend',layerID,()=>{
            if(map.getZoom()>=11){
              // 查询图层中的所有要素
              var features = map.queryRenderedFeatures({ layers: layerID] });
              // console.log(features)
              // 迭代每个要素,创建并打开弹窗
              features.forEach(function(feature) {
                // 获取要素的属性信息和几何信息
                var properties = feature.properties;
                var geometry = feature.geometry;
                
                // 创建弹窗内容   绑定一个唯一popupID,用于挂载时候找到对应的ID
                const popupHTML = `<div id="popup${properties.id}-detail"></div>`
                // 创建新的弹窗,并将其位置设置为要素的几何信息
                let popupZoomItem = new mapboxgl.Popup({
                  closeButton: false
                }).setLngLat(geometry.coordinates)
                  .setHTML(popupHTML)
                  .setMaxWidth('none')
                  .addTo(map)
                // 将弹窗添加到地图上并打开
                // popup.addTo(map);
                
                new PopupItem({propsData:{popupContent: {
                  name:name,
                  item:item,
                  item1:properties,
                  isStringIdenx:''
                }}}).$mount(`#popup${properties.id}-detail`)
                popupZoomArray.push(popupZoomItem)
              })
            }else{
              popupZoomArray.forEach(e=>{
                e.remove()
              })
              popupZoomArray =[]
              // popup.remove()
            }
          })

往往这样操作完,还有一个问题
就是其实这个方法并不是图层里面的所有要素,只是你视角里面看到的要素,比如图层里面有一百个要素,但是你视角里面只有10个,那么这个缩放动作完成后,只有10个要素同时展示了popup,其他并没有加载,而这时,你平移视角到其他区域,就会看不到其他要素的popup,所以这时候,我们还需要一个方法,就是moveend

          //控制缩放到一定层级 才会展示popup
          let popupMoveArray = []
          map.on('moveend',layerID, () => {
            if(map.getZoom()>=11){
              // 查询图层中的所有要素
              var features = map.queryRenderedFeatures({ layers: [layerID] });
              // console.log(features)
              // 迭代每个要素,创建并打开弹窗
              features.forEach(function(feature) {
                // 获取要素的属性信息和几何信息
                var properties = feature.properties;
                var geometry = feature.geometry;
                
                // 创建弹窗内容
                const popupHTML = `<div id="popup${properties.id}-detail"></div>`
                // 创建新的弹窗,并将其位置设置为要素的几何信息
                let popupMoveItem =  new mapboxgl.Popup({
                  closeButton: false
                }) 
                  .setLngLat(geometry.coordinates)
                  .setHTML(popupHTML)
                  .setMaxWidth('none')
                  .addTo(map)
                // 将弹窗添加到地图上并打开
                // popup.addTo(map);
                
                new PopupItem({propsData:{popupContent: {
                  name:name,
                  item:item,
                  item1:properties,
                  isStringIdenx:''
                }}}).$mount(`#popup${properties.id}-detail`)
                popupMoveArray.push(popupMoveItem)
              })
            }else{
              // popup.remove()
              popupMoveArray.forEach(e=>{
                e.remove()
              })
              popupMoveArray = []
            }
          });

注意这个用于存放所有元素popup的数组必须放在动作外面。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mapboxpopup是用于在地图上显示弹窗的功能。根据官方示例,首先需要引入mapbox的样式文件,可以使用以下代码导入样式文件: import "mapbox-gl/dist/mapbox-gl.css" 然后,可以创建一个popup对象并将其添加到地图上,示例代码如下: var popup = new mapboxgl.Popup().addTo(map); 接下来,可以使用popup对象的相关方法来操作弹窗,比如移除弹窗可以使用popup.remove()方法。 要注意的是,这只是mapbox popup的简单使用示例,实际使用中可以根据需要设置弹窗的内容、样式和交互行为等。可以参考mapbox官方文档和示例来了解更多关于popup的详细用法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Mapbox 添加弹窗 点击标记点出现弹窗 vue](https://blog.csdn.net/Windyluna/article/details/120658613)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Mapbox 移除弹窗、监听弹窗打开、关闭事件、去除Mapbox的logo](https://blog.csdn.net/Windyluna/article/details/120827636)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值