从一组坐标中找到最近的坐标

时间:2016-11-12 08:21:38

标签: javascript node.js algorithm

我有大约1000套地理坐标(纬度,长度)。 给定一个坐标,我想找到该集合中最接近的坐标。我的方法是测量距离,但是对于服务器进行所有数学计算,每秒数百个请求可能有点粗糙。

对此最好的解决方案是什么?

谢谢

4 个答案:

答案 0 :(得分:4)

您需要使用'Nearest Neighbor Algorithm'

答案 1 :(得分:2)

您可以使用此库sphere-knn,或查看类似PostGIS的内容。

答案 2 :(得分:1)

为什么不从集合中选择潜在的最近点(例如,设置一个阈值,比如0.1并过滤该集合,以便在目标点的两个轴上都有+ -0.1的任何点)。然后在这个集合上进行实际计算。

如果没有一个在第一个范围内,只需将它放大(0,2)并重复(0.3,0.4 ......)直到你得到一个匹配。显然你会调整阈值,以便最符合你可能的结果。

(我假设时间调查位是实际距离计算,所以我们的想法是限制计算次数。)

答案 3 :(得分:1)

算法响应

您的方法已经及时O(n)。它在算法上非常快,而且实现起来相当简单。

如果这还不够,你应该考虑看看R-trees。 R树背后的想法大致转述如下:

  1. 您已经拥有一组 n 元素。您可以预处理此数据,以形成区域的粗略“正方形”,每个区域包含一组点,并具有已建立的边界。
  2. 现在说一个新元素进来了。不是通过每个坐标进行比较,而是通过比较点是否小于边界来识别它所属的“方形”,并且那么只用那个方格内的点来测量距离。
  3. 您可以立即看到好处:

    • 您不再与所有坐标进行比较,而是仅与边界(严格小于所有元素的数量)进行比较,然后与您选择的边界内的坐标数量进行比较(也小于所有元素的数量)。
    • 此类算法的上限O(n)时间。下限平均可以是O(log n)

    主要的改进主要在于预处理步骤(“免费”,因为它是一次性成本)以及所需的比较数量减少。

    系统响应

    只需购买另一台服务器,并使用负载均衡器(如Haproxy)分发请求和元素。

    服务器相当便宜,特别是如果它们对您的业务至关重要,并且如果您想要快速,那么这是一种简单的扩展方式。