GeoJSON 层更改后刷新标记簇

Refresh marker clusters after GeoJSON layer has changed

我正在设置一个 GeoJSON 层,并在其之上设置一个 MarkerCluster 层

this.itemLayer = L.geoJson(items, layerOptions)
this.clusterLayer = L.markerClusterGroup()
this.clusterLayer.addLayer(this.itemLayer)
this.clusterLayer.addTo(this.map)

更新后我正在做:

this.itemLayer.clearLayers()
this.itemLayer.addData(newItems)
this.clusterLayer.refreshClusters(this.itemLayer)

但是集群没有出现,itemLayer

中的项目也没有出现

解决方案

this.itemLayer.clearLayers()
this.itemLayer.addData(this.props.items)
this.clusterLayer.clearLayers()
this.clusterLayer.addLayer(this.itemLayer)
不幸的是,

Leaflet.markercluster 不会跟踪图层组(比如您的 this.itemLayer GeoJSON 图层组)。当将组传递给 clusterLayer.addLayer() 时,MCG 将从该组中提取所有单独的(即非组)层,并忘记对该组的任何引用。

另见 Leaflet.markercluster issue #647

因此,当使用 this.itemLayer.clearLayers() 清除您的组时,它有效地删除了 this.itemLayer 中的所有子项,但 this.clusterLayer 不受影响。

与向 this.itemLayer 添加数据时类似,该组会创建新的子层,但 MCG 不受影响。

然后在调用this.clusterLayer.refreshClusters(this.itemLayer)的时候,this.itemLayer的子层的none是this.clusterLayer的一部分,所以最后会出现意想不到的效果(可能什么都不做)特别)。

如果要更改群集层,请确保将它们从 MCG 中删除(例如,只需执行 this.clusterLayer.clearLayers()),然后将新层添加回其中。您也可以删除当前的 MCG 并构建一个新的。