什么是基于地理坐标在圆圈中找到点的有效算法?

时间:2014-06-27 20:57:40

标签: algorithm search coordinates

我正在开发一种基于地理坐标找到最近的人的实现。例如,人 A 具有坐标(经度和纬度) m ,我想找到半径为 m 的圆内的人 X

我计划将地理坐标存储在MySQL数据库中,搜索最近坐标的有效方法是什么?

我的具体问题是:

  1. 哪些字段应存储在数据库中以进行有效搜索?我打算只存储人的坐标。
  2. 找到最近的人的算法是什么?我计划计算人A坐标与数据库中坐标存储之间的距离。
  3. 但是,我认为计算数据库中的坐标数量是否很大是不太有效的。

    实现此应用程序的更好方法是什么?

2 个答案:

答案 0 :(得分:0)

一个简单的毕达哥拉斯定理应用:

-- The coordinates of the person at the center of the "circle"
set @x0 = (select x from persons where id=1),
    @y0 = (select y from persons where id=1);
-- Calculate the distance for each point in the persons table, excluding the "center"
select *, sqrt(pow(x - @x0, 2) + pow(y - @y0, 2)) as distance
from persons
where id != 1
order by sqrt(pow(x - @x0, 2) + pow(y - @y0, 2))

答案 1 :(得分:0)

我意识到这是专门讨论SQL Server而不是MySql。但是,这并不意味着您无法实现类似的解决方案。 (似乎MySql has Spatial Indexes)。

这是使用网格在多种数据库技术中实现的。有一个很棒的视频深入探讨了网格坐标如何在名为Creating High Performance Spatial Database的sql位上工作。

以下是来自MSDN Spatial Indexing Overview的网格技术的一些图像。

将地球分解为多层网格。

enter image description here

找到哪些网格包含部分或全部对象(方形,圆形,等等)..

enter image description here

这种技术可以非常快速地包含和排除,而无需计算每个物体的距离(耗费时间疯狂)。