Kotlin GoogleMaps ClusterManager returns 集群项目大小小于最初传递给它的项目大小

Kotlin GoogleMaps ClusterManager returns cluster items size smaller than size of items initially passed to it

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

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

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

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

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

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

如您所见,集群运行良好。但是,当有两个 'same' 标记时,它不会呈现它们。我已经检查了所有类似的实例(相同的纬度、经度等),而经理只呈现了一项。

我还尝试通过向纬度和经度添加一个非常小的随机分数来调整每个 ClusterItems 位置变量,并通过添加随机字符串来调整标题和摘要,但没有成功差异。

我在 ClusterManager 或其他地方遗漏了什么吗?

我目前无法post代码

更新

我检查了我的 json 回复,确实有两个项目具有相同的 data/information(这是必需的,需要显示)。 仍在尝试弄清楚为什么它没有将它们聚类。

"However when there are two of the 'same' markers it doesn't render them. I have checked on all similar instances (same lat, long, etc) and the manager just renders one item. "

可能它确实渲染了,但是在同一个屏幕位置,所以我们可以看到它就像一个一样。所以,不要创建具有相同坐标的标记 - 手动添加一些 "delta"(以像素为单位,因为可能是你的纬度和经度的小数部分太小)到第二个和其他标记的坐标。您可以使用 Projection.toScreenLocation() to get screen pixel coordinates of marker, add 5 (pixels) or more to x and y and then use Projection.fromScreenLocation() 获取标记的 LatLng 坐标。

这可能是更复杂的算法 - 您需要确定具有完全相同位置的标记的数量,而不是将它们放置在例如 "center" 附近的位置。或者类似的东西。

长话短说:

我的ClusterItem其实是ArrayList<Double>的子类(因为我的json的结构)。结果,clusterManager 肯定会在幕后忽略重复项。它如何确定两个 ArrayList(对我来说是 clisterItem)似乎是由 checking the equality of the contents 而不是实例本身。因此,如果两个 ArrayList(对我来说是 ClusterItem)具有相同的内容,那么它们就是相同的。

长话短说:

这是我对 clusterItem 的定义:

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

通过最终猜测两个 CrimeQueryItem 是相同的,如果它们是 have the same contents 的数组,我决定重写 equals 函数:

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

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

现在标记按预期显示:

现在我没有更多的差异

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