给定一组地理位置(以纬度/经度的形式),我将如何找到最受欢迎的位置?
举个例子,我编写了一个包含各种要点的地图:
我们可以看到 - 除了1,4,6和9之外 - 所有点都在大约一个位置进行分组。我怎么能计算出这个群体的平均位置?理想情况下,随着地图人口越来越多,我想计算第二个最受欢迎的位置,第三个最受欢迎的位置等。
我怎么能解决这个问题?
提前致谢。
答案 0 :(得分:5)
如果您需要一个简单的解决方案,可以为您提供良好的估算并且易于编码...
如何将距离转换为纬度&经度? transform longitude latitude into meters
例如,1度纬度介于110574和111693米之间。
答案 1 :(得分:2)
DBSCAN algorithm可能就是你要找的东西。
它是一种基于密度找到点群的算法。 因为在你的情况下流行意味着密集,你可以用它来解决这个任务。 它需要两个参数:
您还需要一个测量点之间距离的功能。由于您拥有(纬度,经度)情侣(通常采用 WGS84格式),Haversize distance就是您所需要的。
该算法有几种实现方式。如果您使用 Java ,Apache Commons Math提供了一个不错的实现(有关更多详细信息和一些代码段,请参阅here)。使用 eps = 1.0 (半径为1 km)和 minPts = 0 调用DBSCANClusterer
(集群有1个或多个点)。请参阅this answer以实现 Haversine距离(确保与用于 eps 的相同测量单位匹配)。最后,通过减小大小来对群集进行排序,使其按照"流行度":
Collections.sort(clusters, (o1, o2) ->
Integer.compare(o2.getSize(), o1.getSize());
Cluster<? extends Clusterable> mostPopular = clusters.get(0);
如果我没记错的话,这个实现就其大小(点数)的二次时间问题解决了问题。如果您将遇到的问题的所有实例都与您的示例大小相同,那么您将没有任何问题。