给定一组地理位置(以纬度/经度的形式),我将如何找到最受欢迎的位置?
例如,我编译了一张包含各种点的地图:
我们可以看到,除了 1、4、6 和 9 之外,所有点都集中在大约一个位置。我如何计算该组的平均位置?理想情况下,随着地图的人口越来越多,我想计算第二个最受欢迎的位置,第三个最受欢迎的位置等。
我怎么能解决这个问题?
提前致谢。
给定一组地理位置(以纬度/经度的形式),我将如何找到最受欢迎的位置?
例如,我编译了一张包含各种点的地图:
我们可以看到,除了 1、4、6 和 9 之外,所有点都集中在大约一个位置。我如何计算该组的平均位置?理想情况下,随着地图的人口越来越多,我想计算第二个最受欢迎的位置,第三个最受欢迎的位置等。
我怎么能解决这个问题?
提前致谢。
如果您需要一个简单的解决方案,它会给您一个很好的估计并且易于编码......
如何将距离转换为纬度和经度?将经度纬度转换为米
例如,1 度的纬度在 110574 和 111693 米之间。
DBSCAN 算法可能是您正在寻找的。
它是一种根据密度找到点簇的算法。由于在您的情况下,流行意味着密集,您可以使用它来解决此任务。它需要两个参数:
您还需要一个函数来测量点之间的距离。由于您有(纬度,经度)对(通常为WGS84 格式),因此您需要Haversize 距离。
该算法有多种实现方式。如果您使用的是Java,Apache Commons Math提供了一个不错的实现(有关更多详细信息和一些代码片段,请参见此处)。调用eps = 1.0(半径为 1 公里)和DBSCANClusterer
minPts = 0 (集群有 1 个或更多点)。请参阅此答案以实现Haversine 距离(确保与eps使用的相同测量单位匹配)。最后通过减小大小对集群进行排序,使其按“受欢迎程度”排序:
Collections.sort(clusters, (o1, o2) ->
Integer.compare(o2.getSize(), o1.getSize());
Cluster<? extends Clusterable> mostPopular = clusters.get(0);
如果我没记错的话,这个实现解决了关于它的大小(点数)的二次时间问题。如果您将面临的问题的所有实例都与您的示例具有相同的大小,那么您将没有问题。