鉴于一组地理定位,我如何找到最受欢迎的地点?

时间:2013-01-28 20:00:23

标签: algorithm geolocation

给定一组地理位置(以纬度/经度的形式),我将如何找到最受欢迎的位置?

举个例子,我编写了一个包含各种要点的地图:

Map Link

我们可以看到 - 除了1,4,6和9之外 - 所有点都在大约一个位置进行分组。我怎么能计算出这个群体的平均位置?理想情况下,随着地图人口越来越多,我想计算第二个最受欢迎的位置,第三个最受欢迎的位置等。

我怎么能解决这个问题?

提前致谢。

2 个答案:

答案 0 :(得分:5)

如果您需要一个简单的解决方案,可以为您提供良好的估算并且易于编码...

  • 选择您认为位置大小的半径(我们会说100米)
  • 遍历您的位置,使其成为您圈子的中心
  • 使用Point-in-Circle
  • 计算圆圈内有多少个其他点
  • 圈内点数最多的位置成为您最受欢迎的位置,现在从您的套装中移除所有这些点,并重复第2个最受欢迎的点到最受欢迎的点。

如何将距离转换为纬度&经度? transform longitude latitude into meters

例如,1度纬度介于110574和111693米之间。

答案 1 :(得分:2)

DBSCAN algorithm可能就是你要找的东西。

它是一种基于密度找到点群的算法。 因为在你的情况下流行意味着密集,你可以用它来解决这个任务。 它需要两个参数:

  • eps ,每个点周围的半径,在其中寻找其他点以形成群集,
  • minPts ,在一个点周围的半径范围内所需的点数,将该组节点视为一个集群。

您还需要一个测量点之间距离的功能。由于您拥有(纬度,经度)情侣(通常采用 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);

如果我没记错的话,这个实现就其大小(点数)的二次时间问题解决了问题。如果您将遇到的问题的所有实例都与您的示例大小相同,那么您将没有任何问题。