admin

SQL Abs计算-使用纬度和经度-数学!

sql

我有一个sql查询,它根据一定范围内的坐标从数据库中提取位置。现在,我正在尝试通过一些数学运算来按顺序排列它们,但是无论将其写在纸上多少次,我似乎都无法找到一个可行的解决方案。

让我们描述一些变量:

  • $ plat(地点的纬度)
  • $ plong(地点的经度)
  • $ slat(搜索位置的纬度)
  • $ slong(搜索位置的经度)

需要注意的一件大事是,我已经将所有坐标都转换为正数,并拥有另一个确定正数或负数的字段-但为此,假设我已经正确查询了附近的坐标。

为了以这种方式进行排序,我已经看到人们将“ ORDER BY abs(coord-coords)”用于简单的东西-但我需要的是更多类似的东西:

[($ slat-$ plat)*($ slong-
plong)]-但这会引起问题,因为如果一侧的计算结果为零,则在相乘后结果也将为零,从而使计算结果不准确。

有任何想法吗 -


阅读 173

收藏
2021-07-01

共1个答案

admin

纬度/经度坐标之间的距离的解决方案称为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_squared
FROM Locations s, Locations p
WHERE p.location_id = ?
ORDER BY distance_squared;

我从中选择的表(“位置”)具有经/纬度坐标(我们称它们为$ plat和$ plong)。

不,这些是PHP变量。您需要从数据库表的每一行上的纬度/经度坐标计算距离。

问题是,SQL通常只从计算的东西 一个 在同一时间行。因此,您需要某种方式将两行合并为一行,以便计算可以使用两个位置的坐标。您可以通过 self-
join

进行此操作。这基本上是将每一行与同一表中的另一行配对。这就是为什么我列出Locations两次,并给他们两个不同的别名,sp(技术术语是“
相关名称” )的原因。

如果您习惯使用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进行排序相同的排序。优点是,我消除了计算平方根的步骤,这在某种程度上降低了我的查询成本。

2021-07-01