问题描述
我有一个包含纬度和经度位置的表格,我想将其排序为最接近我的位置或我提供的位置:
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。这些将需要由您尝试比较的点的纬度/经度替换。
这将返回目标表中的所有行,包括一个新列,该列表示该行与原点的距离(以英里为单位)。它也将按该距离排序,从最近到最远。