Геодезический калькулятор, пишем на Python
Коротко: в этой статье мы шаг за шагом создадим полноценный геодезический калькулятор на Python без внешних библиотек. Он умеет считать расстояния и азимуты по эллипсоиду WGS84 (алгоритм Винценти), строить прямую геодезическую задачу, конвертировать координаты между широтой/долготой/высотой (LLA) и правой прямоугольной системой (ECEF), переходить к локальным координатам ENU, вычислять площадь сферического полигона, а также выполнять полезные преобразования формата координат (DMS↔DD). Мы разберём математику, архитектуру кода, тесты и типичные ловушки практики. Требования: Python 3.8+, любые ОС. Сам калькулятор не требует внешних модулей. Все исходники и иллюстрации можно скачать по ссылкам ниже. Почему эллипсоид? Земля не идеальный шар. Для точного позиционирования используют референсный эллипсоид вращения WGS84. Он задаётся большой полуосью a, сжатием f и малой полуосью b=a·(1−f), а также эксцентриситетом e²=f·(2−f). Геодезическая линия — кратчайшая на поверхности эллипсоида. Для точных расчётов применим метод Винценти. Системы координат: LLA (φ,λ,h), ECEF (X,Y,Z) — геоцентрическая, и локальная ENU (East, North, Up). Обратная задача Винценти: DMS↔DD. Реализуем универсальный парсер и форматер с поддержкой °′″, разделителей и N/S/E/W. LLA↔ECEF. X=(N+h)cosφcosλ, Y=(N+h)cosφsinλ, Z=(N(1−e²)+h)sinφ; обратное — итерация по φ до стабилизации. ECEF→ENU. Переносим начало в опорную точку и поворачиваем оси по φ₀,λ₀. Получаем (E,N,U) — удобно в инженерной практике. Площадь на сфере. Суммируем "углы поворота" по рёбрам через atan2. Подходит для оценок, когда эллипсоидная точность не требуется. CLI. Подкоманды: distance, direct, dms2dd, dd2dms, lla2ecef, ecef2lla, enu, area. Примеры использования приведены в тексте. Тесты. Проверяем совпадающие точки, почти антиподы, полярные области, взаимные преобразования LLA↔ECEF, ENU, DMS↔DD, площади. Производительность. Реализация без зависимостей быстра для большинства задач; для предельной точности внедряйте Карни. Расширения. UTM/Гаусс–Крюгер, эллипсоидные площади, датумы и 7-параметрические преобразования, GeoJSON/GPX, батч-режим. FAQ. Почему не сходится Винценти? — антиподы; у нас есть fallback. Какова точность сферической площади? — зависит от размера контура. Почему ENU «крутятся»? — это локальная касательная плоскость. Итог. У нас готов рабочий геодезический калькулятор на чистом Python, пригодный для практики и расширений. Численная устойчивость, нормализация углов, контроль сходимости, логирование тяжёлых случаев, профилирование критичных участков и тестирование на наборах «плохих» точек — ключ к надёжному коду. Для реального времени избегайте лишних аллокаций, кэшируйте константы, прогнозируйте ветвления. Для пакетной обработки применяйте векторизацию и параллелизм, но не забывайте о контроле точности.Введение и цели
Базовые понятия геодезии
Параметр
Обозначение
Значение
Ед.
Большая полуось
a
6378137.0
м
Сжатие
f
1/298.257223563
—
Малая полуось
b = a·(1−f)
6356752.314245
м
Первый эксцентриситет²
e² = f·(2−f)
0.006694379990
—
Геодезическая на эллипсоиде: Винценти
Форматы координат DMS↔DD
Преобразования LLA↔ECEF
Локальная система ENU
Площадь полигона на сфере
Иллюстрации



Примеры и сверка результатов
From
To
Lat,Lon (deg)
Lat,Lon (deg)
Distance (m)
Init Az (°)
Final Az (°)
Athens
Moscow
37.9838, 23.7275
55.7558, 37.6173
2,288,167.3
26.829
204.648
Athens
New York
37.9838, 23.7275
40.7128, -74.0060
7,927,170.8
300.036
100.803
Tokyo
Sydney
35.6895, 139.6917
-33.8688, 151.2093
7,816,588.0
157.653
20.913
Quito
New York
-0.1807, -78.4678
40.7128, -74.0060
4,523,557.2
20.612
197.897
Cape Town
Rio de Janeiro
-33.9249, 18.4241
-22.9068, -43.1729
6,095,321.9
297.011
92.105
Moscow
Tokyo
55.7558, 37.6173
35.6895, 139.6917
7,481,335.6
69.771
276.848
Sydney
Rio de Janeiro
-33.8688, 151.2093
-22.9068, -43.1729
13,330,649.9
142.472
312.370
Командная строка и сценарии использования
Исходники
Тестирование и валидация
Производительность и точность
Расширения и дорожная карта
FAQ
Выводы
Дополнительные заметки
В калькулятор добавлено:
- UTM (WGS84) прямое/обратное преобразование
- Гаусса–Крюгера (3° или 6° зоны; классический «немецкий» режим с префиксом зоны в восточном смещении)
- Пакетные преобразования CSV
- Трансформации GeoJSON (Point/LineString/Polygon/Multi*)
- Импорт/экспорт GPX (вейпойнты)
Как работать со скриптом (кликнуть)
Размещено: 28.10.2025
geodesic_calculator3.7z (6.96 Kb), ishodny_cod.txt (27.35 Kb)


