mapbox-gl 点位编辑功能

文章介绍了如何在Mapbox中进行点位编辑,方法一是借助Marker添加自定义图标,绑定事件,创建和编辑POI;方法二是使用mapbox-gl-draw插件,但无法设置图标和文字。两种方法提供了GIS应用中常见的在线编辑功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

矢量在线编辑是gis常用的编辑功能,兴趣点(POI)与区域面(AOI)或者道路线不同,在地图上没有形状和面积,仅表示落位地点,本文介绍使用mapbox进行点位编辑的常用方式,底图使用高德公开的地图服务。


方式一:借助 Marker

mapbox 的 Marker 组件可以实现对任意点位的即时编辑,为图层绑定事件,并及时与后端交互生成类型为Point的GeoJson数据源,在交互完成后刷新数据即可。

添加自定义icon

根据UI设计生成新的雪碧图,作为地图上点位的图标

在这里插入图片描述

在这里插入图片描述

添加POI图层,绑定对应事件

mapInstance?.addLayer({
          id: 'feature-poi-layer',
          type: 'symbol',
          source: 'featureDataSource',
          paint: {
            "text-color": '#000000',

          },
          layout: {
            'text-field': ['get', 'name'],
            'text-font': [
              'Akaya'
            ],
            "text-offset": [0, 1],
            "text-anchor": "top",
            "text-size": 12,
            "icon-image": blueIcon,
            "icon-size": 0.5
          },
        });
        // 鼠标移入
        mapInstance.on('mouseenter', 'feature-poi-layer', (e) => {
          mapInstance.getCanvas().style.cursor = 'pointer ';
        });
        // 鼠标移出
        mapInstance.on('mouseout', 'feature-poi-layer', (e) => {
          mapInstance.getCanvas().style.cursor = '';
        });
        // 点击点位
        mapInstance.on('click', 'feature-poi-layer', (e) => {
          onFeatureSelect(e, mapInstance, 'feature-poi-layer')
        })

点位展示
在这里插入图片描述

点位选择
在这里插入图片描述

基于Marker交互

创建自定义Marker

  function getMarkerEl() {
    const el = document.createElement('div');
      el.className = 'marker';
      el.style.backgroundImage = `url(${curPositionImg})`;
      el.style.width = `18px`;
      el.style.height = `22px`;
      el.style.backgroundSize = '100%';

      return el
  }

	...
	 markerRef.current = new Marker({
        element:getMarkerEl(),
        anchor:'bottom'
      })
      .setLngLat([lngLat.lng, lngLat.lat])
      .addTo(map)

编辑 / 创建POI

// 编辑完成后重新刷新数据
map?.getSource(sourceId)?.setData(currentLayerGeojson);

在这里插入图片描述

方式二:采用 mapbox-gl-draw 插件

参考:mapbox-gl图形绘制并编辑已有图层,该方式的缺点是无法设置图标与文字显示在地图上。

在这里插入图片描述

总结

mapbox实现点位编辑功能

  • 方式一:借助 Marker

  • 方式二:采用 mapbox-gl-draw 插件

### Vue 和 Mapbox 实现点位点击样式效果 在 Vue 中集成 Mapbox 并实现当用户点击某个特定位置(feature)时改变该位置的样式,可以通过监听 `click` 事件并利用 `setPaintProperty` 方法来动态调整被选中的 feature 的外观属性[^1]。 下面是一个完整的示例代码片段展示了如何设置此功能: ```javascript // main.js 或 setup 部分初始化地图实例 import mapboxgl from 'mapbox-gl'; export default { data() { return { selectedFeatureId: null, // 存储当前选中特征ID }; }, mounted() { const map = new mapboxgl.Map({ container: this.$refs.mapContainer, style: 'mapbox://styles/mapbox/streets-v11', center: [-74.509, 40.712], zoom: 8 }); // 添加 GeoJSON 数据源到地图上 map.on('load', function () { map.addSource('points', { type: 'geojson', data: './data.geojson' // 假设这是你的GeoJson文件路径 }); // 给数据源添加图层定义 map.addLayer({ id: "point-layer", type: "circle", source: "points", paint: { 'circle-radius': 5, 'circle-color': '#007cbf' } }); }); // 监听 click 事件处理函数 map.on('click', 'point-layer', (e) => { let clickedFeature = e.features[0]; if (!clickedFeature || !clickedFeature.id) {return;} // 如果之前有其他要素被选中,则恢复默认样式 if(this.selectedFeatureId !== null){ map.setPaintProperty( 'point-layer', 'circle-color', ['case',['==', 'id', this.selectedFeatureId],'#007cbf','#007cbf'] ); } // 更新新选中的要素颜色 this.selectedFeatureId = clickedFeature.id; map.setPaintProperty( 'point-layer', 'circle-color', ['case',['==','id',this.selectedFeatureId],'red','#007cbf'] // 改变颜色为红色表示选中状态 ); // 可在此处调用 flyTo 将视图移动至目标位置 map.flyTo({center:[clickedFeature.geometry.coordinates]}); }); // 当鼠标移开时重置样式 map.on('mouseleave', 'point-layer', () => { if(this.selectedFeatureId === null){return;} map.setPaintProperty( 'point-layer', 'circle-color', ['#007cbf'] ); this.selectedFeatureId = null; }); } } ``` 上述代码实现了如下逻辑: - 初始化了一个基于给定坐标的简单圆圈标记作为基础显示; - 用户每次单击其中一个标记时,会触发相应的样式变化——即更改所选标记的颜色,并使它成为新的焦点对象; - 使用 `flyTo()` 函数可以让相机平滑过渡到指定坐标的位置,从而突出显示感兴趣的区域; - 同时也考虑到了清除先前的选择情况下的交互体验优化问题;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值