2017-10-09 125 views
1

我有一个查询,像这样:试图计算PostgreSQL中两个lat-lng点之间的距离 - PostgreSQL earth_box(ll_to_earth)返回值的单位是什么?

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。但是,查询仅在半径指定为〜111,000 +时返回条目lat=lng=4。我的问题是,什么单位为半径,和我在正确进行此查询?

回答

0

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

最重要的缺陷是距离在4; 4和5之间; 5是157公里,而不是英里。尽管111,000米不等于157,000米,但文档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,而不是会。

相关问题