标记聚合器:检查标记是否在聚类中。

6
我有一个基于Web的地图,使用jquery-ui-mapmarkerclusterer插件制作谷歌地图。
我筛选出应该显示或不显示的标记,然后更新地图。
我需要创建一个未聚类标记的列表,因此需要一种方法来检查聚类与标记,并找出哪些未聚类。
有没有技术可以做到这一点?
我已经尝试循环遍历聚类并手动检查聚类与标记,但出现错误告诉我聚类属性var_clusterer.clusters_未定义。
3个回答

8

注意:此解决方案使用 MarkerClustererPlus 库。

您可以使用 getClusters() 方法来获取 MarkerClusterer 当前处理的所有聚合对象的数组。

var clusterManager = new MarkerClusterer( googleMap, markersArray, clusterOptions ); // setup a new MarkerClusterer

var clusters = clusterManager.getClusters(); // use the get clusters method which returns an array of objects

for( var i=0, l=clusters.length; i<l; i++ ){
    for( var j=0, le=clusters[i].markers_.length; j<le; j++ ){
        marker = clusters[i].markers_[j]; // <-- Here's your clustered marker
    }
}

使用getClusters()获取数组后,循环遍历集群对象。对于每个集群,您可以提取当前的markers_数组并检索聚合标记。

现在在文档中已经有了getClusters():MarkerClustererPlus 文档


好消息和坏消息... 好消息是:我自己找到了答案。它与你描述的完全一样。坏消息是:我花了一个多星期寻找答案 :-P 。有类似问题的其他人应该按照上述方法操作。谢谢你的回答。 - jaget
4
您是否正在使用MarkerClustererPlus?因为在普通的MarkerClusterer中没有getClusters()方法。 - Dejan Stuparic
1
如果您查看文档,它们清楚地显示了getClusters()方法。 - hitautodestruct
2
对我来说它不存在,我不得不使用 var clusters = clusterManager.clusters_; - Dejan Stuparic
6
对于使用google.maps V3的用户,应该注意到clusterer.getClusters()会返回所有聚类,包括只有一个标记的聚类(即显示为标记而不是聚类)。如果您想知道特定标记是否真正聚集,则在循环遍历时,您必须仅测试长度大于1的聚类中的标记。 - Beetroot-Beetroot
1
@hitautodestruct - 你指出的链接确实是 MarkerClustererPlus 插件,这是 @DejanStuparic 为了获得 getClusters() 功能而提到的原始 MarkerClusterer 库的附加功能。 - hellatan

4

注意:使用 MarkerClustererPlus 版本为 2.1.10。

isMarkerClustered(marker: Marker, clusterer: MarkerClusterer): boolean {
   const clusters = clusterer.getClusters();
   for (let i = 0, l = clusters.length; i < l; i++) {
      const markers = clusters[i].getMarkers();
      for (const m of markers) {
        if (m === marker && markers.length > 1) {
          return true;
        }
      }
    }
    return false;
}

2

一种略显笨拙但有效的方法是......

您可以将标记逐个插入到标记聚合器对象中,并立即在(1)之前和(2)之后调用它的.getTotalCluster() 方法,以查看新添加的标记是否会进入聚类。

我使用了这种方法,因为 getClusters() 对我不起作用,可能我没有通过jquery 使用它。

var old_cluster_val = markerCluster.getTotalClusters(); // <-----(1)
     markerCluster.addMarker( marker );
var new_cluster_val = markerCluster.getTotalClusters(); // <-----(2)

if (old_cluster_val == new_cluster_val) {
    in_a_cluster.push(marker);  
} else {
    not_in_cluster.push( marker );
}

1
虽然数组中显然有11个标记,但使用markerCluster.getTotalClusters()总是返回0,可能的问题是什么? - suMi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接