Расстояния по геодезическим линиям

В трёхмерной геопространственной визуализации в CesiumJS ключевую роль играет корректное понимание того, что расстояние между двумя точками на поверхности Земли не совпадает с евклидовой прямой в 3D-пространстве. Земля моделируется не сферой, а эллипсоидом WGS84, поэтому кратчайшие пути на её поверхности определяются как геодезические линии — кривые, минимизирующие длину на поверхности эллипсоида.

Geodesic представляет собой обобщение понятия «прямой» на искривлённых поверхностях. В контексте CesiumJS это фундамент для корректного измерения расстояний, построения маршрутов и анализа траекторий.


Эллипсоид WGS84 и модель Земли в CesiumJS

Cesium использует стандартный геодезический эллипсоид:

  • экваториальный радиус: 6378137.0 м
  • полярное сжатие: 1 / 298.257223563

Эта модель задаётся объектом Ellipsoid.WGS84, который используется во всех геодезических вычислениях.

Ключевая проблема при работе с глобусом заключается в том, что:

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

Геодезическое расстояние и его отличие от 3D-метрики

В CesiumJS существует три основных подхода к измерению расстояний:

  1. Евклидово расстояние в 3D (Cartesian space) Используется Cartesian3.distance(a, b) Недостаток: игнорирует поверхность Земли.

  2. Геодезическое расстояние (surface distance) Учитывает эллипсоидальную форму Земли.

  3. Приближённое планарное расстояние Используется в локальных сценах или малых масштабах.

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


EllipsoidGeodesic как базовый инструмент вычислений

Центральный класс для работы с геодезическими линиями — EllipsoidGeodesic.

Он строится на двух точках в географических координатах:

  • долгота (longitude)
  • широта (latitude)

и возвращает параметры геодезической линии на эллипсоиде.

Создание геодезической линии

const geodesic = new Cesium.EllipsoidGeodesic(
    Cesium.Cartographic.fromDegrees(30.0, 50.0),
    Cesium.Cartographic.fromDegrees(40.0, 55.0)
);

Здесь точки задаются в радианах внутри Cartographic, но удобнее использовать fromDegrees.


Вычисление длины геодезической линии

Основное свойство — surfaceDistance:

const distance = geodesic.surfaceDistance;
console.log(distance); // расстояние в метрах

Особенности:

  • значение вычисляется по эллипсоиду;
  • результат всегда в метрах;
  • учитывает кривизну поверхности;
  • значительно точнее, чем 3D-дистанция.

Интерполяция вдоль геодезической линии

Одно из ключевых применений — получение промежуточных точек.

Метод interpolateUsingFraction(f) позволяет получить координату на линии:

const start = Cesium.Cartographic.fromDegrees(10, 45);
const end = Cesium.Cartographic.fromDegrees(20, 55);

const geodesic = new Cesium.EllipsoidGeodesic(start, end);

const midpoint = geodesic.interpolateUsingFraction(0.5);
console.log(midpoint.longitude, midpoint.latitude);

Фракция f:

  • 0.0 — начальная точка
  • 1.0 — конечная точка
  • промежуточные значения — точки на геодезической кривой

Построение геодезической полилинии

Для отображения линии на глобусе недостаточно соединить две точки прямым отрезком в 3D. Cesium использует дискретизацию геодезической кривой.

Пример генерации точек:

const start = Cesium.Cartographic.fromDegrees(0, 0);
const end = Cesium.Cartographic.fromDegrees(60, 40);

const geodesic = new Cesium.EllipsoidGeodesic(start, end);

const positions = [];
const steps = 100;

for (let i = 0; i <= steps; i++) {
    const fraction = i / steps;
    const pos = geodesic.interpolateUsingFraction(fraction);
    positions.push(
        Cesium.Cartesian3.fromRadians(pos.longitude, pos.latitude)
    );
}

Далее positions можно использовать в PolylineGeometry.


Сравнение геодезической и локсодромной линии

В геопространственных вычислениях часто противопоставляются два типа линий:

  • Геодезическая линия — кратчайший путь
  • Локсодромия (rhumb line) — линия постоянного азимута

CesiumJS по умолчанию работает именно с геодезией, поскольку:

  • она минимизирует длину пути;
  • корректна для глобальных маршрутов;
  • используется в авиации и навигации.

Локсодромия полезна, когда важно постоянное направление, но не оптимальная длина.


Расстояние по поверхности через samplePositions

Для более сложных случаев используется дискретизация:

const positions = geodesic.generateArc({
    numberOfPoints: 50
});

или ручной метод через интерполяцию.

Полученные точки можно анализировать:

  • суммировать сегменты;
  • учитывать рельеф;
  • строить профили высот.

Учёт рельефа при геодезических вычислениях

Геодезическая линия вычисляется на идеализированном эллипсоиде и не учитывает высоту terrain. Для анализа реального расстояния необходимо:

  • получить высоты через sampleTerrain;
  • пересчитать сегменты в 3D.

Пример подхода:

const cartographics = positions.map(p =>
    Cesium.Cartographic.fromCartesian(p)
);

// далее используется sampleTerrain

После получения высот можно построить 3D-ломаную.


Практическая разница между 3D и геодезическим расстоянием

Рассмотрим две точки:

  • точка A (Москва)
  • точка B (Пекин)

Если измерять:

  • через Cartesian3.distance — результат будет «прямой сквозь Землю»
  • через EllipsoidGeodesic.surfaceDistance — реальная длина маршрута

Разница может составлять сотни километров, что критично для:

  • авиационных симуляторов
  • морской навигации
  • расчёта орбитальных трасс

Использование в аналитике и визуализации

Геодезические линии применяются в CesiumJS в нескольких ключевых задачах:

  • построение маршрутов транспорта;
  • визуализация перелётов;
  • измерение расстояний между объектами;
  • расчёт зон покрытия;
  • анализ траекторий спутников.

Особенно важно, что геодезические вычисления не зависят от масштаба сцены — они остаются корректными на любом уровне приближения.


Оптимизация вычислений

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

  • избегать слишком мелкой дискретизации;
  • кэшировать результаты surfaceDistance;
  • использовать предварительно рассчитанные arcs;
  • минимизировать повторные создания EllipsoidGeodesic.

Геодезические линии в глобальных сценах Cesium

В глобальных сценах CesiumJS геодезия становится основой всех линейных объектов:

  • CorridorGeometry
  • PolylineGeometry
  • EllipseGeometry (частично)
  • Path visualization

Все эти сущности используют внутреннюю геодезическую интерполяцию для корректного отображения на эллипсоиде.


Математическая основа вычислений

В основе EllipsoidGeodesic лежит решение обратной геодезической задачи:

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

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


Типичные ошибки при работе с геодезическими расстояниями

На практике часто возникают следующие ошибки:

  • использование Cartesian3.distance вместо геодезического метода;
  • игнорирование необходимости интерполяции;
  • смешивание радиан и градусов;
  • отсутствие учёта эллипсоида (переход к сфере без необходимости).

Корректная работа всегда требует явного перехода через Cartographic и Ellipsoid.WGS84.


Связь с координатными системами Cesium

Геодезические вычисления тесно связаны с преобразованиями:

  • Cartographic — географические координаты
  • Cartesian3 — декартова система сцены
  • Matrix4 — трансформации объектов

Геодезическая линия всегда определяется в Cartographic, после чего проецируется в 3D.


Итоговая модель вычисления расстояния

Полный процесс вычисления геодезического расстояния в CesiumJS можно формализовать так:

  1. преобразование входных координат в Cartographic;
  2. создание EllipsoidGeodesic;
  3. получение surfaceDistance;
  4. при необходимости — интерполяция промежуточных точек;
  5. преобразование результата в Cartesian3 для визуализации.

Этот подход обеспечивает математически корректное представление расстояний на глобусе и является фундаментом всех пространственных измерений в CesiumJS.