Почему <@> не возвращает правильное расстояние в Postgresql?

По сути, у меня есть три координаты в игре.

  1. Кливленд, Теннесси - (35.255097,-84.86844) - это происхождение.
  2. Атланта, Джорджия - (32.4608333,-84.9877778) - это намного ближе к этому происхождению.
  3. Колумбус, Джорджия - (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: похоже, у нас есть весь обмен ГИС.

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