Попытка вычислить расстояние между двумя точками широты в 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.