0

我正在使用 aClusterManager来聚类潜在的数千个标记。默认聚类显示 10+、100+、500+ 等值,我需要显示确切的值。

因此,我推翻了getClusterText(bucket: Int): String. 当完全缩小时,地图上显示的一个集群将显示 3987,但我将 4000 个标记传递给集群管理器。

然后我认为它与缓存或其他东西有关,所以我放大以查看是否所有标记都在预期的位置。瞧,似乎当在同一位置(相同的纬度和经度)以及相同的标题和片段(我猜)有两个或多个标记时,只显示其中一个,好像经理正在删除它认为是重复的。

如果现场确实有两个或更多,我希望它将它们聚集在一起,就像在其他区域一样(见下图)。

在将标记传递给集群管理器时,我已经验证它们确实是 4000 个计数。但是在缩小集群时,只有 4000-x

有趣的是,我有一个使用相同数据的 iOS 项目,它在添加到地图之前报告 4000,当完全缩小时,它还显示 4000 和所有预期的标记。

在此处输入图像描述

如您所见,集群工作正常。但是,当有两个“相同”标记时,它不会呈现它们。我检查了所有类似的实例(相同的纬度、经度等),经理只渲染了一项。

我还尝试ClusterItem通过在 lat 和 long 中添加一个非常小的随机分数来调整每个 s 位置变量,并通过添加随机字符串来调整标题和片段,但没有任何区别。

ClusterManager 或其他地方有我遗漏的东西吗?

我目前无法发布代码

更新

我检查了我的 json 响应,并且在那个地方确实有两个项目具有相同的数据/信息(这是必需的并且需要显示)。仍在试图弄清楚为什么它没有将它们聚集在一起。

在此处输入图像描述

4

2 回答 2

1

长话短说:

ClusterItem实际上是一个子类ArrayList<Double>(因为我的json的结构)。结果,clusterManager 肯定会在幕后忽略重复项。它如何确定两个 ArrayLists(对我来说是 clisterItem)似乎是通过检查内容的相等性而不是实例本身。因此,如果两个 ArrayList(对我来说是 ClusterItem)具有相同的内容,那么它们是相同的。

长话短说:

这是我对 clusterItem 的定义:

public final class CrimeQueryItem : ArrayList<Double>, ClusterItem{
    //pseudocode here!
    longitude: this[0]
    latitude: this[1]
    position: LatLng(latitude, longitude)
}

通过最终猜测两个 CrimeQueryItem 是否相同,如果它们的数组具有相同的内容,我决定重写该equals函数:

override fun equals(other: Any?): Boolean {
    return this === other
}

现在这会导致完整的实例相等性检查而不是结构检查。

现在标记按预期显示:

在此处输入图像描述

现在我没有更多的计数差异:

在此处输入图像描述

结论: 我认为 map 检查它是否已经添加了一个项目,如果是,它会跳过它。在我的情况下,如果它们具有相同的内容,则两个标记相同,因为它们是 ArrayList 类型。

于 2020-01-09T02:10:25.937 回答
0

“但是,当有两个‘相同’标记时,它不会渲染它们。我检查了所有类似的实例(相同的纬度、经度等),经理只渲染一个项目。”

可能它确实渲染了,但是在相同的屏幕位置,所以我们可以看到它就像一个单独的一样。因此,不要创建具有相同坐标的标记 - 手动添加一些“增量”(以像素为单位,因为可能是纬度和经度的分数部分太小)到第二个和其他标记的坐标。您可以使用Projection.toScreenLocation()获取标记的屏幕像素坐标,添加5(像素)或更多xy然后用于Projection.fromScreenLocation()获取LatLng标记的坐标。

它可能是更复杂的算法 - 您需要确定具有完全相同位置的标记数量,而不是将它们放置在例如位置的“中心”周围。或类似的东西。

于 2020-01-08T19:48:41.683 回答