1

我有一个这样的查询:

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 公里(即lat=lng=4当半径 >= 157 英里时应返回条目。但是,查询仅lat=lng=4在半径指定为 ~111,000+ 时返回条目。我的问题是,半径的单位是什么,我是否正确执行此查询?

4

1 回答 1

1

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

最重要的缺陷是 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 则会返回。

于 2017-10-10T01:41:06.647 回答