使用mapbox gl js动态向geoJSON数组添加标记

使用mapbox gl js动态向geoJSON数组添加标记,mapbox,geojson,mapbox-gl-js,Mapbox,Geojson,Mapbox Gl Js,我见过几个带有多个标记的Mapbox地图示例,但是标记位置是预先编程到geoJSON数组中的,比如一个 我希望能够通过一种方法向地图添加一个标记,并保留现有标记。这些标记将通过内置的地理编码器搜索创建。使用旧的mapbox.js,似乎可以做到以下几点: L.geoJson(geojsonFeature, { ... }).addTo(map); 但是,我似乎找不到使用mapbox gl js的此类方法/功能的文档。我希望能够跟踪这些标记,并像这样编辑/删除它们。我错过什么了吗 下面是我当前的代

我见过几个带有多个标记的Mapbox地图示例,但是标记位置是预先编程到geoJSON数组中的,比如一个

我希望能够通过一种方法向地图添加一个标记,并保留现有标记。这些标记将通过内置的地理编码器搜索创建。使用旧的mapbox.js,似乎可以做到以下几点:

L.geoJson(geojsonFeature, { ... }).addTo(map);
但是,我似乎找不到使用mapbox gl js的此类方法/功能的文档。我希望能够跟踪这些标记,并像这样编辑/删除它们。我错过什么了吗

下面是我当前的代码,它只适用于一个标记。如果添加新标记,它当前将替换旧标记。我想继续从geocoder钩子中添加它们:

mapboxgl.accessToken = 'xxx';  

var map = new mapboxgl.Map({
    container: 'map',
    style: 'mapbox://styles/mapbox/streets-v9',
    center: [-79.4512, 43.6568],
    zoom: 13
});

var geocoder = new mapboxgl.Geocoder({
    container: 'geocoder-container'
});

map.addControl(geocoder);

map.on('load', function() {
    map.addSource('single-point', {
        "type": "geojson",
        "data": {
          "type": "FeatureCollection",
            "features": []
        }
    });

    map.addLayer({
        "id": "point",
        "source": "single-point",
        "type": "circle",
        "paint": {
            "circle-radius": 5,
            "circle-color": "#007cbf"
        }
    });

    var el = document.createElement('div');
    el.id = 'marker';
    var markerObject;      

    map.addControl(new mapboxgl.NavigationControl());
    geocoder.on('result', function(ev) {
       var placeName = JSON.stringify(ev.result.place_name);
       console.log(placeName); 

       var popup = new mapboxgl.Popup({offset:[0, -30]})
           .setText(ev.result.place_name);

       markerObject = new mapboxgl.Marker(el, {offset:[-25, -25]})
         .setLngLat(ev.result.geometry.coordinates)
         .setPopup(popup)
         .addTo(map);
   });
});

此代码由以下行组成

var el = document.createElement('div');
el.id = 'marker';
var markerObject;   
geocoder.on('result'
方法之外。如果希望在每次回调提供给
geojson.on时添加新标记('result'
激发,那么这就是问题所在:您试图对多个标记使用相同的
div
元素。Mapbox GL JS不会为您克隆或复制该元素:新
mapboxgl.Marker
的元素参数应该是新元素


因此,要解决此问题,您需要将上述行移到
geocoder.on('result'

的回调中。此代码由以下行构成

var el = document.createElement('div');
el.id = 'marker';
var markerObject;   
geocoder.on('result'
方法之外。如果希望在每次回调提供给
geojson.on时添加新标记('result'
激发,那么这就是问题所在:您试图对多个标记使用相同的
div
元素。Mapbox GL JS不会为您克隆或复制该元素:新
mapboxgl.Marker
的元素参数应该是新元素


因此,要解决这个问题,您需要将上述行移到
geocoder.on的回调内部(“结果”

太棒了,谢谢!还有一个是/否的问题,有没有可能实现与本文类似的功能?太棒了,谢谢!还有一个是/否的问题,有没有可能实现与本文类似的功能?