Путевой угол и расстояние между двумя точками по локсодроме (линии румба). Расстояние между точками по географическим координатам


Онлайн расчет расстояния по координатам + формула

Подробности Категория: Астрономические калькуляторы - программы

Расчет расстояния между координатами

Допустим у вам известны географические координаты двух точек на Земле. Кратчайшим расстоянием между ними является длина дуги круга, проведенного на сфере по этим двум точкам. При расчете расстояния по географическим координатам делается предположение, что Земля не плоская а круглая (если быть точнее, имеет форму, приближенную к сфере), то есть Земля - сфероид.

Формула для расчёта расстояний на плоскости, известная всем из курса школьной геометрии, тут не подойдет, нужна формула расчета длины дуги. Это так называемая "модифицированная формула гаверсинусов".

Здесь http://en.wikipedia.org/wiki/Great_circle_distance все описано достаточно подробно.

Поскольку в расчете участвует радиус, а у Земли, как у не совсем правильной сферы, он разный, скажем на северном полюсе (6335.437 км) а на экваторе (6399.592 км), то в расчете берется среднее значение радиуса Земли (6372.795 км), что должно давать, по утверждению той же википедии, ошибку около 0.5%

В калькуляторе ниже для примера приводится расчет расстояния между координатами г.Москва и г.Санкт-Петербург.

Формула расчета расстояния по координатам

Пусть и являются географическими широтой и долготой двух точек 1 и 2, и - их абсолютная разность. Тогда , центральный угол между ними, определяется теоремой сферических косинусов:

Формула расстояние d т.е.длины дуги, для сферы радиуса R и приведены в радианах

Больше матиматики ...

На компьютерных системах с низкой точностью с плавающей запятой, эта формула может иметь большие ошибки округления, если расстояние не большое (если две точки находятся в 1 км друг от друга на поверхности Земли, косинус центрального угла выходит 0,99999999). Для современных 64-разрядных чисел с плавающей запятой, формула Теоремы косинусов, которая приведенна выше, не имеет серьезных ошибок округления для расстояний более нескольких метров на поверхности Земли. Эта формула лучше подходит для вычисления растояние по координатам на небольшые расстояния

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

Более подробную информацию о выведении формулы расчета расстояния по координатам читайте здесь: http://en.wikipedia.org/wiki/Great_circle_distance

mapgroup.com.ua

Определение расстояний на поверхности Земли

Определение расстояний на поверхности Земли

Размеры и форма Земли Форма Земли отличается от шара и имеет несколько сплющенную форму, близкую к сфероиду (эллипсоиду вращения), но истинная фигура Земли отличается и от сфероида, и от трехосного эллипсоида и не может быть представлена ни одной из известных математических фигур. Поэтому, говоря о фигуре Земли, имеют в виду не физическую форму земной поверхности, с океанами и материками, с их возвышенностями и впадинами, а так называемую поверхность геоида. Поверхность, нормалями к которой в любой из ее точек являются отвесные линии, называется уровенной поверхностью, или поверхностью равновесия. Уровенных поверхностей, как внутри Земли, так и охватывающих земную поверхность, или пересекающихся с ней, можно провести бесчисленное множество. Та поверхность равновесия, которая совпадает в открытом океане с поверхностью покоящейся свободной воды, называется геоидом.

Для решения многих задач навигации и составления карт мелкого масштаба Землю принимают за сферу (шар). Положение точки па земной сфере определяется сферическими координатами: сферической широтой и сферической долготой (в картографии применяют термин "географические координаты"). Сферическая широта точки А — угол φА между плоскостью экватора и направлением R на данную точку из центра земной сферы. Сферическая долгота точки А — угол λА, заключенный между плоскостью нулевого (Гринвичского) меридиана и плоскостью меридиана данной точки.

Средний радиус Земли R = 6371210 м. Экваториальный радиус Земли RЭ = 6378,245 м. Полярный радиус Земли RП = 6356,830 м. Длина дуги меридиана (дуги экватора, дуги окружности большого круга) в 1°, 1′ и 1″ равна соответственно: 111 197 м (111,2 км), 1852 м (1,852 км) и 30,9 м.

 

 

Законы сферической тригонометрии позволяют рассчитывать расстояния между точками, расположенными на сфере. Кратчайшее расстояние между двумя точками на земной поверхности (если принять ее за сферу) определяется зависимостью:

cos(d) = sin(φА)·sin(φB) + cos(φА)·cos(φB)·cos(λА − λB),

где φА и φB — широты, λА, λB — долготы данных пунктов, d — расстояние между пунктами, измеряемое в радианах длиной дуги большого круга земного шара. Расстояние между пунктами, измеряемое в километрах, определяется по формуле:

L = d·R,

где R = 6371 км — средний радиус земного шара.

 

Таблица расстояний (с точностью 1 км), рассчитанными по этим формулам, для пунктов Эвенкийского автономного округа (Эвенкийского муниципального района):

 

уточнения внесены 25.03.2010 Тура Байкит Ванавара
Красноярск 1007 662 738
Агата 426    
Географический центр РФ, Виви 364    
Ессей 467    
Кислокан 201    
Нидым 21    
Ногинск 439    
Тембенчи 99    
Тура   350 450
Тутончаны 313    
Учами 186    
Чиринда 363    
Эконда 293    
Юкта  293    
Байкит  350   352
Бурный   197  
Кузьмовка   236  
Куюмба   82  
Мирюга   220  
Ошарово   177  
Полигус   101  
Суломай   274  
Суринда   114  
Таимба   203  
Усть-Камо    121  
Ванавара 450 352  
Кербо     242
Муторай     147
Оскоба     100
Стрелка-Чуня     159
Тунгусский метеорит (эпицентр)     64
Чемдальск     102

Для расчета расстояния между пунктами, расположенными в разных полушариях (северное-южное, восточное-западное), знаки (±) у соответствующих параметров (широт или долгот) должны быть разными.

Пример: (см. таблицу ниже) для вычисления расстояния между Турой и Сиднеем (Австралия) применяем формулу: cos(d) = sin(φА)·sin(−φB) + cos(φА)·cos(−φB)·cos(λА − λB) = −0,27462.

d = 1,848988 Расстояние L = d·R = 11 779,9 км.

для вычисления расстояния между Турой и Нью-Йорком (США) применяем формулу: cos(d) = sin(φА)·sin(φB) + cos(φА)·cos(φB)·cos(λА + λB) = 0,259532.

d = 1,308259

Расстояние L = d·R = 8 334,92 км.

В таблице расстояния определены с точностью 1 км.

φ (градус)

λ (градус)

φ (радиан)

λ (радиан)

расстояние до Туры (км)

Тура Tura (Russia)

64,28 с.ш.

100,22 в.д.

1,121387

1,748224

— 

Нью-Йорк (США) New-York (USA)

40,71 с.ш.

74,01 з.д.

0,710163

1,291063

8 335

Сидней (Австралия) Sydney (Australia)

33,874 ю.ш.

151,213 в.д.

0,590913

2,637827

11 780

Координаты географических пунктов ЭАО смотрите здесь

страница обновлена 25.03.10

osiktakan.ru

Путевой угол и расстояние между двумя точками по локсодроме (линии румба).

В 16 веке фламандский географ Герхард Меркатор составил навигационную карту мира, изобразив поверхность Земли на плоскости таким образом, чтобы углы на карте не искажались. В настоящее время такой способ изображения Земли известен, как равноугольная цилиндрическая проекция Меркатора. Такая карта была очень удобна для мореплавателей, так как для того чтобы прийти из точки А в точку Б на карте Меркатора достаточно провести прямую линию между этими точками, замерить ее угол к меридиану и постоянно придерживаться этого направления, например используя секстант и полярную звезду в качестве ориентира или магнитный компас. (На самом деле с компасом не так все просто, так как он не всегда показывает на истинный север, но об этом как-нибудь в другой раз). Проекция Меркатора до сих пор широко применяется для составления навигационных карт.Однако, еще древние мореплаватели начинали замечать, что линия румба не всегда является кратчайшим путем между двумя точками, особенно, это становилось заметно для дальних переходов. Если провести на глобусе линию, пересекающую все меридианы под одним и тем же углом, то станет понятно, отчего это происходит. Прямая линия на карте Меркатора превращается на глобусе в бесконечно закручивающуюся к полюсам спираль. Такую линию в современной науке принято называть греческим словом локсодромия, что означает «косой бег».Следующий далее калькулятор вычисляет путевой угол и расстояние трансатлантического перехода из Лас Пальмаса (Испания) в Бриджтаун (Барбадос) по локсодромии. Полученное расстояние на десятки километров отличается от кратчайшего пути (см.Расстояние между двумя координатами).

Начальная точка, широтаНачальная точка, долготаКонечная точка, широтаКонечная точка, долготаРеференц-эллипсоид Точность вычисления

Знаков после запятой: 2

Расстояние в километрах

 

Расстояние в морских милях

 

Сохранить share extension

Для вычисления путевого угла используются следующие формулы:[1]

Длина локсодромии вычислена по следующей формуле:[2]

, где — широта и долгота первой точки — широта и долгота второй точки — эксцентиситет сфероида (a - длина большой полуоси, b — длина малой полуоси)

При углах 90° или 270° для вычисления длины дуги использовалась формула:

Источники:[1]В.С. Михайлов и др. Навигация и Лоция[2]Miljenko Petrović DIFFERENTIAL EQUATION OF A LOXODROME ON THE SPHEROID

planetcalc.ru

Вычисление расстояния и начального азимута между двумя точками на сфере

Измерение расстояния и начального азимута между точками без проекционных преобразований

Длина дуги большого круга – кратчайшее расстояние между любыми двумя точками находящимися на поверхности сферы, измеренное вдоль линии соединяющей эти две точки (такая линия носит название ортодромии) и проходящей по поверхности сферы или другой поверхности вращения. Сферическая геометрия отличается от обычной Эвклидовой и уравнения расстояния также принимают другую форму. В Эвклидовой геометрии, кратчайшее расстояние между двумя точками – прямая линия. На сфере, прямых линий не бывает. Эти линии на сфере являются частью больших кругов – окружностей, центры которых совпадают с центром сферы.

Начальный азимут - азимут, взяв который при начале движения из точки А, следуя по большому кругу на кратчайшее расстояние до точки B, конечной точкой будет точка B. При движении из точки A в точку B по линии большого круга азимут из текущего положения на конечную точку B постоянно меняется. Начальный азимут [angles-rhumb.html отличен от постоянного], следуя которому, азимут из текущей точки на конечную не меняется, но маршрут следования не является кратчайшим расстоянием между двумя точками.

большой круг

Через любые две точки на поверхности сферы, если они не прямо противоположны друг другу (то есть не являются антиподами), можно провести уникальный большой круг. Две точки, разделяют большой круг на две дуги. Длина короткой дуги – кратчайшее расстояние между двумя точками. Между двумя точками-антиподами можно провести бесконечное количество больших кругов, но расстояние между ними будет одинаково на любом круге и равно половине окружности круга, или pi*R, где R – радиус сферы.

расстояние большого круга

На плоскости (в прямоугольной системе координат), большие круги и их фрагменты, как было упомянуто выше, представляют собой дуги во всех проекциях, кроме гномонической, где большие круги - прямые линии. На практике это означает, что самолеты и другой авиатранспорт всегда использует маршрут минимального расстояния между точками для экономии топлива, то есть полет осуществляется по расстоянию большого круга, на плоскости это выглядит как дуга.

Маршрут Нью-Йорк - Пекин

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

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

Известно, что более точно описывает форму Земли не сфера, а эллипсоид, однако в данной статье рассматривается вычисление расстояний именно на сфере, для вычислений используется сфера радиусом 6372795 метров, что может привести к ошибке вычисления расстояний порядка 0.5%.

Существует три способа расчета сферического расстояния большого круга (подробнее).

[править] Сферическая теорема косинусов

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

- широта и долгота двух точек в радианах

- разница координат по долготе

- угловая разница

Для перевода углового расстояния в метрическое, нужно угловую разницу умножить на радиус Земли (6372795 метров), единицы конечного расстояния будут равны единицам, в которых выражен радиус (в данном случае - метры).

[править] Формула гаверсинусов

Используется, чтобы избежать проблем с небольшими расстояниями.

[править] Модификация для антиподов

Предыдущая формула также подвержена проблеме точек-антиподов, чтобы ее решить используется следующая ее модификация.

[править] Реализация на Avenue

На языке Avenue, используя последнюю формулу для вычисления расстояния большого круга между двумя точками, можно использовать следующий код. Точки для вычисления передаются другим скриптом, либо добавляются в начало данного в виде pnt = point.make(long, lat) (скачать скрипт):

'pnt1, pnt2 - точки между которыми вычисляются расстояния 'pi - число pi, rad - радиус сферы (Земли), num - количество знаков после запятой pi = 3.14159265358979 rad = 6372795 num = 7 'получение координат точек в радианах lat1 = pnt1.getY*pi/180 lat2 = pnt2.getY*pi/180 long1 = pnt1.getX*pi/180 long2 = pnt2.getX*pi/180 'косинусы и синусы широт и разниц долгот cl1 = lat1.cos cl2 = lat2.cos sl1 = lat1.sin sl2 = lat2.sin delta = long2 - long1 cdelta = delta.cos sdelta = delta.sin 'вычисления длины большого круга p1 = (cl2*sdelta)^2 p2 = ((cl1*sl2) - (sl1*cl2*cdelta))^2 p3 = (p1 + p2)^0.5 p4 = sl1*sl2 p5 = cl1*cl2*cdelta p6 = p4 + p5 p7 = p3/p6 anglerad = (p7.atan).SetFormatPrecision (num)dist = anglerad*rad'вычисление начального азимутаx = (cl1*sl2) - (sl1*cl2*cdelta) y = sdelta*cl2 z = (-y/x).ATan.AsDegrees if (x < 0) then z = z+180 end z = -(z + 180 mod 360 - 180).AsRadiansanglerad2 = z - ((2*pi)*((z/(2*pi)).floor)) angledeg = (anglerad2*180)/pi

'возврат значений длины большого круга и начального азимутаdistlist = {dist, angledeg}return distlist

Для вызова процедуры расчета длин приведенной выше, можно также воспользоваться следующим скриптом, результатом его работы будет расчет длин между точкой testpont до всех точек активной темы вида и запись результата в поле Newdist атрибутивной таблицы этой темы:

atheme = av.getactivedoc.getactivethemes.get(0) aftab = atheme.getftab f_shape = aftab.findfield("Shape") f_dist = aftab.findfield("dist")f_ang = aftab.findfield("ang") 'testpoint - точка отсчета testpoint = point.make(25.85, 55.15) aftab.seteditable(true) 'для каждой точки темы до которых считают расстояния от точки отсчета for each rec in aftab pnts = {} apoint = aftab.returnvalue(f_shape, rec) pnts.add(apoint.getx) pnts.add(testpoint.getx) pnts.add(apoint.gety) pnts.add(testpoint.gety) 'Вызов процедуры расчета расстояний '"Calc-distance" - название скрипта с процедурой в проекте param = av.run("Calc-distance", pnts) aftab.setvalue(f_dist, rec, param.get(0)) aftab.setvalue(f_ang, rec, param.get(1)) end aftab.seteditable(false)

[править] Реализация на языке Python

Реализует полный вариант расчета через atan2(), более универсальнее, чем вариант для Avenue. (скачать скрипт)

import math #pi - число pi, rad - радиус сферы (Земли) rad = 6372795 #координаты двух точек llat1 = 77.1539 llong1 = -120.398 llat2 = 77.1804 llong2 = 129.55 #в радианах lat1 = llat1*math.pi/180. lat2 = llat2*math.pi/180. long1 = llong1*math.pi/180. long2 = llong2*math.pi/180. #косинусы и синусы широт и разницы долгот cl1 = math.cos(lat1) cl2 = math.cos(lat2) sl1 = math.sin(lat1) sl2 = math.sin(lat2) delta = long2 - long1 cdelta = math.cos(delta) sdelta = math.sin(delta) #вычисления длины большого круга y = math.sqrt(math.pow(cl2*sdelta,2)+math.pow(cl1*sl2-sl1*cl2*cdelta,2)) x = sl1*sl2+cl1*cl2*cdelta ad = math.atan2(y,x) dist = ad*rad #вычисление начального азимута x = (cl1*sl2) - (sl1*cl2*cdelta) y = sdelta*cl2 z = math.degrees(math.atan(-y/x)) if (x < 0): z = z+180. z2 = (z+180.) % 360. - 180. z2 = - math.radians(z2) anglerad2 = z2 - ((2*math.pi)*math.floor((z2/(2*math.pi))) ) angledeg = (anglerad2*180.)/math.pi print 'Distance >> %.0f' % dist, ' [meters]' print 'Initial bearing >> ', angledeg, '[degrees]'

[править] Реализация в Excel

Скачать пример расчета расстояния большого круга и начального азимута в Excel. Демонстрирует расчеты через закон косинусов, гаверсинус, полное уравнение и полное уравнение через atan2().

Можно также воспользоваться следующей функцией:

Public Function Distance_A_B(Lat1 As Double, Long1 As Double, Lat2 As Double, Long2 As Double) 'определение расстояний между географическими координатами. Координаты должны быть десятичными 'расстояние выводится в метрах With Application.WorksheetFunction Distance_A_B = .Atan2(Sin(.Pi() * Lat1 / 180) * Sin(.Pi() * Lat2 / 180) + Cos(.Pi() * Lat1 / 180) * Cos(.Pi() * Lat2 / 180) * Cos(Abs(.Pi() * Long2 / 180 - .Pi() * Long1 / 180)), _ ((Cos(.Pi() * Lat2 / 180) * Sin(.Pi() * Long2 / 180 - .Pi() * Long1 / 180)) ^ 2 + (Cos(.Pi() * Lat1 / 180) * Sin(.Pi() * Lat2 / 180) - Sin(.Pi() * Lat1 / 180) * Cos(.Pi() * Lat2 / 180) * Cos(Abs(.Pi() * Long2 / 180 - .Pi() * Long1 / 180))) ^ 2) ^ 0.5) * 6372795 End With End Function

[править] Проверочный набор данных

Если все считается правильно, должны быть получены следующие результаты (координаты точек даны как широта/долгота, расстояние в метрах, начальный угол в десятичных градусах):

# Точка 1 Точка 2 Расстояние Угол
1 77.1539/-139.398 -77.1804/-139.55 17166029 180.077867811
2 77.1539/120.398 77.1804/129.55 225883 84.7925159033
3 77.1539/-120.398 77.1804/129.55 2332669 324.384112704

[править] Ссылки по теме

gis-lab.info

Путевые углы и расстояние между двумя точками на ортодроме (дуге большого круга).

Как ранее уже говорилось тут Путевой угол и расстояние между двумя точками по локсодроме (линии румба)., если двигаться по поверхности Земли из точки А в точку Б, выдерживая один и тот же путевой угол, пройденный вами путь не будет кратчайшим расстоянием между этими точками.Чтобы достичь цели кратчайшим путем, необходимо постоянно корректировать путевой угол, чтобы траектория движения была приближена к дуге большого круга (ортодромии), которая и будет кратчайшим расстоянием между двумя точками. Калькулятор представленный далее вычисляет расстояние между двумя координатами, начальный путевой угол, конечный путевой угол, а также путевые углы в промежуточных точках. Отличие этого калькулятора от разработанного ранее Расстояние между двумя координатами, заключается в том, что в данном калькуляторе используется предельно точный алгоритм, разработанный польским ученым Тадеушем Винсенти (Thaddeus Vincenty). Погрешность вычисления не превышает 0.5 мм.

Начальная точка, широтаНачальная точка, долготаКонечная точка, широтаКонечная точка, долготаРеференц-эллипсоид Точность вычисления

Знаков после запятой: 2

Начальный азимут

 

Конечный азимут

 

Расстояние в километрах

 

Расстояние в морских милях

 

Расстояние между путевыми точками (км)

 

Расстояние между путевыми точками (м.м.)

 

Путевые точки

Сохранить share extension

Сначала была решена обратная геодезическая задача — вычислено расстояние между двумя точками и найдены начальные и конечные дирекционные углы. Затем полученное расстояние было разбито на равное число отрезков, в соответствии с заданным количеством путевых точек, и для каждого отрезка решалась прямая геодезическая задача — находились координаты следующей точки по заданному дирекционному углу и координатам предыдущей точки. Для решения применялся алгоритм Vincenty, который в деталях описан тут Direct and Inverse Solutions of Geodesics on the Ellipsoid with application of nested equations, Survey Review, April 1975.

planetcalc.ru

Вычисление расстояния и начального азимута между двумя точками на сфере — GIS-Lab

Измерение расстояния и начального азимута между точками без проекционных преобразований

Введение

Длина дуги большого круга – кратчайшее расстояние между любыми двумя точками находящимися на поверхности сферы, измеренное вдоль линии соединяющей эти две точки (такая линия носит название ортодромии) и проходящей по поверхности сферы или другой поверхности вращения. Сферическая геометрия отличается от обычной Эвклидовой и уравнения расстояния также принимают другую форму. В Эвклидовой геометрии, кратчайшее расстояние между двумя точками – прямая линия. На сфере, прямых линий не бывает. Эти линии на сфере являются частью больших кругов – окружностей, центры которых совпадают с центром сферы.

Начальный азимут - азимут, взяв который при начале движения из точки А, следуя по большому кругу на кратчайшее расстояние до точки B, конечной точкой будет точка B. При движении из точки A в точку B по линии большого круга азимут из текущего положения на конечную точку B постоянно меняется. Начальный азимут [angles-rhumb.html отличен от постоянного], следуя которому, азимут из текущей точки на конечную не меняется, но маршрут следования не является кратчайшим расстоянием между двумя точками.

большой круг

Через любые две точки на поверхности сферы, если они не прямо противоположны друг другу (то есть не являются антиподами), можно провести уникальный большой круг. Две точки, разделяют большой круг на две дуги. Длина короткой дуги – кратчайшее расстояние между двумя точками. Между двумя точками-антиподами можно провести бесконечное количество больших кругов, но расстояние между ними будет одинаково на любом круге и равно половине окружности круга, или pi*R, где R – радиус сферы.

расстояние большого круга

На плоскости (в прямоугольной системе координат), большие круги и их фрагменты, как было упомянуто выше, представляют собой дуги во всех проекциях, кроме гномонической, где большие круги - прямые линии. На практике это означает, что самолеты и другой авиатранспорт всегда использует маршрут минимального расстояния между точками для экономии топлива, то есть полет осуществляется по расстоянию большого круга, на плоскости это выглядит как дуга.

Маршрут Нью-Йорк - Пекин

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

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

Известно, что более точно описывает форму Земли не сфера, а эллипсоид, однако в данной статье рассматривается вычисление расстояний именно на сфере, для вычислений используется сфера радиусом 6372795 метров, что может привести к ошибке вычисления расстояний порядка 0.5%.

Формулы

Существует три способа расчета сферического расстояния большого круга (подробнее).

Сферическая теорема косинусов

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

- широта и долгота двух точек в радианах

- разница координат по долготе

- угловая разница

Для перевода углового расстояния в метрическое, нужно угловую разницу умножить на радиус Земли (6372795 метров), единицы конечного расстояния будут равны единицам, в которых выражен радиус (в данном случае - метры).

Формула гаверсинусов

Используется, чтобы избежать проблем с небольшими расстояниями.

Модификация для антиподов

Предыдущая формула также подвержена проблеме точек-антиподов, чтобы ее решить используется следующая ее модификация.

Реализация на Avenue

На языке Avenue, используя последнюю формулу для вычисления расстояния большого круга между двумя точками, можно использовать следующий код. Точки для вычисления передаются другим скриптом, либо добавляются в начало данного в виде pnt = point.make(long, lat) (скачать скрипт):

'pnt1, pnt2 - точки между которыми вычисляются расстояния 'pi - число pi, rad - радиус сферы (Земли), num - количество знаков после запятой pi = 3.14159265358979 rad = 6372795 num = 7 'получение координат точек в радианах lat1 = pnt1.getY*pi/180 lat2 = pnt2.getY*pi/180 long1 = pnt1.getX*pi/180 long2 = pnt2.getX*pi/180 'косинусы и синусы широт и разниц долгот cl1 = lat1.cos cl2 = lat2.cos sl1 = lat1.sin sl2 = lat2.sin delta = long2 - long1 cdelta = delta.cos sdelta = delta.sin 'вычисления длины большого круга p1 = (cl2*sdelta)^2 p2 = ((cl1*sl2) - (sl1*cl2*cdelta))^2 p3 = (p1 + p2)^0.5 p4 = sl1*sl2 p5 = cl1*cl2*cdelta p6 = p4 + p5 p7 = p3/p6 anglerad = (p7.atan).SetFormatPrecision (num)dist = anglerad*rad'вычисление начального азимутаx = (cl1*sl2) - (sl1*cl2*cdelta) y = sdelta*cl2 z = (-y/x).ATan.AsDegrees if (x < 0) then z = z+180 end z = -(z + 180 mod 360 - 180).AsRadiansanglerad2 = z - ((2*pi)*((z/(2*pi)).floor)) angledeg = (anglerad2*180)/pi

'возврат значений длины большого круга и начального азимутаdistlist = {dist, angledeg}return distlist

Для вызова процедуры расчета длин приведенной выше, можно также воспользоваться следующим скриптом, результатом его работы будет расчет длин между точкой testpont до всех точек активной темы вида и запись результата в поле Newdist атрибутивной таблицы этой темы:

atheme = av.getactivedoc.getactivethemes.get(0) aftab = atheme.getftab f_shape = aftab.findfield("Shape") f_dist = aftab.findfield("dist")f_ang = aftab.findfield("ang") 'testpoint - точка отсчета testpoint = point.make(25.85, 55.15) aftab.seteditable(true) 'для каждой точки темы до которых считают расстояния от точки отсчета for each rec in aftab pnts = {} apoint = aftab.returnvalue(f_shape, rec) pnts.add(apoint.getx) pnts.add(testpoint.getx) pnts.add(apoint.gety) pnts.add(testpoint.gety) 'Вызов процедуры расчета расстояний '"Calc-distance" - название скрипта с процедурой в проекте param = av.run("Calc-distance", pnts) aftab.setvalue(f_dist, rec, param.get(0)) aftab.setvalue(f_ang, rec, param.get(1)) end aftab.seteditable(false)

Реализация на языке Python

Реализует полный вариант расчета через atan2(), более универсальнее, чем вариант для Avenue. (скачать скрипт)

import math #pi - число pi, rad - радиус сферы (Земли) rad = 6372795 #координаты двух точек llat1 = 77.1539 llong1 = -120.398 llat2 = 77.1804 llong2 = 129.55 #в радианах lat1 = llat1*math.pi/180. lat2 = llat2*math.pi/180. long1 = llong1*math.pi/180. long2 = llong2*math.pi/180. #косинусы и синусы широт и разницы долгот cl1 = math.cos(lat1) cl2 = math.cos(lat2) sl1 = math.sin(lat1) sl2 = math.sin(lat2) delta = long2 - long1 cdelta = math.cos(delta) sdelta = math.sin(delta) #вычисления длины большого круга y = math.sqrt(math.pow(cl2*sdelta,2)+math.pow(cl1*sl2-sl1*cl2*cdelta,2)) x = sl1*sl2+cl1*cl2*cdelta ad = math.atan2(y,x) dist = ad*rad #вычисление начального азимута x = (cl1*sl2) - (sl1*cl2*cdelta) y = sdelta*cl2 z = math.degrees(math.atan(-y/x)) if (x < 0): z = z+180. z2 = (z+180.) % 360. - 180. z2 = - math.radians(z2) anglerad2 = z2 - ((2*math.pi)*math.floor((z2/(2*math.pi))) ) angledeg = (anglerad2*180.)/math.pi print 'Distance >> %.0f' % dist, ' [meters]' print 'Initial bearing >> ', angledeg, '[degrees]'

Реализация в Excel

Скачать пример расчета расстояния большого круга и начального азимута в Excel. Демонстрирует расчеты через закон косинусов, гаверсинус, полное уравнение и полное уравнение через atan2().

Можно также воспользоваться следующей функцией:

Public Function Distance_A_B(Lat1 As Double, Long1 As Double, Lat2 As Double, Long2 As Double) 'определение расстояний между географическими координатами. Координаты должны быть десятичными 'расстояние выводится в метрах With Application.WorksheetFunction Distance_A_B = .Atan2(Sin(.Pi() * Lat1 / 180) * Sin(.Pi() * Lat2 / 180) + Cos(.Pi() * Lat1 / 180) * Cos(.Pi() * Lat2 / 180) * Cos(Abs(.Pi() * Long2 / 180 - .Pi() * Long1 / 180)), _ ((Cos(.Pi() * Lat2 / 180) * Sin(.Pi() * Long2 / 180 - .Pi() * Long1 / 180)) ^ 2 + (Cos(.Pi() * Lat1 / 180) * Sin(.Pi() * Lat2 / 180) - Sin(.Pi() * Lat1 / 180) * Cos(.Pi() * Lat2 / 180) * Cos(Abs(.Pi() * Long2 / 180 - .Pi() * Long1 / 180))) ^ 2) ^ 0.5) * 6372795 End With End Function

Проверочный набор данных

Если все считается правильно, должны быть получены следующие результаты (координаты точек даны как широта/долгота, расстояние в метрах, начальный угол в десятичных градусах):

# Точка 1 Точка 2 Расстояние Угол
1 77.1539/-139.398 -77.1804/-139.55 17166029 180.077867811
2 77.1539/120.398 77.1804/129.55 225883 84.7925159033
3 77.1539/-120.398 77.1804/129.55 2332669 324.384112704

Ссылки по теме

wiki.gis-lab.info

Расчет расстояния по GPS координатам — Bobrowski Think

Для одного из проектоа было необходимо расчитать расстояние по координатам записанным мобильным приложением для протоколирования перемещений.

казалосьбы все сводится к расчету расстояния между двемя точками умноженному на некий коэфициент.

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

Но все таки если использовать в расчетах числа, допустим, с 20 знаками после запятой, то расчеты не столь будут отличатся. А вот если не учесть высоту, вернее ее перепад то здесь раскуем получить еще более не точные данные чем у китайского велокопютера.

Например  у нас есть две точки GPS (latitude,longitude,elevation):

  1. 2014-04-27T11:38:02Z, 50.879874, 34.808982, 142.400000, 16.000000, 0.000000, 0.000000
  2. 2014-04-27T11:39:03Z, 50.879840, 34.808827, 167.300000, 4.000000, 0.000000, 0.000000

Удельное расстояние ( метров на 1 градус  ) на изменение долготы (Lon, вдоль линии широты) будет изменяться, поэтому что бы не путаться мы будем использовать эту единицу расчитанную по конечной точке.

Итак, нам необходимо два удельных расстояния, по широте и долготе.

Для начала получим удельное расстояние по меридиану (УРМ). Одно не изменно для любой точки земного шара.

УРМ = Окружность земли / 360 градусов. 

УРМ = Радиус земли * 2 * Пи / 360 градусов. 

УРМ = 6371км * 2 * Пи / 360 градусов = 111,194926645 км / градус.

Теперь Удельное расстояние по паралели(УРП). Оно будет иметь разное значение для для разных широт.

УРП = Окружность по паралели / 360 градусов.

Для вычисления окружности по паралели нам необходимо знать ее радиус, у для радиуса — широту данной паралели.

Радиус паралели = Радиус земли * cos( Широты ).

Отсюда,

УРП = Радиус земли * cos( Широты )  * 2 * Пи / 360 градусов.

Забавно, но можно все упростить. «cos( Широты ) * ( Радиус земли * 2 * Пи / 360 градусов)«. Вторая  часть нам уже известна. Получается:

УРП = cos( Широты ) * УРМ.

УРП = cos( 50.879840 ) * УРМ = 0,630948827 * 111,194926645 км / градус == 70,158308514 км / градус

Расстояние между этими двумя чточками будет вычисляться по теореме Пифогора:

Расстояние = кв. клорень (расстояние по меридиану^2 + расстояние по паралели^2 )

Расстояние по меридиану = Разница широт * УРМ

Расстояние по меридиану = (50.879874 — 50.879840)  * 111,194926645 км / градус = 0,003780628 км

Расстояние по паралели = Разница долготы * УРП

Расстояние по паралели = (34.808982 — 34.808827) * 70,158308514 км / градус == 0,010874538 км

Ну и момент истинны:

Расстояние = кв. клорень (0,003780628^2 +0,010874538^2 ) == 0,011512981 км = 11,512981 м

Кстати кому интересно то мосмотреть пройденый путь по GPS-координатам или визуализировать GPX-файлы можно на этом сайте для велосипедистов motion.atf.li

bobrowski.ru