纬度/经度坐标之间的距离的解决方案称为Haversine公式。这很复杂,因为除非您的距离很短,否则您需要考虑地球的曲率。
这是有关使用PHP和MySQL实施定位器应用程序的文章: 使用PHP,MySQL和Google
Maps创建商店定位器
如果您只需要计算5公里以内的距离,那么地球的曲率可能并不重要。您可以使用普通距离公式。如果只需要使用此值来排序较接近的值,则甚至可以跳过平方根计算。
SELECt s.location_id, (s.lat-p.lat)*(s.lat-p.lat) + (s.long-p.long)*(s.long-p.long) AS distance_squaredFROM Locations s, Locations pWHERe p.location_id = ?ORDER BY distance_squared;
我从中选择的表(“位置”)具有经/纬度坐标(我们称它们为$ plat和$ plong)。
不,这些是PHP变量。您需要从数据库表的每一行上的纬度/经度坐标计算距离。
问题是,SQL通常只从计算的东西 一个 在同一时间行。因此,您需要某种方式将两行合并为一行,以便计算可以使用两个位置的坐标。您可以通过 self-
join
进行此操作。这基本上是将每一行与同一表中的另一行配对。这就是为什么我列出
Locations两次,并给他们两个不同的别名,
s和
p(技术术语是“
相关名称” )的原因。
如果您习惯使用PHP,则可以将这种自联接与嵌套循环类似:
foreach ($locations as &$s) { foreach ($locations as &$p) { // calculate the distance between $s and $p }}该
WHERe子句将的行限制为
p您仅从其开始的位置(您将用?占位符替换一个值),因此查询与表的所有行都只有一行。
另一个提示:我跳过了使用,
SQRT()因为不必仅按距离排序。也就是说,如果三个位置距离我10公里,15公里和20公里,那么我可以按100、225和400进行排序,并获得与我按10、15和20进行排序相同的排序。优点是,我消除了计算平方根的步骤,这在某种程度上降低了我的查询成本。



