Азимут на экваторе равен азимуту не на экваторе?

Я пытаюсь полностью понять концепцию азимута и сталкиваюсь с некоторыми несоответствиями (или, может быть, это моя ошибка).

Я покажу вам несколько примеров, которые не совпадают, в надежде, что кто-нибудь объяснит мне, как это работает на самом деле.

Я показываю координаты в формате EPSG:900913, в PostGIS и с помощью собственной функции JavaScript.

МОЯ ФУНКЦИЯ

/* Difference between the two longitudes */
var dLon = lon2 - lon1;
/* Y value */
var y = Math.sin(dLon) * Math.cos(lat2);
/* X value */
var x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon);
/* Calculates the azimuth between the two points and converts it to degrees */
var angle = Math.atan2(y, x) / Math.PI * 180;

ПРИМЕРЫ

/* Same Y, not on the equator */
Point A: (-81328.998084106, 7474929.8690234)
Point B: (4125765.0381464, 7474929.8690234)
Result in PostGIS: 90 degrees
Result in my JS function: 74.232 degrees

/* Same Y, on the equator */
Point A: (-81328.998084106, 0)
Point B: (4125765.0381464, 0)
Result in PostGIS: 90 degrees
Result in my JS function: 90 degrees

Я понимаю, что на экваторе азимут 90 (или 270) для горизонтальной линии. подумайте, что если вы проведете горизонтальную линию немного севернее (или южнее) от экватора, то азимут больше не будет 90 градусов. Но... PostGIS говорит мне, что это всегда 90 градусов, когда у нас один и тот же Y.

Кроме того, этот калькулятор также показывает, что азимуты горизонтальных линий не равны 90°. градусов при Y != 0 (не на экваторе).

Как это правильно?

Спасибо


person joaorodr84    schedule 27.08.2014    source источник
comment
возможный дубликат Как рассчитать азимут между двумя точками в ПостГИС?   -  person Peter O.    schedule 28.08.2014
comment
Этот вопрос кажется не по теме, потому что он не о программировании (хотя он использует программирование). См. раздел О каких темах я могу задать здесь в Справочном центре. Возможно, лучше задать вопрос на сайте Geography Stack Exchange.   -  person jww    schedule 28.08.2014
comment
@jww, спасибо. Я знаю, что GIS.StackExchange лучше. Я попробовал оба, и ответ здесь был лучше. Так что большое спасибо ответившему! :) Впредь буду осторожнее.   -  person joaorodr84    schedule 28.08.2014
comment
@joaorodr84 - круто; рад, что вы получили хороший ответ. (И, пожалуйста, не принимайте закрытие на свой счет. Мне пришлось закрыть свои вопросы (я действительно задавал этот вопрос много лет назад?)).   -  person jww    schedule 28.08.2014
comment
Нет проблем, @jww. :) Я не принимаю это на свой счет. Вы совершенно правы. ;)   -  person joaorodr84    schedule 28.08.2014


Ответы (1)


В вашем примере вы использовали EPSG:900913, который является плоским, спроектированным и в метрах. Это означает, что используемая формула будет atan2, которая всегда будет равна 90, когда широты одинаковы, как и формула:

azimuth = atan2(y1-y2, x1-x2)

И 2-я часть всегда будет 0, что дает азимут 90. Итак, используя плоские координаты, да, азимут всегда будет одинаковым для пар координат с одинаковыми широтами, и поэтому Postgis всегда дает один и тот же ответ при использовании EPS :900913.

Если вы переключаетесь на тип данных geography и, следовательно, используете геодезические координаты, это уже не так.

Например:

select degrees(   
  st_azimuth(
   st_makepoint(0, 10)::geography, 
   st_makepoint(90, 10)::geography));

Дает 80,1318065 в Postgis и дает 80,139 на странице калькулятора, на которую вы ссылаетесь.

По мере того, как значения x/долготы становятся ближе друг к другу, значения становятся ближе к 90 для данной широты. Например,

select degrees(   
  st_azimuth(
   st_makepoint(0, 10)::geography, 
   st_makepoint(1, 10)::geography));

Теперь выдает 89,9131737 в Postgis и 89,333 в онлайн-калькуляторе (расхождение чуть больше).

Все это связано с тем, что формула теперь учитывает кривизну, поэтому угол между проекциями двух векторов с одинаковой широтой больше не будет равен 90, кроме как на экваторе.

Посмотрите на уравнение в статье об азимуте в Википедии для сфероидной версии. Это должно быть достаточно просто для написания кода на JavaScript, и это должно давать сопоставимые ответы для Postgis с типом geography.

person John Powell    schedule 27.08.2014
comment
Привет @JohnBarça. Я неправильно использовал PostGIS. Спасибо. Как видите, я уже использую функцию из Википедии, немного измененный. Или вы имеете в виду второй? - person joaorodr84; 27.08.2014
comment
Я имел в виду второй, который отвечает за сжатый сфероид, начиная с upload .wikimedia.org/math/7/6/e/. Если вы используете это, вы должны приблизиться к значениям, которые вы получаете, используя географию в Postgis. - person John Powell; 27.08.2014