sql查询通过纬度和经度获取第一个最近的位置作为表中的字段提供

问题描述

我有一个包含纬度和经度位置的表格,我想将其排序为最接近我的位置或我提供的位置:

id 经度 纬度
1 20.2 7.1
2 10.0 20.0
3 20.1 5.2
4 10.1 70.5

让我们说我有这个表我想要我在 sql查询以返回最接近的前 3 个让我们说 经度:12.1,纬度:8.3

所以这是我期望返回的

id 经度 纬度
2 10.0 20.0
1 20.2 7.1
3 20.1 5.2

我猜,不知道什么是最接近的,但你知道了

这就是我尝试过的,我从未使用过 sql :)

(
  (SELECT id,number FROM destination WHERE longitude >= 15 ORDER BY longitude LIMIT 1)
  UNION ALL
  (SELECT id,number FROM destination WHERE latitude < 15 ORDER BY latitude DESC LIMIT 1)
) 
ORDER BY abs(15-number) LIMIT 5;```

解决方法

您问题中的代码没有做任何计算两点之间的距离之类的事情。对如何计算两点之间的距离进行一些研究是个好主意 - 这就是您需要开始的地方。您应该能够根据您的情况调整我的答案,但如果您要使用坐标,最好了解所涉及的数学。

Stack Overflow 上有很多关于计算两点之间距离的信息,甚至专门针对 PostgreSQL。这是改编自另一篇 Stack Overflow 文章 (PostgreSQL calculate distance between two points without using PostGIS) 的示例:

SELECT
    id,longitude,latitude,(select SQRT(POW(69.1 * (latitude::float -  10::float),2) + 
        POW(69.1 * (longitude::float - 15::float) * COS(latitude::float / 57.3),2)
    )) AS Distance
FROM destination
ORDER BY Distance

我的原点纬度硬编码值为 10,经度硬编码值为 15。这些将需要由您尝试比较的点的纬度/经度替换。

这将返回目标表中的所有行,包括一个新列,该列表示该行与原点的距离(以英里为单位)。它也将按该距离排序,从最近到最远。