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' 标记时,它不会呈现它们。我已经检查了所有类似的实例(相同的纬度、经度等),而经理只呈现了一项。
我还尝试通过向纬度和经度添加一个非常小的随机分数来调整每个 ClusterItem
s 位置变量,并通过添加随机字符串来调整标题和摘要,但没有成功差异。
我在 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 类型。
我正在使用 ClusterManager
来聚类可能有数千个标记。默认聚类显示 10+、100+、500+ 等值,我需要显示确切的值。
因此我推翻了 getClusterText(bucket: Int): String
。当完全缩小时,地图上显示的一个集群将显示 3987,但我将 4000 个标记传递给集群管理器。
然后我认为它与缓存或其他东西有关,所以我放大看是否所有标记都在预期的位置。你瞧,当同一地点有两个或更多标记(相同的纬度和经度)以及相同的标题和片段(我猜)时,似乎只显示其中一个,就好像经理正在删除它认为是重复的。
如果现场确实有两个或更多,我希望它能将它们聚集在一起,就像在其他区域所做的那样(见下图)。
我在将标记传递给集群管理器时已经验证它们确实有 4000 个计数。但是缩小集群后,只有 4000-x
有趣的是,我有一个使用相同数据的 iOS 项目,它在添加到地图之前报告 4000,当完全缩小时,它也显示 4000 和所有预期的标记。
如您所见,集群运行良好。但是,当有两个 'same' 标记时,它不会呈现它们。我已经检查了所有类似的实例(相同的纬度、经度等),而经理只呈现了一项。
我还尝试通过向纬度和经度添加一个非常小的随机分数来调整每个 ClusterItem
s 位置变量,并通过添加随机字符串来调整标题和摘要,但没有成功差异。
我在 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 类型。