计算Golang中的最近点

时间:2018-09-23 06:24:19

标签: go geolocation geo

我是writing a lambda function,需要将最接近的点返回到另一点。我在想,必须有一种比计算每次到all 5000 points的距离更好的方法。

func (places Places) closest(w place) (c place) {
    c = places[0]
    closestSoFar := w.Point.GreatCircleDistance(c.Point)
    for _, p := range places[1:] {
        distance := w.Point.GreatCircleDistance(p.Point)
        if distance < closestSoFar {
            // Set the return
            c = p
            // Record closest distance
            closestSoFar = distance
        }
    }
    return
}

如果您可以查看代码并指向我应该使用的库,我将不胜感激。我也想对不同的方法进行基准测试,所以我想知道如何定义它。我认为目前我的方法在i7系统上需要约0.025s。也许我在这里做的是过早的优化?由于我的巴士站数据可能不会超过1万点。

1 个答案:

答案 0 :(得分:2)

您可以将整个平面划分为网格,这些网格可以由点的经度和纬度的O(1)运算来确定,例如(int(lat) / 10, int(lng) /10)。对于5000个点中的每个点和每个栅格,预先计算栅格与该点之间的最大和最小距离。为每个网格维护一组可能会产生最小距离的点。有了良好的除法算法(通常只需将经度和纬度除以一定的数字就足够了),该集合应该很小,最多不超过10个点。

因此,当您进行查询时,可以立即获得该点所在的网格,并且具有可以作为壁橱的一小部分点。只需在其上循环并找到一个即可。

计算最小和最大距离很简单,在某些特殊情况下要小心。可以通过保持当前(min,max)来完成对集合的维护:当计算出新的一对(minI,maxI)时,将其与当前对进行比较。如果maxI max,则什么也不会发生。否则,只需添加新的配对并相应地更新最小/最大。

我目前正在移动设备上,因此我无法提供代码。如果您需要代码来查看完成方式,请稍后再添加。