mapbox添加自定义图片绑定点击事件,弹窗为自定义组件

一、首先构建根据后端返回的数据构建geojson格式的数据,点位的geojson数据格式:

{
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "geometry": {
                "type": "Point",
                "coordinates": [
                    117.1625,
                    36.7074
                ]
            },
            "properties": {
                "proIndex": 0
            }
        },
        {
            "type": "Feature",
            "geometry": {
                "type": "Point",
                "coordinates": [
                    117.1701,
                    36.6923
                ]
            },
            "properties": {
                "proIndex": 1
            }
        },
        {
            "type": "Feature",
            "geometry": {
                "type": "Point",
                "coordinates": [
                    117.17,
                    36.6927
                ]
            },
            "properties": {
                "proIndex": 2
            }
        },
        {
            "type": "Feature",
            "geometry": {
                "type": "Point",
                "coordinates": [
                    117.1701,
                    36.6916
                ]
            },
            "properties": {
                "proIndex": 3
            }
        },
        {
            "type": "Feature",
            "geometry": {
                "type": "Point",
                "coordinates": [
                    117.1445,
                    36.6852
                ]
            },
            "properties": {
                "proIndex": 4
            }
        }
    ]
}

二、如果需要设置自定义图片作为点位,则要调用loadImage方法加载图片。

map.loadImage(imageUrl, function (error, image) {
        if (error) throw error;
        if (!map.hasImage('custom-marker')) {   
          map.addImage('custom-marker', image);
        }
        map.addSource('geojson-source', {
          type: 'geojson',
          data: pointGeojsonData
        });

        map.addLayer({
          id: 'custom-marker-layer',
          type: 'symbol',
          source: 'geojson-source',
          layout: {
            'icon-image': 'custom-marker',
            'icon-size': 0.1
          }
        });

        map.on('click', 'custom-marker-layer', function (e) {
          // console.log(e.features,'eeeeeeeeeeeeeeeeeeeee')
          // var features = map.queryRenderedFeatures(e.lnglat, { layers: ['custom-marker-layer'] });
          // if (!features.length) return;
          var feature = e.features[0];
          console.log(feature, 'feature')

          // 创建一个新的弹窗
          let p = Vue.extend(TestPopup);
          let vm = new p({
            propsData: {
              obj:feature.properties
            }
          })
          vm.$mount();
          var popup = new mapboxgl.Popup(
            {
              offset: [0, -15],
              // closeButton: false,
              // closeOnClick: false
            }
          )
          popup.setLngLat(feature.geometry.coordinates)
          popup.setDOMContent(vm.$el).addTo(map)

        })
      });
  1. map.loadImage(imageUrl, function (error, image) { ... });
    • 这行代码使用map.loadImage方法异步加载一个图像。imageUrl是图像的URL。加载完成后,回调函数会被调用,参数error如果有值表示加载出错,image是加载成功的图像对象。
  2. if (error) throw error;
    • 如果加载图像时出错,抛出错误。
  3. if (!map.hasImage('custom-marker')) { map.addImage('custom-marker', image); }
    • 检查地图上是否已经存在一个名为custom-marker的图像。如果不存在,则使用map.addImage方法添加这个图像。
  4. map.addSource('geojson-source', { type: 'geojson', data: pointGeojsonData });
    • 向地图添加一个GeoJSON数据源。geojson-source是数据源的ID,type: 'geojson'指定了数据源的类型,data: pointGeojsonData是包含GeoJSON数据的变量。
  5. map.addLayer({ ... });
    • 在地图上添加一个图层。这个图层使用之前添加的GeoJSON数据源,并将自定义图标custom-marker作为图层的图标。图层的ID是custom-marker-layer,类型是symbol,它指定了图标的尺寸等布局属性。
  6. map.on('click', 'custom-marker-layer', function (e) { ... });
    • custom-marker-layer图层添加一个点击事件监听器。当用户点击这个图层上的点时,会触发回调函数。
  7. var feature = e.features[0];
    • 从事件对象e中获取被点击的特征(feature)。e.features是一个数组,包含所有在点击位置被渲染的特征。这里只取第一个特征。
  8. console.log(feature, 'feature')
    • 在控制台打印被点击的特征。
  9. 接下来的几行代码使用Vue.js创建一个新的组件实例,并将其内容设置为Mapbox弹窗的内容。
    • let p = Vue.extend(TestPopup); 使用Vue的extend方法创建一个TestPopup组件的构造器。
    • let vm = new p({ propsData: { obj: feature.properties } }); 创建一个新的Vue实例,将点击的特征的属性作为props传递给TestPopup组件。
    • vm.$mount(); 手动挂载Vue实例。
  10. var popup = new mapboxgl.Popup({ ... });
    • 创建一个新的Mapbox弹窗实例,并设置一些选项,如偏移量和是否显示关闭按钮。
  11. popup.setLngLat(feature.geometry.coordinates)
    • 设置弹窗的位置为被点击特征的地理坐标。
  12. popup.setDOMContent(vm.$el).addTo(map)
    • 将Vue实例的DOM元素设置为弹窗的内容,并将弹窗添加到地图上

三、在App.vue中设置取消mapbox默认的弹窗样式

.mapboxgl-popup-tip {
  display: none;
}
.mapboxgl-popup-content {
  padding:0;
}

四、弹窗组件通过props接收传过来的属性的值。

组件成功弹窗!

### 创建和自定义 Mapbox GL JS 的 Popup 弹窗 #### 初始化 Map 和 Popup 组件 为了在 Mapbox GL 地图中创建并使用弹窗,首先需要初始化地图实例以及导入必要的库文件。 ```javascript import mapboxgl from 'mapbox-gl'; import 'mapbox-gl/dist/mapbox-gl.css'; // 设置访问令牌 mapboxgl.accessToken = 'your.mapbox.access.token'; // 初始化地图对象 const map = new mapboxgl.Map({ container: 'map', // 容器ID style: 'mapbox://styles/mapbox/streets-v11', center: [-74.5, 40], // 初始中心坐标 zoom: 9 // 缩放级别 }); ``` 当完成上述设置之后,可以继续配置 `Popup` 实例来准备显示内容[^1]。 #### 使用 HTML 内容填充 Popup 通过调用 `.setHTML()` 方法可以直接向弹窗内注入一段简单的 HTML 字符串作为其主体内容: ```javascript let mhtml = '<h3>Hello World</h3><p>This is a custom popup.</p>'; let popup1 = new mapboxgl.Popup().setHTML(mhtml); ``` 这种方式适合于快速构建静态文本或少量富媒体元素的内容展示场景。对于更复杂的交互需求,则推荐采用 Vue.js 或其他前端框架来进行动态渲染[^2]。 #### 结合 Vue.js 自定义 Popup 样式与行为 如果希望进一步增强用户体验,可以通过集成 Vue.js 来实现更具灵活性的设计方案。具体做法如下所示: 1. **引入依赖项** ```javascript import Vue from 'vue'; import popupComponent from './popup.vue'; // 假设这是预先编写好的Vue单文件组件路径 ``` 2. **创建新的 Vue 实例并将其实例化后的 DOM 节点传递给 Popup 构造函数** ```javascript const vm = new Vue({ render(h) { return h(popupComponent); // 渲染指定的Vue组件 } }).$mount(); let vueBasedPopup = new mapboxgl.Popup() .setDOMContent(vm.$el) .addTo(map); ``` 这种方法允许开发者利用现代 JavaScript 框架的优势,在不牺牲性能的前提下提供高度可定制化的界面设计选项。 #### 将 Popup 添加至特定位置 无论是哪种方式生成的弹窗都需要关联具体的地理位置才能正常工作。这通常涉及到两个方面的工作:一是确定目标地点;二是将该地点绑定到相应的事件处理程序上以便触发弹窗显示逻辑。 ```javascript // 设定经纬度参数 const lngLat = [-74.508, 40.712]; // 向地图添加标记,并为其附加点击监听器以打开弹窗 new mapboxgl.Marker() .setLngLat(lngLat) .addTo(map) .getElement().addEventListener('click', () => { popup1.setLngLat(lngLat).addTo(map); }); ``` 以上就是关于如何基于 Mapbox GL JS 库创建及个性化调整 Popup 弹窗的相关说明[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值