Исходные данные:
1) карта в системе координат СК-42 (шейпы). Параметры проекции:
Поперечная Меркатора,
Эллипсоид Красовского,
Центр. меридиан 57 (Республика Коми)
Смещение на восток: 10500000
Параметр сжатия: 1
Единицы измерения и карты: метры
2) та же карта закачанная в GPS-приемник (eTrex Vista), настроенный на выдачу координат в СК-42
DX = 24; DY = -141; DZ = -81; DA = -108; DF = 0.004808
3) географические координаты двух точек, выдаваемые GPS
Необходимо:
программно (через скрипт Avenue) определить азимут направления от первой точки ко второй
Азимут, выдаваемый GPS составляет 33 градуса,
Мой скрипт выдает 41 градус!!!
Чего я делаю не так.
СКРИПТ ПОЛУЧЕНИЯ АЗИМУТА:
Код: Выделить всё
' Порядок вызова
' azimuth = av.Run("GetAzimuth", {point1, point2})
pA = self.Get(0) ' первая точка
pB = self.Get(1) ' вторая точка
' Координаты вектора
X = pB.GetX - pA.GetX
Y = pB.GetY - pa.GetY
' Длина вектора
L = ((X*X) + (Y*Y)).Sqrt
IF (L = 0) THEN
Return nil
END
' Значение угла, отсчитываемого по тригонометрическому кругу
phi = (X / L).ACos.AsDegrees
IF (Y < 0) THEN
phi = 360 - phi
END
IF (phi <= 90) THEN
azimut = 90 - phi
ELSE
azimut = 450 - phi
END
Return azimut
Код: Выделить всё
p1_Lat = 60.34602778
p1_Lon = 49.66977778
p2_Lat = 60.34644444
p2_Lon = 49.67036111
thePrj = av.GetActiveDoc.GetProjection ' Получаем проекцию вида
p1 = Point.Make(p1_Lon, p1_Lat).ReturnProjected(thePrj)
p2 = Point.Make(p2_Lon, p2_Lat).ReturnProjected(thePrj)
azimuth = av.Run("GetAzimuth", {p1, p2})
MsgBox.Info(azimuth.asString, "")