Почему <@> не возвращает правильное расстояние в Postgresql? - PullRequest
3 голосов
/ 22 февраля 2012

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

  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)

Так что это говорит мне о том, что Колумб, штат Джорджия, ближе к Кливленду), TN, чем Атланта, Джорджия (34,58mi), хотя я могу четко сказать, что это не так.Я подтвердил эти результаты на Postgresql 9.1 и Postgresql 8.4.

1 Ответ

3 голосов
/ 22 февраля 2012

Порядок обратных координат, PostGIS ожидает, что широта будет первой .

UPD: Извините, меня смутил тег postgis, это не функция PostGIS. Из документации по заземлению вы связали: «компонент first взят для представления долготы в градусах, а второй компонент для представления широты в градусах». Вы правы, это работает в Google maps, но в обратном порядке.

UPD 2 : похоже, у нас есть весь ГИС Stackexchange .

...