试图计算 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 - 在数组中查找并计算数组值