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

news/2025/2/27 5:53:28

一、首先构建根据后端返回的数据构建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.niftyadmin.cn/n/5869577.html

相关文章

现代前端框架渲染机制深度解析:虚拟DOM到编译时优化

引言:前端框架的性能进化论 TikTok Web将React 18迁移至Vue 3后,点击响应延迟降低42%,内存占用减少35%。Shopify采用Svelte重构核心交互模块,首帧渲染速度提升580%。Discord在Next.js 14中启用React Server Components后&#xf…

Airflow和PySPARK实现带多组参数和标签的Amazon Redshift数据仓库批量数据导出程序

设计一个基于多个带标签SQL模板作为配置文件和多组参数的PySPARK代码程序,实现根据不同的输入参数,用Airflow进行调度,自动批量地将Amazon Redshift数据仓库的数据导出为Parquet、CSV和Excel文件到S3上,标签和多个参数&#xff08…

Docker下ARM64架构的源码编译Qt5.15.1,并移植到开发板上

Docker下ARM64架构的源码编译Qt5.15.1,并移植到开发板上 1、环境介绍 QT版本:5.15.1 待移植环境: jetson nano 系列开发板 aarch64架构(arm64) 编译环境: 虚拟机Ubuntu18.04(x86_64) 2、…

--- spring MVC ---

引言 所谓MVC是一种软件的设计模型,他把软件系统分为三部分,View(视图),Controller(控制器),Model(模型),他们之间的关系是 spring mvc全称为spr…

深入解析 Spring 中的 BeanDefinition 和 BeanDefinitionRegistry

在 Spring 框架中,BeanDefinition 和 BeanDefinitionRegistry 是两个非常重要的概念,它们共同构成了 Spring IoC 容器的核心机制。本文将详细介绍这两个组件的作用、实现以及它们之间的关系。 一、BeanDefinition:Bean 的配置描述 1.1 什么…

线性回归(一)基于Scikit-Learn的简单线性回归

主要参考学习资料: 《机器学习算法的数学解析与Python实现》莫凡 著 前置知识:线性代数-Python 目录 问题背景数学模型假设函数损失函数优化方法训练步骤 代码实现 问题背景 回归问题是一类预测连续值的问题,满足这样要求的数学模型称作回归…

仿真环境下实现场景切换、定位物体和导航行走

1. 代码(以微波炉为例) from ai2thor.controller import Controller import math import randomdef distance_2d(pos1, pos2):"""计算两点之间的二维欧几里得距离(忽略Z轴)"""return math.sqrt((p…

Python在实际工作中的运用-通用格式CSV文件自动转换XLSX

继续上篇《Python在实际工作中的运用-CSV无损转XLSX的几个方法》我们对特定的CSV实现了快速转换XLSX的目标,但是运行Py脚本前还是需要编辑表格创建脚本和数据插入脚本,自动化程度很低,实用性不强,为提供工作效率,实现输…