问题描述
现在,当我点击父集群时,我想将自定义图标应用到父集群的所有子集群到子集群的底部。
我尝试收集所有子集群并将图标应用于它们,但它不起作用。
cluster.on('clusterclick',(e) => {
const childClusters = e.layer._childClusters;
for(const c of childClusters){
c.options.icon = this.getSelectedClusterIcon();
}
});
解决方法
如果我理解正确,您想更改被点击的“子”簇的外观,即放大时出现的那些(但不是单个 >标记在放大到足够大时最终会出现)?
在这种情况下,您可以依赖 Leaflet.markercluster iconCreateFunction
option 和 refreshClusters
method:
- 使用
iconCreateFunction
创建您的 MCG,它依赖于一些标志来生成不同的图标。 - 在点击事件侦听器中,用某种标志标记所有单独的子标记。正如 Ivan 所指出的,您可以使用
getAllChildMarkers
method 来检索这些标记。 - 使用
refreshClusters
method 请求 MCG 在这些标记的父集群上重新评估您的iconCreateFunction
。 - 如果您想更改仅属于某个缩放级别的集群的图标(例如,被点击的,和/或直接子集群的 1 级),您可以将这些缩放级别存储在一些状态,并将它们与
_zoom
中集群的iconCreateFunction
属性进行比较。 - 如果您想重置集群,只需清除标志并再次调用
refreshClusters
方法。
以下内容:
const mcg = L.markerClusterGroup({
iconCreateFunction(cluster) {
const isHighlighted = cluster.getAllChildMarkers().some((marker) => marker.flaggedZooms && marker.flaggedZooms[cluster._zoom]);
return isHighlighted ? myIconHighlighted : myNormalIcon;
},}).on("clusterclick",function (e) {
// In case we want to reset all other Clusters
mcg.eachLayer((marker) => delete marker.flaggedZooms);
const cluster = e.layer;
// Mark the zoom level on the child Markers,// in case we want to change cluster icons only on some zoom
for (const marker of cluster.getAllChildMarkers()) {
marker.flaggedZooms = marker.flaggedZooms || {}; // Initialize if not already done
marker.flaggedZooms[cluster._zoom + 1] = true; // Flag other zoom levels if desired
}
// Ensure Clusters icons are redrawn
mcg.refreshClusters();
});