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

Posted

技术标签:

【中文标题】sql 查询以获取作为表中字段提供的纬度和经度的第一个最近位置【英文标题】:sql query to get first closest locations by latitude and longitude provided as feilds in table 【发布时间】:2021-06-23 23:22:45 【问题描述】:

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

id longitude latitude
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 longitude latitude
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;```

【问题讨论】:

请定义您正在使用的距离度量。从你的问题中很不清楚。 @GordonLinoff 它不是真正关于距离是关于最接近的数字,无论度量如何 【参考方案1】:

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

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。这些将需要替换为您要比较的点的纬度/经度。

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

【讨论】:

以上是关于sql 查询以获取作为表中字段提供的纬度和经度的第一个最近位置的主要内容,如果未能解决你的问题,请参考以下文章

基于纬度/经度查询附近兴趣点的 SQL 查询 - SQLite

如何在sql server中通过给定的邮政编码和以英里为单位的半径从附近的表中获取所有其他邮政编码或(纬度和经度)?

PHP SQL查询以查找纬度和经度的给定半径内的所有零售商

我有带有纬度和经度等的表名,现在我想在 mysql 查询中以半径获取数据?

Django中的自定义纬度/经度表单字段

绘制按钮以将纬度和经度添加到输入字段?地理编码