试图计算 PostgreSQL 中两个 lat-lng 点之间的距离 - PostgreSQL earth_box(ll_to_earth) 返回值的单位是啥?

Posted

技术标签:

【中文标题】试图计算 PostgreSQL 中两个 lat-lng 点之间的距离 - PostgreSQL earth_box(ll_to_earth) 返回值的单位是啥?【英文标题】:Trying to calculate distance between two lat-lng points in PostgreSQL - what is the unit of PostgreSQL earth_box(ll_to_earth) return value?试图计算 PostgreSQL 中两个 lat-lng 点之间的距离 - PostgreSQL earth_box(ll_to_earth) 返回值的单位是什么? 【发布时间】:2017-10-09 22:12:21 【问题描述】:

我有一个这样的查询:

SELECT * FROM chat_rooms 
WHERE earth_box(ll_to_earth(5, 5), 111000) @> ll_to_earth(lat, lng);

基本上,我在查询中有lat = lng = 5,在我的chat_rooms 表中有两个条目,一个带有lat=lng=5,另一个带有lat=lng=4。使用在线计算器,这两个条目之间的距离为 157 英里 = 252.667 公里(即当半径 >= 157 英里时应返回条目 lat=lng=4。但是,当指定半径时,查询仅返回带有 lat=lng=4 的条目约为 111,000+。我的问题是,半径的单位是什么,我是否正确执行此查询?

【问题讨论】:

【参考方案1】:

根据the doc,默认情况下,半径以米为单位。

最重要的缺陷是 4;4 和 5;5 之间的距离是 157 公里,而不是英里。尽管 111,000m 与 157,000m 不同,但earth_box 的文档说

此框中的某些点比指定的大圆更远 距该位置的距离,因此使用 earth_distance 进行第二次检查 应该包含在查询中。

所以您的查询应该类似于

SELECT * FROM chat_rooms 
WHERE earth_box(ll_to_earth(5, 5), 111000) @> ll_to_earth(lat, lng)
AND earth_distance(ll_to_earth(5,5), ll_to_earth(lat, lng)) <= 111000

在这种情况下,不会返回 5;5 处的条目,但如果您使用 158000 代替,则会返回。

【讨论】:

以上是关于试图计算 PostgreSQL 中两个 lat-lng 点之间的距离 - PostgreSQL earth_box(ll_to_earth) 返回值的单位是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PostgreSQL 将两个选择查询的结果添加到一个表行中

MySQL 到 PostgreSQL - 在数组中查找并计算数组值

如何计算日历表中只有值为 1 的 2 列日期之间的天数 - postgreSQL?

如何在postgreSQL中获得精确的日期差异?

PostgreSQL:无法理解存在条件

Doctrine映射和PostgreSQL模式