Почему <@> не возвращает правильное расстояние в Postgresql?
По сути, у меня есть три координаты в игре.
- Кливленд, Теннесси - (35.255097,-84.86844) - это происхождение.
- Атланта, Джорджия - (32.4608333,-84.9877778) - это намного ближе к этому происхождению.
- Колумбус, Джорджия - (33.7488889,-84.3880556) - Это определенно еще дальше.
Вот карта Google с этими тремя точками для сравнения.
Теперь, используя модуль Earthdistance для Postgresql, я буду использовать <@>
оператор, чтобы получить воздушные мили между двумя точками.
SELECT 'Celeveland, TN' AS origin
, '(35.255097,-84.86844)' AS origin_cords
, city || ', ' || region AS dest
, cords AS cords
, cords <@> '(35.255097,-84.86844)'::point AS distance_miles
FROM maxmind.city
WHERE (region = 'GA' AND city ='Atlanta') OR (region = 'GA' AND city = 'Columbus')
;
Все же это то, что я получаю...
origin | origin_cords | dest | cords | distance_miles
----------------+-----------------------+--------------+--------------------------+------------------
Celeveland, TN | (35.255097,-84.86844) | Columbus, GA | (32.4608333,-84.9877778) | 18.952732930393
Celeveland, TN | (35.255097,-84.86844) | Atlanta, GA | (33.7488889,-84.3880556) | 34.5888147812704
(2 rows)
Так что это говорит мне о том, что Колумбус, штат Джорджия, ближе к Кливленду (18,95 миль), штат Теннеси, чем Атланта, штат Джорджия (34,58 миль), хотя я могу четко сказать, что это не так. Я подтвердил эти результаты на Postgresql 9.1 и Postgresql 8.4.
1 ответ
Обратный порядок координат, PostGIS ожидает, что широта будет первой.
UPD: Извините, меня смутил тег postgis, это не функция PostGIS. Из документации по заземлению вы связали: " первый компонент взят для представления долготы в градусах, а второй компонент для представления широты в градусах". Вы правы, это работает в Google maps, но в обратном порядке.
UPD 2: похоже, у нас есть весь обмен ГИС.