Algorithm 计算多个地理点之间距离的算法

Algorithm 计算多个地理点之间距离的算法,algorithm,google-maps,google-maps-api-3,geometry,geospatial,Algorithm,Google Maps,Google Maps Api 3,Geometry,Geospatial,我有一个矩阵,大约有1000个地理空间点(经度、纬度),我正试图找到1公里范围内的点 注意:“这些点是动态的,假设1000辆车在移动,因此我必须每隔几秒钟重新计算所有距离” 为了解决这个问题,我做了一些搜索,读了一些关于图算法的书,比如(Floyd–Warshall),最后我得到了很多关键词,现在我有点迷路了。我在考虑性能,因为搜索半径很短,所以我不会考虑地球的曲率。 基本上,我必须计算每个点到其他点之间的距离,然后从矩阵中的每个点开始对距离进行排序,得到其范围内的点。因此,如果我有1000个坐

我有一个矩阵,大约有1000个地理空间点(经度、纬度),我正试图找到1公里范围内的点

注意:“这些点是动态的,假设1000辆车在移动,因此我必须每隔几秒钟重新计算所有距离”

为了解决这个问题,我做了一些搜索,读了一些关于图算法的书,比如(Floyd–Warshall),最后我得到了很多关键词,现在我有点迷路了。我在考虑性能,因为搜索半径很短,所以我不会考虑地球的曲率。
基本上,我必须计算每个点到其他点之间的距离,然后从矩阵中的每个点开始对距离进行排序,得到其范围内的点。因此,如果我有1000个坐标,我必须执行这个过程(1000^2-1000)次,我不认为这是最佳解决方案。谢谢。

您可以计算1000个坐标周围1公里范围的地理代码,并检查是否有一些点在该范围内。这可能不是最佳的,但您可以节省一些排序。

在您的情况下,您应该查看允许您快速查询给定距离内的坐标的


仅供参考,MongoDB在内部使用geohash,它的性能非常出色。

如果您制作一个网格间距为1公里的模型:

  0   1    2    3
 ___|____|____|____
0   |    |    |
   c|   b|a   |   d
 ___|____|____|____
1   |    |    |
    |    |f   |
 ___|e___|____|____
2   |    |g   | 
假设你的出发点是a。 如果网格大小为1km,则1km范围内的点必须位于同一单元格或8个相邻单元格中的一个(点b、点d、点e、点f)

其他每个单元格都可以忽略(c,g)

虽然d与a的距离与c的距离几乎相同,但c可以提前下降,因为有两个障碍物需要跨越,而a和d位于其边界的相对区域,因此彼此之间的距离接近2公里

对于元素的早期删除,您可以排除,检查坐标的x或y部分就足够了。由于a属于(0,2),如果x为0或更小,或>3,则该点已超出范围


仅筛选少数候选项后,可以使用穷举搜索

如果您想查找每个点与每个点的矩阵,那么您已经得到了正确的公式(1000^2-1000)。这个计算没有捷径可走。但是,当您知道从何处开始搜索,并且希望查找1公里半径内的点时,可以使用网格或空间算法来加快查找速度。最有可能的是它使用了分治算法,最便宜的是geohash或z曲线。你也可以试试kd树。也许这更简单。但是如果你的点在euklidian空间,那么这里有一个平面方法


编辑:当我说1000^2-1000时,我指的是网格的大小,但实际上是1000^(1000− 1) /2对点,所以数学计算要少得多。

我想我在一个网页上看到了类似的东西。用户单击地图上的一个位置并输入半径,函数返回给定半径内数据库中的所有位置。你的意思是说你正在试图找到半径内一个点1公里以内的点吗?或者你是想找到彼此相距1公里以内的点?我想你应该这样做

radius = given radius
x1 = latitude of given point;
y1 = longitude of given point;
x2 = null;
y2 = null;
x = null;
y = null;
dist = null;

for ( i=0; i<locationArray.length; i++ ) {
    x2 = locationArray[i].latitude;
    y2 = locationArray[i].longitude;
    x = x1 - x2;
    y = y1 - y2;
    dist = sqrt(x^2 + y^2);
    if (dist <= radius)
        these are your points
}
radius=给定半径
x1=给定点的纬度;
y1=给定点的经度;
x2=零;
y2=零;
x=零;
y=null;
dist=null;

对于(i=0;i尝试使用R-树。R-树支持查找距离给定点最近且不超过给定半径的所有点的操作。执行时间是最佳的,我认为是O(结果中的点的数量)。

我有同样的问题,但在web服务开发中
在我的例子中,为了避免计算时间问题,我使用了一种简单的分而治之的解决方案:其思想是在每次插入新数据时开始计算新点与其他点之间的距离,以便我的应用程序直接访问已经计算并放入我的数据库中的两个点之间的距离假设问题与最近的点对问题有关,检查此项以供进一步参考。您是在寻找距离特定纬度/经度1KM以内的点,还是在寻找彼此距离1KM以内的点?每个点都应该找到距离它1KM范围内的所有点。是的,我写了一些关于但这一直让人分心。您可以使用哈希来查找附近的内容,这样就不必直接比较所有1000个内容。此外,您不需要对任何内容进行排序。只需创建一个新的数据结构(最好使用O(1)插入时间——如果需要排序的结果,可以使用O(logn)插入树结构)并为每个点保留一个距离<1公里的所有点的列表。删除任何距离>1公里的点。有趣的建议,但如果使用geohash,该数据模型是什么?@Jasonw:geohash只是一条z曲线或一条morton曲线。这是一种分层聚类算法,最简单、最便宜。(.最便宜,因为它不是最优的。@David:好的,阅读morton order,但并不真正了解geohash的数据模型morton order可以有效地查询我在考虑类似的事情,但我们需要得到点的方向,例如,如果我知道(g)距离(f)南部1公里,(a)距离(f)1公里从北部开始,扫描(a)周围的点时,将排除从(g)到南部的所有点。我们只需在第一时间执行完全搜索,以确定所有点与一个点的关系,然后由于点之间的关系将更加紧密,因此可能性将降低。“算法从点的位置学习”我不知道还在思考!是的,这是基本的蛮力搜索,如果我有1000个点,那么我有100万个计算!在我的例子中,点是动态的,所以我有