当单击父群集时,传单标记群集将自定义图标添加到所有子群集

问题描述

我有多个级别的标记集群(子集群可以有集群等等)。

现在,当我点击父集群时,我想将自定义图标应用到父集群的所有子集群到子集群的底部

我尝试收集所有子集群并将图标应用于它们,但它不起作用。

cluster.on('clusterclick',(e) => {
  const childClusters = e.layer._childClusters; 
  for(const c of childClusters){
    c.options.icon = this.getSelectedClusterIcon();
  }
});

解决方法

如果我理解正确,您想更改被点击的“子”的外观,即放大时出现的那些(但不是单个 >标记在放大到足够大时最终会出现)?

在这种情况下,您可以依赖 Leaflet.markercluster iconCreateFunction optionrefreshClusters method

  1. 使用 iconCreateFunction 创建您的 MCG,它依赖于一些标志来生成不同的图标。
  2. 在点击事件侦听器中,用某种标志标记所有单独的子标记。正如 Ivan 所指出的,您可以使用 getAllChildMarkers method 来检索这些标记。
  3. 使用 refreshClusters method 请求 MCG 在这些标记的父集群上重新评估您的 iconCreateFunction
  4. 如果您想更改仅属于某个缩放级别的集群的图标(例如,被点击的,和/或直接子集群的 1 级),您可以将这些缩放级别存储在一些状态,并将它们与 _zoom 中集群的 iconCreateFunction 属性进行比较。
  5. 如果您想重置集群,只需清除标志并再次调用 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();
});

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...