В CesiumJS фундаментальная модель позиционирования основана на эллипсоиде WGS84, который аппроксимирует форму Земли. Любая точка на поверхности или над ней описывается через систему Cartographic координат, включающую:
Эта система является промежуточным представлением между геодезическими координатами и декартовыми координатами сцены.
В CesiumJS координаты Cartographic представлены объектом
Cesium.Cartographic, который хранит значения в
радианах для широты и долготы и в метрах для
высоты:
const carto = new Cesium.Cartographic(
longitude,
latitude,
height
);
Ключевая особенность:
longitude — радианыlatitude — радианыheight — метры относительно поверхности эллипсоидаИспользование радиан является внутренним стандартом библиотеки, обеспечивающим согласованность с математическими функциями тригонометрии и вычислениями на сфере.
В большинстве внешних источников координаты задаются в градусах. CesiumJS предоставляет утилиты для преобразования:
const longitude = Cesium.Math.toRadians(45.0);
const latitude = Cesium.Math.toRadians(60.0);
const carto = new Cesium.Cartographic(longitude, latitude, 1000.0);
Также возможно обратное преобразование:
const lonDeg = Cesium.Math.toDegrees(carto.longitude);
const latDeg = Cesium.Math.toDegrees(carto.latitude);
Высота в Cartographic измеряется относительно
поверхности эллипсоида WGS84, а не уровня моря. Это создаёт важное
различие:
CesiumJS использует именно эллипсоидальную модель, что упрощает расчёты и обеспечивает согласованность в 3D пространстве.
Для отображения в сцене CesiumJS использует декартову систему
координат Cartesian3. Преобразование выполняется через
эллипсоид:
const cartesian = Cesium.Ellipsoid.WGS84.cartographicToCartesian(carto);
Алгоритм включает:
Получение географических координат из 3D точки выполняется следующим образом:
const carto = Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian);
Результат содержит:
Это преобразование критично для:
Долгота в Cartographic не ограничена диапазоном, но обычно приводится к интервалу:
CesiumJS предоставляет нормализацию:
const lon = Cesium.Math.negativePiToPi(longitude);
Широта ограничена физически:
Выход за пределы приводит к некорректной геометрии.
Cartographic не является визуальной сущностью. Это:
Внутри CesiumJS Cartographic используется для:
В контексте 3D Tiles и terrain:
При линейной интерполяции между двумя точками важно учитывать сферическую природу координат:
const result = Cesium.Cartographic.lerp(
startCarto,
endCarto,
t,
new Cesium.Cartographic()
);
Особенности:
Распространённые проблемы:
1. Использование градусов вместо радиан
// некорректно
new Cesium.Cartographic(45, 60, 1000);
// корректно
new Cesium.Cartographic(
Cesium.Math.toRadians(45),
Cesium.Math.toRadians(60),
1000
);
2. Игнорирование системы высот
Высота воспринимается как эллипсоидальная, что приводит к:
3. Неправильная нормализация долготы
При пересечении ±180° возникают скачки координат.
Для оптимизации CesiumJS часто использует TypedArray-подобные структуры:
const positions = [
new Cesium.Cartographic(lon1, lat1, h1),
new Cesium.Cartographic(lon2, lat2, h2),
new Cesium.Cartographic(lon3, lat3, h3)
];
Такие массивы применяются в:
Cartographic координаты становятся основой для проецирования на поверхность:
const positions = Cesium.Cartographic.fromCartesianArray(cartesianArray);
или через выборку высот:
Cesium.sampleTerrainMostDetailed(
viewer.terrainProvider,
cartographics
);
Cartographic является базовой системой для:
Внутренние алгоритмы CesiumJS опираются на эллипсоидальные вычисления, а не на плоскую проекцию.
При частых преобразованиях между Cartographic и Cartesian3 возникает накопление погрешности:
Поэтому предпочтительно минимизировать цепочки преобразований и работать в одной системе координат на этапе вычислений.