当前位置: 首页 > news >正文

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接收传过来的属性的值。

组件成功弹窗!

http://www.lryc.cn/news/542881.html

相关文章:

  • SVT-AV1接入ffmpeg说明
  • 基于 C++ Qt 的 Fluent Design 组件库 QFluentWidgets
  • OpenCV(6):图像边缘检测
  • 多模态人物视频驱动技术回顾与业务应用
  • 星海智算+ DeepSeek-R1:技术突破与行业应用的协同革新
  • 选择排序:简单高效的选择
  • 考研/保研复试英语问答题库(华工建院)
  • ARM Cortex-M处理器中的MSP和PSP
  • 《Keras 3 使用 NeRF 进行 3D 体积渲染》:此文为AI自动翻译
  • Pytorch实现之浑浊水下图像增强
  • 【redis】数据类型之Bitfields
  • Python入门 — 类
  • R-INLA实现绿地与狐狸寄生虫数据空间建模:含BYM、SPDE模型及PC先验应用可视化...
  • Linux云计算SRE-第十五周
  • 2014年下半年试题一:论软件需求管理
  • podman加速器配置,harbor镜像仓库部署
  • 信息学奥赛一本通 1522:网络 | OpenJudge 百练 1144:Network
  • 本地部署DeepSeek的硬件配置建议
  • Redis面试题----Redis 的持久化机制是什么?各自的优缺点?
  • C#实现本地AI聊天功能(Deepseek R1及其他模型)。
  • Metal 学习笔记四:顶点函数
  • C# string转unicode字符
  • HITCON2017SSRFME-学习复盘
  • 【Http和Https区别】
  • 2025数学建模竞赛汇总,错过再等一年
  • 基于SSM的《计算机网络》题库管理系统(源码+lw+部署文档+讲解),源码可白嫖!
  • ReentrantLock 用法与源码剖析笔记
  • 矩阵的 正定(Positive Definite)与负定(Negative Definite):从Fisher信息矩阵看“曲率”的秘密
  • 被裁20240927 --- WSL-Ubuntu20.04安装cuda、cuDNN、tensorRT
  • uniapp写的h5跳转小程序