Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang中最近点的计算_Go_Geolocation_Geo - Fatal编程技术网

Golang中最近点的计算

Golang中最近点的计算,go,geolocation,geo,Go,Geolocation,Geo,我是一个需要返回到另一个最近点的人。我在想,一定有比每次计算距离更好的方法 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.Po

我是一个需要返回到另一个最近点的人。我在想,一定有比每次计算距离更好的方法

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
}
func(地点)最近(w地点)(c地点){
c=位置[0]
截止时间:=w点大圆周距离(c点)
对于u,p:=范围位置[1:]{
距离:=w点大圆周距离(p点)
如果距离<最近距离{
//设定回报
c=p
//记录最近距离
最近距离=距离
}
}
返回
}

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

您可以将整个平面拆分为网格,这些网格可以由点的纬度和经度的O(1)运算决定,如
(int(lat)/10,int(lng)/10)
。为5000个点和每个网格中的每个点预先计算网格和点之间的最大和最小距离。为每个栅格保留一组可能产生最小距离的点。有了一个好的划分算法(通常只是用一定的数字划分纬度和经度就足够了),集合应该非常小,比如不超过10个点

因此,当您得到一个查询时,您可以立即得到该点所在的网格,并有一个小的点列表,可以作为壁橱。只需在它上面循环并找到一个

计算“最小”和“最大”距离很简单,只需注意一些特殊情况。保持一个电流(最小值,最大值)可以维持设定值:当计算一对新的(最小值,最大值)时,将其与当前值进行比较。如果maxImax,则不会发生任何事情。否则,只需添加新对并相应地更新最小/最大值


我目前使用手机,因此无法提供代码。如果您需要代码来查看它是如何完成的,我会在以后添加它。

查找库是非主题。对于优化:预计算并保存最近邻居/距离是的,我对代码感兴趣,甚至更好。。一些现有的图书馆功能