В трёхмерной геопространственной визуализации в CesiumJS ключевую роль играет корректное понимание того, что расстояние между двумя точками на поверхности Земли не совпадает с евклидовой прямой в 3D-пространстве. Земля моделируется не сферой, а эллипсоидом WGS84, поэтому кратчайшие пути на её поверхности определяются как геодезические линии — кривые, минимизирующие длину на поверхности эллипсоида.
Geodesic представляет собой обобщение понятия «прямой» на искривлённых поверхностях. В контексте CesiumJS это фундамент для корректного измерения расстояний, построения маршрутов и анализа траекторий.
Cesium использует стандартный геодезический эллипсоид:
Эта модель задаётся объектом Ellipsoid.WGS84, который
используется во всех геодезических вычислениях.
Ключевая проблема при работе с глобусом заключается в том, что:
Cartesian3 не
соответствует реальному пути по поверхности;В CesiumJS существует три основных подхода к измерению расстояний:
Евклидово расстояние в 3D (Cartesian space)
Используется Cartesian3.distance(a, b) Недостаток:
игнорирует поверхность Земли.
Геодезическое расстояние (surface distance) Учитывает эллипсоидальную форму Земли.
Приближённое планарное расстояние Используется в локальных сценах или малых масштабах.
Геодезическое расстояние является основным для глобальных приложений.
Центральный класс для работы с геодезическими линиями —
EllipsoidGeodesic.
Он строится на двух точках в географических координатах:
и возвращает параметры геодезической линии на эллипсоиде.
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); // расстояние в метрах
Особенности:
Одно из ключевых применений — получение промежуточных точек.
Метод 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.
В геопространственных вычислениях часто противопоставляются два типа линий:
CesiumJS по умолчанию работает именно с геодезией, поскольку:
Локсодромия полезна, когда важно постоянное направление, но не оптимальная длина.
Для более сложных случаев используется дискретизация:
const positions = geodesic.generateArc({
numberOfPoints: 50
});
или ручной метод через интерполяцию.
Полученные точки можно анализировать:
Геодезическая линия вычисляется на идеализированном эллипсоиде и не учитывает высоту terrain. Для анализа реального расстояния необходимо:
sampleTerrain;Пример подхода:
const cartographics = positions.map(p =>
Cesium.Cartographic.fromCartesian(p)
);
// далее используется sampleTerrain
После получения высот можно построить 3D-ломаную.
Рассмотрим две точки:
Если измерять:
Cartesian3.distance — результат будет «прямой
сквозь Землю»EllipsoidGeodesic.surfaceDistance — реальная
длина маршрутаРазница может составлять сотни километров, что критично для:
Геодезические линии применяются в CesiumJS в нескольких ключевых задачах:
Особенно важно, что геодезические вычисления не зависят от масштаба сцены — они остаются корректными на любом уровне приближения.
При работе с большим количеством геодезических линий важно учитывать производительность:
surfaceDistance;EllipsoidGeodesic.В глобальных сценах CesiumJS геодезия становится основой всех линейных объектов:
CorridorGeometryPolylineGeometryEllipseGeometry (частично)Path visualizationВсе эти сущности используют внутреннюю геодезическую интерполяцию для корректного отображения на эллипсоиде.
В основе EllipsoidGeodesic лежит решение обратной
геодезической задачи:
Алгоритмы используют итерационные методы приближения, так как аналитическое решение на эллипсоиде сложно и не выражается в элементарных функциях.
На практике часто возникают следующие ошибки:
Cartesian3.distance вместо геодезического
метода;Корректная работа всегда требует явного перехода через
Cartographic и Ellipsoid.WGS84.
Геодезические вычисления тесно связаны с преобразованиями:
Cartographic — географические координатыCartesian3 — декартова система сценыMatrix4 — трансформации объектовГеодезическая линия всегда определяется в Cartographic,
после чего проецируется в 3D.
Полный процесс вычисления геодезического расстояния в CesiumJS можно формализовать так:
Cartographic;EllipsoidGeodesic;surfaceDistance;Cartesian3 для
визуализации.Этот подход обеспечивает математически корректное представление расстояний на глобусе и является фундаментом всех пространственных измерений в CesiumJS.