我正在开发一种基于地理坐标找到最近的人的实现。例如,人 A 具有坐标(经度和纬度) m ,我想找到半径为 m 的圆内的人 X 。
我计划将地理坐标存储在MySQL数据库中,搜索最近坐标的有效方法是什么?
我的具体问题是:
但是,我认为计算数据库中的坐标数量是否很大是不太有效的。
实现此应用程序的更好方法是什么?
答案 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的网格技术的一些图像。
将地球分解为多层网格。
找到哪些网格包含部分或全部对象(方形,圆形,等等)..
这种技术可以非常快速地包含和排除,而无需计算每个物体的距离(耗费时间疯狂)。