Попытка вычислить расстояние между двумя точками широты в PostgreSQL - какова единица возвращаемого значения 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 км (т.е. lat=lng=4 должен быть возвращен, когда радиус>= 157 миль. Тем не менее, запрос возвращает только запись с lat=lng=4 когда радиус указан как ~111 000+. У меня вопрос, в какой единице находится радиус, и правильно ли я выполняю этот запрос?

1 ответ

Решение

Согласно документу, по умолчанию радиус выражается в метрах.

Самый важный недостаток заключается в том, что расстояние между 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.

Другие вопросы по тегам