【问题标题】:Leaflet markercluster: How can I create a markercluster with numbered markers?Leaflet markercluster:如何创建带有编号标记的markercluster?
【发布时间】:2016-12-26 17:45:29
【问题描述】:

我正在尝试创建一个带有 ID 标记的标记集群,因为我稍后想从地图中删除一个标记。但是,我什至无法让这些标记的标记出现在地图上。我正在从 geoJSON 格式的变量 individualPoints 加载它们。我可以使用以下代码 sn-p 直接将这些标记添加到地图中:

// create object to save markers
var markersID = {};

// exchanges latitude & longitude
function switchLatLong(oldLocation) {
  return new L.LatLng(oldLocation[1], oldLocation[0]);
}

var geoJsonLayer = L.geoJson(individualPoints, {
  onEachFeature: function(feature, layer) {
    /* can add directly to the map--this works */
    markersID[feature.properties.id] = 
        L.marker(switchLatLong(feature.geometry.coordinates))
            .addTo(map);
  }
});

但我希望它们在一个集群中,所以我认为我需要用一个 ID 标记每个标记(如this question),然后将该组添加到集群中,如下所示:

var geoJsonLayer = L.geoJson(individualPoints, {
  onEachFeature: function(feature, layer) {
    /* tag the marker with the id */
    markersID[feature.properties.id] = 
        L.marker(switchLatLong(feature.geometry.coordinates));
  }
});

// create a marker cluster group, and add the markers to this.
var markers = L.markerClusterGroup({});
/* here's where I'm trying to toggle to use the markers with ID numbers */
//markers.addLayer(geoJsonLayer); // this works
markers.addLayers(markersID);   // this doesn't

添加geoJsonLayer 效果很好,但添加markersID 不行。所以我一定是错误地添加了markersID。 这是一个jsfiddle。 https://jsfiddle.net/anfw0n6w/

问题: 有没有更好的方法来创建具有我以后可以参考的 ID 的标记?我还能如何将markersID 添加到markerClusterGroup?

【问题讨论】:

    标签: javascript leaflet markerclusterer leaflet.markercluster


    【解决方案1】:

    有没有更好的方法来创建具有我以后可以参考的 ID 的标记?

    有一些可行的方法:-)

    我还能如何将markersID 添加到markerClusterGroup?

    由于您的 markersID 是一个普通对象,因此您不能。 addLayer 接受标记或层组(如您的 L.geoJson),addLayers 接受标记的数组。

    不要将稍后引用标记的需要与将它们添加到标记簇组的需要混为一谈。

    发生的情况是,在您的 onEachFeature 中,您复制您在 markersID 中的标记(创建新标记),而不是保留对由 @ 构建的相同 layer 的引用987654333@。如果您只保留对layer 的引用,那么您可以直接引用那些标记,您可以直接将您的L.geoJson 图层组添加到您的标记集群组:

    var markersID = {};
    
    var geoJsonLayer = L.geoJson(individualPoints, {
      onEachFeature: function(feature, layer) {
        // make a marker with that number
        // actually no need to duplicate the marker.
        //markersID[feature.properties.id] = L.marker(switchLatLong(feature.geometry.coordinates));
        markersID[feature.properties.id] = layer;
      }
    });
    
    markers.addLayer(geoJsonLayer); // this works
    map.addLayer(markers);
    
    // This will work, you just need to get the appropriate `id`.
    markers.removeLayer(markersID[id]);
    

    演示:https://jsfiddle.net/anfw0n6w/1/

    【讨论】:

    • 哇——非常感谢!这正是我所需要的。我非常感谢您阐明了标记组和图层之间的区别。 :-)
    • 感谢您的反馈,我也很感激! :-)
    • 在 Leaflet 词汇表中,您可以添加到地图中的所有内容(控件除外)都是 layer :标记、图层组、切片图层等。至于你的markersID,在JavaScript 中,{} 使它成为object,也就是关联数组或字典。 [] 会使其成为 array,这实际上是一种特定类型的对象。
    • 嗯,好吧,这是有道理的。谢谢你。作为对我自己和其他人的说明,我能够通过将 markersID 定义为一个数组来获得我的原始解决方案(尽管仍然复制标记,并且需要更新 individualPoints 的 id 值以产生第 0 个条目) .小提琴:jsfiddle.net/anfw0n6w/3。您的解决方案绝对更清洁。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多