Задачи на сфере: обратная геодезическая задача: различия между версиями

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
 
(не показано 95 промежуточных версий 2 участников)
Строка 1: Строка 1:
{{Статья|Черновик}}
{{Статья|Опубликована|sphere-geodesic-invert-problem}}


{{Аннотация|Обратная геодезическая задача — это нахождение начального направления и расстояния между двумя точками с известными координатами.}}
{{Аннотация|Обратная геодезическая задача — это нахождение начального направления и расстояния между двумя точками с известными координатами.}}


== Введение ==
== Общие положения ==


В качестве модели Земли принимается сфера с радиусом ''R'', равным среднему радиусу земного эллипсоида. Введём следующие обозначения:
В качестве модели Земли принимается сфера с радиусом ''R'', равным среднему радиусу земного эллипсоида. Аналогом прямой линии на плоскости является геодезическая линия на поверхности. На сфере геодезическая линия — дуга большого круга.
 
Введём следующие обозначения:
* ''φ'' — географическая широта,
* ''φ'' — географическая широта,
* ''λ'' — географическая долгота,
* ''λ'' — географическая долгота,
Строка 11: Строка 13:
* ''σ'' — сферическое расстояние (длина дуги большого круга, выраженная в долях радиуса шара).
* ''σ'' — сферическое расстояние (длина дуги большого круга, выраженная в долях радиуса шара).


Линейное расстояние по дуге большого круга связано со сферическим расстоянием формулой
Линейное расстояние по дуге большого круга ''s'' связано со сферическим расстоянием ''σ'' формулой ''s'' = ''R σ''.
<math>s = R σ</math>.


Прямая и обратная геодезические задачи являются важными этапами в решении более сложных геодезических задач.
Прямая и обратная геодезические задачи являются важными элементами более сложных геодезических задач.


== Постановка задачи ==
== Постановка задачи ==
[[Image:Sphere-task-inverse.png|frame|c|right|Обратная геодезическая задача]]


; Исходные данные
; Исходные данные
: координаты пунктов ''Q''₁ и ''Q''₂ на сфере — ''φ''₁, ''λ''₁ и ''φ''₂, ''λ''₂.
: координаты пунктов ''Q''₁ и ''Q''₂ на сфере — ''φ''₁, ''λ''₁ и ''φ''₂, ''λ''₂.
; Определяемые величины
; Определяемые величины
: расстояние между пунктами ''σ'', начальный азимут направления ''α''₁ в точке ''Q''₁ на пункт ''Q''₂.
: расстояние между пунктами и начальный азимут направления с точки ''Q''₁ на пункт ''Q''₂ — ''σ'', ''α''.
 
[[Image:sph_inv.png|none|x]]


На рисунке синим цветом выделены заданные элементы сферического треугольника, красным цветом неизвестные.
На рисунке синим цветом выделены заданные элементы сферического треугольника, красным цветом неизвестные.
Строка 29: Строка 30:
== Алгоритм ==
== Алгоритм ==


Существует огромное множество подходов к решению поставленной задачи. Рассмотрим простой и надёжный векторный метод.
Существует великое множество подходов к решению поставленной задачи. Рассмотрим простой и надёжный векторный метод.


'''Последовательность решения''':
'''Последовательность решения''':
# преобразовать углы (''λ''₂ ''λ''₁) и ''φ''₂ в декартовы координаты,
# преобразовать углы ''φ''₂ и ''λ''₂ в декартовы координаты,
# развернуть координатные оси на угол 90° − ''φ''₁ вокруг оси ''Y'',
# развернуть координатные оси вокруг оси ''Z'' на угол ''λ''₁,
# преобразовать декартовы координаты в сферические,
# развернуть координатные оси вокруг оси ''Y'' на угол (90° − ''φ''₁),
# преобразовать декартовы координаты в сферические.
 
Можно устранить второй пункт, если в первом заменить долготу ''λ''₂ на разность долгот (''λ''₂ − ''λ''₁).


Пример реализации алгоритма в виде функции языка Си:
Пример реализации алгоритма в виде функции языка Си:
Строка 43: Строка 47:
  *
  *
  * Аргументы исходные:
  * Аргументы исходные:
  *    pt1  - {широта, долгота} точки Q₁
  *    pt1  - {широта, долгота} точки Q1
  *    pt2  - {широта, долгота} точки Q₂
  *    pt2  - {широта, долгота} точки Q2
  *
  *
  * Аргументы определяемые:
  * Аргументы определяемые:
Строка 55: Строка 59:


   SpherToCart(pt2, x); // сферические -> декартовы
   SpherToCart(pt2, x); // сферические -> декартовы
   Rotate(x, pt1[1], 2); // (первое вращение)
   Rotate(x, pt1[1], 2); // первое вращение
   Rotate(x, M_PI_2 - pt1[0], 1); // (второе) вращение
   Rotate(x, M_PI_2 - pt1[0], 1); // второе вращение
   CartToSpher(x, pt);     // декартовы -> сферические
   CartToSpher(x, pt);     // декартовы -> сферические
   *azi = M_PI - pt[1];
   *azi = M_PI - pt[1];
Строка 65: Строка 69:
</syntaxhighlight>
</syntaxhighlight>


В этом примере вычисление разности долгот заменено ещё одним вращением.
Следует заметить, что прямая и обратная задача математически идентичны, и алгоритмы их решения зеркально отражают друг друга.


Следует заметить, что алгоритм решения обратной задачи является «перевёртышем» алгоритма прямой задачи.
=== Преобразование сферических координат в декартовы ===


=== Преобразование сферических координат в декартовы ===
: <math>\begin{align}
x & = \cos \varphi \cos \lambda \\
y & = \cos \varphi \sin \lambda \\
z & = \sin \varphi
\end{align}</math>


<math>\begin{array}{rcl}
В данном случае в качестве сферических координат ''φ'', ''λ'' подставим ''φ''₂, ''λ''₂.
x & = & \cos \phi_2 \cos_(\lambda_2 - \lambda_1) \\
y & = & \cos \phi_2 \sin_\lambda_2 \\
z & = & \sin \phi_2
\end{array}</math>


Реализация на Си:
Реализация на Си:
Строка 86: Строка 90:
  *    y - {широта, долгота}
  *    y - {широта, долгота}
  *
  *
  * Аргумены определяемые:
  * Аргументы определяемые:
  *    x - вектор {x, y, z}
  *    x - вектор {x, y, z}
  */
  */
Строка 104: Строка 108:
=== Вращение вокруг оси ===
=== Вращение вокруг оси ===


Собственно работа векторного метода выполняется вращением вокруг координатной оси Y:
Представим оператор вращения вокруг оси ''X'' на угол ''θ'' в следующем виде:
<math>\begin{array}{rcl}
 
x' & = & - z \cos \phi_1 + x \sin \phi_1
: <math>\begin{align}
y' & = & y
x' & = x \\
z' & = & z \sin \phi_1 + x \cos \phi_1
y' & = y \cos \theta + z \sin \theta \\
\end{array}</math>
z' & = - y \sin \theta + z \cos \theta
\end{align}</math>
 
Операторы вращения вокруг осей ''Y'' и ''Z'' получаются перестановкой символов.
 
Реализация вращения вокруг ''i''-ой координатной оси на Си:
 
<syntaxhighlight lang="c">
/*
* Вращение вокруг координатной оси
*
* Аргументы:
*    x - входной/выходной 3-вектор
*    a - угол вращения
*    i - номер координатной оси (0..2)
*/
void Rotate(double x[], double a, int i)
{
  double c, s, xj;
  int j, k;
 
  j = (i + 1) % 3;
  k = (i - 1) % 3;
  c = cos(a);
  s = sin(a);
  xj = x[j] * c + x[k] * s;
  x[k] = -x[j] * s + x[k] * c;
  x[j] = xj;
 
  return;
}
</syntaxhighlight>


=== Преобразование декартовых координат в сферические ===
=== Преобразование декартовых координат в сферические ===


<math>\begin{array}{rcl}
: <math>\begin{align}
α₁ & = & 180^{\circ} − \operatorname{arctg} \frac{y}{x} \\
\lambda & = \operatorname{arctg\,} \dfrac{y}{x} \\
σ & = & 90^{\circ} − \operatorname{arctg} \frac{z}{\sqrt{x^2 + y^2}}
\varphi & = \operatorname{arctg\,} \dfrac{z}{\sqrt{x^2 + y^2}}
\end{array}</math>
\end{align}</math>
 
В данном случае в роли сферических координат ''φ'', ''λ'' окажутся углы (90° − ''σ''), (180° − ''α''₁).
 
Реализация на Си:


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Строка 133: Строка 172:
double CartToSpher(double x[], double y[])
double CartToSpher(double x[], double y[])
{
{
   double p, z;
   double p;


  z = x[2];
   p = hypot(x[0], x[1]);
   p = sqrt(x[0] * x[0] + x[1] * x[1]);
   y[1] = atan2(x[1], x[0]);
   y[1] = atan2(x[1], x[0]);
   y[0] = atan2(z, p);
   y[0] = atan2(x[2], p);


   return sqrt(p * p + z * z);
   return hypot(p, x[2]);
}
}
</syntaxhighlight>
</syntaxhighlight>
Строка 146: Строка 184:
== Пример программной реализации ==
== Пример программной реализации ==


Исходники вышеприведённых функций можно найти в [[Медиа:sph.tar.gz|архиве]] в файле '''sph.c'''. Кроме того, в файл '''sph.h''' включены следующие определения:
Исходники вышеприведённых функций можно найти в архиве [[Медиа:Sph.zip|Sph.zip]] в файле '''sph.c'''. Кроме того, в файл '''sph.h''' включены следующие определения:


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Строка 173: Строка 211:
     pt2[0] = Radians(lat2);
     pt2[0] = Radians(lat2);
     pt2[1] = Radians(lon2);
     pt2[1] = Radians(lon2);
     SphereInverse(pt2, pt1, &azi2, &dist);
     SphereInverse(pt2, pt1, &azi2, &dist); // Решение обратной задачи
     SphereInverse(pt1, pt2, &azi1, &dist);
     SphereInverse(pt1, pt2, &azi1, &dist); // Вычисление обратного азимута
     printf("%f\t%f\t%.4f\n", Degrees(azi1), Degrees(azi2), dist * A_E);
     printf("%f\t%f\t%.4f\n", Degrees(azi1), Degrees(azi2), dist * A_E);
   }
   }
Строка 181: Строка 219:
</syntaxhighlight>
</syntaxhighlight>


В [[Медиа:sph.tar.gz|архиве]] этот код находится в файле '''inv.c'''. Создадим исполняемый модуль '''inv''' компилятором '''gcc''':
В архиве [[Медиа:Sph.zip|Sph.zip]] этот код находится в файле '''inv.c'''. Создадим исполняемый модуль '''inv''' компилятором '''gcc''':


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Строка 187: Строка 225:
</syntaxhighlight>
</syntaxhighlight>


Для MS Windows готовую программу '''inv.exe''' можно найти в [[Медиа:sph-win32.zip|архиве]].
Впрочем, в архиве есть '''Makefile'''. Для MS Windows готовую программу '''inv.exe''' можно найти в архиве [[Медиа:Sph-win32.zip|Sph-win32.zip]].


Программа читает данные со стандартного ввода консоли и отправляет результаты на стандартный вывод. Для чтения и записи файлов используются символы перенаправления потока «&gt;» и «&lt;» соответственно. Из каждой строки ввода программа считывает координаты двух точек ''φ''₁, ''λ''₁, ''φ''₂, ''λ''₂, которые должны быть в градусах, решает обратную задачу и записывает в строку вывода ''α''₁, ''α''₂, ''s'' (азимуты прямого и обратного направлений в градусах и расстояние между пунктами в единицах, определённых константой <tt>A_E</tt>).
Программа читает данные из стандартного ввода консоли и отправляет результаты на стандартный вывод. Для чтения и записи файлов используются символы перенаправления потока «&gt;» и «&lt;» соответственно. Из каждой строки ввода программа считывает координаты двух точек ''φ''₁, ''λ''₁, ''φ''₂, ''λ''₂, которые должны быть в градусах, решает обратную задачу и записывает в строку вывода ''α''₁, ''α''₂, ''s'' (азимуты прямого и обратного направлений в градусах; расстояние между пунктами в километрах, а точнее, в единицах, определённых константой <tt>A_E</tt>).


Создадим файл '''inv.dat''', содержащий одну строку данных:
Создадим файл '''inv.dat''', содержащий одну строку данных:
Строка 209: Строка 247:
</pre>
</pre>


== Решение обратной задачи средствами PROJ.4 ==
В архиве [[Медиа:Sph-py.zip|Sph-py.zip]] находятся скрипты на языке Питон. Выполнение скрипта в командной консоли:
 
<syntaxhighlight lang="bash">
$ python inv.py inv.dat
</syntaxhighlight>
 
== Решение обратной задачи средствами PROJ ==


В пакет PROJ.4 входит программа '''geod''', предназначенная для решения прямых и обратных геодезических задач на сфере. Так выглядит команда обработки файла '''inv.dat''':
В пакет PROJ входит программа '''geod''', предназначенная для решения прямых и обратных геодезических задач на сфере. Так выглядит команда обработки файла '''inv.dat''':


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
$ geod +a=6371000 -I -f "%f" -F "%.4f" +units=km inv.dat
$ geod +a=6371000 +b=6371000 -I -f "%f" -F "%.4f" +units=km inv.dat
</syntaxhighlight>
</syntaxhighlight>


Параметр <tt>+a</tt> определяет радиус сферы, <tt>-I</tt> — решение обратных задач, <tt>-f</tt> — формат вывода угловых величин, <tt>-F</tt> — формат вывода длин линий, <tt>+units</tt> — единица измерения расстояний. В результате получим идентичный результат:
Параметр <tt>+a</tt> определяет радиус сферы, <tt>-I</tt> — решение обратных задач, <tt>-f</tt> — формат вывода угловых величин, <tt>-F</tt> — формат вывода длин линий, <tt>+units</tt> — единица измерения расстояний. В результате получим идентичный вывод:


<pre>
<pre>
Строка 223: Строка 267:
</pre>
</pre>


Отличие значений ''α''₂ на 360° объясняется тем, что '''inv''' выводит азимуты в диапазоне от 0° до 360°, а '''geod''' от −180° до +180°.
Различие значений ''α''₂ на 360° объясняется тем, что '''inv''' выводит азимуты в диапазоне от 0° до 360°, а '''geod''' от −180° до +180°.


== Альтернативные методы ==
== Альтернативные методы ==


Некоторые элементы альтернативных методов решения обратной задачи представлены в статье [[Вычисление_расстояния_и_начального_азимута_между_двумя_точками_на_сфере Вычисление расстояния и начального азимута между двумя точками на сфере]]
Некоторые элементы альтернативных методов решения обратной задачи представлены в статье [http://gis-lab.info/qa/great-circles.html Вычисление расстояния и начального азимута между двумя точками на сфере].
 
В большинстве своём другие методы основаны на сферической тригонометрии. Многие из них используют вычисление ''σ'' или ''α''₁ по таким функциям, как синус, косинус или гаверсинус. Это приводит к неоднозначности результатов вблизи особых значений, когда производная функции равна нулю. Такие методы не могут считаться универсальными.
 
К наиболее надёжным относится следующий способ:
 
<math>\begin{align}
\xi & = \sin \varphi_2 \cos \varphi_1 - \cos \varphi_2 \sin \varphi_1 \cos (\lambda_2 - \lambda_1) \\
\eta & = \cos \varphi_2 \sin (\lambda_2 - \lambda_1) \\
\operatorname{tg\,} \alpha_1 & = \dfrac{\eta}{\xi} \\
\operatorname{tg\,} \sigma & = \dfrac{\xi \cos \alpha_1 + \eta \sin \alpha_1}{\sin \varphi_1 \sin \varphi_2 + \cos \varphi_1 \cos \varphi_2 \cos (\lambda_2 - \lambda_1)}
\end{align}</math>
 
В сферической тригонометрии углы и стороны должны быть в диапазоне [0, 180°]. Алгоритмизация формул требует анализа и обработки случаев, когда входные величины не попадают в эти рамки.


== Ссылки ==
== Ссылки ==
* [[Вычисление расстояния и начального азимута между двумя точками на сфере]]
* [http://gis-lab.info/qa/great-circles.html Вычисление расстояния и начального азимута между двумя точками на сфере]
* [http://gis-lab.info/qa/sphere-geodesic-direct-problem.html Задачи на сфере: прямая геодезическая задача]
* [http://gis-lab.info/qa/sphere-geodesic-angular-resection.html Задачи на сфере: угловая засечка]
* [http://gis-lab.info/qa/sphere-geodesic-linear-resection.html Задачи на сфере: линейная засечка]
* [http://www.pm298.ru/sferich.php Краткий справочник по сферической тригонометрии]
* [http://trac.osgeo.org/proj/wiki/man_geod man_geod – PROJ.4]
* [http://en.wikipedia.org/wiki/Earth_radius Earth radius]
* [http://gis-lab.info/docs/books/sphere-trigonometry/sphere-trigonometry.rar Степанов Н. Н. Сферическая тригонометрия]
* [http://gis-lab.info/docs/books/sphere-trigonometry/sphere-trigonometry.rar Степанов Н. Н. Сферическая тригонометрия]
* [http://en.wikipedia.org/wiki/Earth_Radius Earth Radius]

Текущая версия от 06:46, 10 мая 2020

Эта страница опубликована в основном списке статей сайта
по адресу http://gis-lab.info/qa/sphere-geodesic-invert-problem.html


Обратная геодезическая задача — это нахождение начального направления и расстояния между двумя точками с известными координатами.

Общие положения

В качестве модели Земли принимается сфера с радиусом R, равным среднему радиусу земного эллипсоида. Аналогом прямой линии на плоскости является геодезическая линия на поверхности. На сфере геодезическая линия — дуга большого круга.

Введём следующие обозначения:

  • φ — географическая широта,
  • λ — географическая долгота,
  • α — азимут дуги большого круга,
  • σ — сферическое расстояние (длина дуги большого круга, выраженная в долях радиуса шара).

Линейное расстояние по дуге большого круга s связано со сферическим расстоянием σ формулой s = R σ.

Прямая и обратная геодезические задачи являются важными элементами более сложных геодезических задач.

Постановка задачи

Обратная геодезическая задача
Исходные данные
координаты пунктов Q₁ и Q₂ на сфере — φ₁, λ₁ и φ₂, λ₂.
Определяемые величины
расстояние между пунктами и начальный азимут направления с точки Q₁ на пункт Q₂ — σ, α₁.

На рисунке синим цветом выделены заданные элементы сферического треугольника, красным цветом неизвестные.

Алгоритм

Существует великое множество подходов к решению поставленной задачи. Рассмотрим простой и надёжный векторный метод.

Последовательность решения:

  1. преобразовать углы φ₂ и λ₂ в декартовы координаты,
  2. развернуть координатные оси вокруг оси Z на угол λ₁,
  3. развернуть координатные оси вокруг оси Y на угол (90° − φ₁),
  4. преобразовать декартовы координаты в сферические.

Можно устранить второй пункт, если в первом заменить долготу λ₂ на разность долгот (λ₂ − λ₁).

Пример реализации алгоритма в виде функции языка Си:

/*
 * Решение обратной геодезической задачи
 *
 * Аргументы исходные:
 *     pt1  - {широта, долгота} точки Q1
 *     pt2  - {широта, долгота} точки Q2
 *
 * Аргументы определяемые:
 *     azi  - азимут начального направления
 *     dist - расстояние (сферическое)
 */
void SphereInverse(double pt1[], double pt2[], double *azi, double *dist)
{
  double x[3], pt[2];

  SpherToCart(pt2, x);			// сферические -> декартовы
  Rotate(x, pt1[1], 2);			// первое вращение
  Rotate(x, M_PI_2 - pt1[0], 1);	// второе вращение
  CartToSpher(x, pt);	     		// декартовы -> сферические
  *azi = M_PI - pt[1];
  *dist = M_PI_2 - pt[0];

  return;
}

Следует заметить, что прямая и обратная задача математически идентичны, и алгоритмы их решения зеркально отражают друг друга.

Преобразование сферических координат в декартовы

В данном случае в качестве сферических координат φ, λ подставим φ₂, λ₂.

Реализация на Си:

/*
 * Преобразование сферических координат в вектор
 *
 * Аргументы исходные:
 *     y - {широта, долгота}
 *
 * Аргументы определяемые:
 *     x - вектор {x, y, z}
 */
void SpherToCart(double y[], double x[])
{
  double p;

  p = cos(y[0]);
  x[2] = sin(y[0]);
  x[1] = p * sin(y[1]);
  x[0] = p * cos(y[1]);

  return;
}

Вращение вокруг оси

Представим оператор вращения вокруг оси X на угол θ в следующем виде:

Операторы вращения вокруг осей Y и Z получаются перестановкой символов.

Реализация вращения вокруг i-ой координатной оси на Си:

/*
 * Вращение вокруг координатной оси
 *
 * Аргументы:
 *     x - входной/выходной 3-вектор
 *     a - угол вращения
 *     i - номер координатной оси (0..2)
 */
void Rotate(double x[], double a, int i)
{
  double c, s, xj;
  int j, k;

  j = (i + 1) % 3;
  k = (i - 1) % 3;
  c = cos(a);
  s = sin(a);
  xj = x[j] * c + x[k] * s;
  x[k] = -x[j] * s + x[k] * c;
  x[j] = xj;

  return;
}

Преобразование декартовых координат в сферические

В данном случае в роли сферических координат φ, λ окажутся углы (90° − σ), (180° − α₁).

Реализация на Си:

/*
 * Преобразование вектора в сферические координаты
 *
 * Аргументы исходные:
 *     x - {x, y, z}
 *
 * Аргументы определяемые:
 *     y - {широта, долгота}
 *
 * Возвращает:
 *     длину вектора
 */
double CartToSpher(double x[], double y[])
{
  double p;

  p = hypot(x[0], x[1]);
  y[1] = atan2(x[1], x[0]);
  y[0] = atan2(x[2], p);

  return hypot(p, x[2]);
}

Пример программной реализации

Исходники вышеприведённых функций можно найти в архиве Sph.zip в файле sph.c. Кроме того, в файл sph.h включены следующие определения:

#define A_E 6371.0				// радиус Земли в километрах
#define Degrees(x) (x * 57.29577951308232)	// радианы -> градусы
#define Radians(x) (x / 57.29577951308232)	// градусы -> радианы

Теперь напишем программу, которая обращается к функции SphereInverse для решения обратной задачи:

#include <stdio.h>
#include <stdlib.h>
#include "sph.h"

int main(int argc, char *argv[])
{
  char buf[1024];
  double pt1[2], pt2[2];
  double lat1, lon1, lat2, lon2, azi1, azi2, dist;

  while (fgets(buf, 1024, stdin) != NULL) {
    sscanf(buf, "%lf %lf %lf %lf", &lat1, &lon1, &lat2, &lon2);
    pt1[0] = Radians(lat1);
    pt1[1] = Radians(lon1);
    pt2[0] = Radians(lat2);
    pt2[1] = Radians(lon2);
    SphereInverse(pt2, pt1, &azi2, &dist);		// Решение обратной задачи
    SphereInverse(pt1, pt2, &azi1, &dist);		// Вычисление обратного азимута
    printf("%f\t%f\t%.4f\n", Degrees(azi1), Degrees(azi2), dist * A_E);
  }
  return 0;
}

В архиве Sph.zip этот код находится в файле inv.c. Создадим исполняемый модуль inv компилятором gcc:

$ gcc -o inv inv.c sph.c -lm

Впрочем, в архиве есть Makefile. Для MS Windows готовую программу inv.exe можно найти в архиве Sph-win32.zip.

Программа читает данные из стандартного ввода консоли и отправляет результаты на стандартный вывод. Для чтения и записи файлов используются символы перенаправления потока «>» и «<» соответственно. Из каждой строки ввода программа считывает координаты двух точек φ₁, λ₁, φ₂, λ₂, которые должны быть в градусах, решает обратную задачу и записывает в строку вывода α₁, α₂, s (азимуты прямого и обратного направлений в градусах; расстояние между пунктами в километрах, а точнее, в единицах, определённых константой A_E).

Создадим файл inv.dat, содержащий одну строку данных:

30 0 52 54

После запуска программы

$ inv < inv.dat

получим α₁, α₂, s:

44.804060 262.415109 5001.1309

В архиве Sph-py.zip находятся скрипты на языке Питон. Выполнение скрипта в командной консоли:

$ python inv.py inv.dat

Решение обратной задачи средствами PROJ

В пакет PROJ входит программа geod, предназначенная для решения прямых и обратных геодезических задач на сфере. Так выглядит команда обработки файла inv.dat:

$ geod +a=6371000 +b=6371000 -I -f "%f" -F "%.4f" +units=km inv.dat

Параметр +a определяет радиус сферы, -I — решение обратных задач, -f — формат вывода угловых величин, -F — формат вывода длин линий, +units — единица измерения расстояний. В результате получим идентичный вывод:

44.804060 -97.584891 5001.1309

Различие значений α₂ на 360° объясняется тем, что inv выводит азимуты в диапазоне от 0° до 360°, а geod от −180° до +180°.

Альтернативные методы

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

В большинстве своём другие методы основаны на сферической тригонометрии. Многие из них используют вычисление σ или α₁ по таким функциям, как синус, косинус или гаверсинус. Это приводит к неоднозначности результатов вблизи особых значений, когда производная функции равна нулю. Такие методы не могут считаться универсальными.

К наиболее надёжным относится следующий способ:

В сферической тригонометрии углы и стороны должны быть в диапазоне [0, 180°]. Алгоритмизация формул требует анализа и обработки случаев, когда входные величины не попадают в эти рамки.

Ссылки