В основе системы координат CesiumJS лежит модель WGS84 (World Geodetic System 1984), представляющая Землю в виде эллипсоида вращения. Все пространственные данные в сцене в конечном итоге приводятся к этой модели, независимо от исходной проекции.
Внутреннее представление координат в движке опирается на два ключевых типа:
Перевод между ними осуществляется через геодезическую модель эллипсоида:
const cartographic = Cesium.Cartographic.fromDegrees(longitude, latitude, height);
const cartesian = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);
Cartographic используется как промежуточная форма, тогда как Cartesian3 применяется непосредственно в рендеринге WebGL.
CesiumJS не использует традиционные 2D-проекции в основной 3D-сцене. Вместо этого применяется геоцентрическая система координат, где:
Это означает отсутствие классического этапа «проецирования карты на плоскость» в стандартном смысле. Все объекты уже находятся в 3D-геометрии эллипсоида.
Основные преобразования:
ECEF является фундаментальной системой, используемой внутри движка. Любая точка на поверхности Земли выражается относительно центра эллипсоида:
const center = Cesium.Cartesian3.fromDegrees(37.6173, 55.7558, 0);
Для локальных вычислений часто используется система ENU (East-North-Up), которая строится относительно выбранной точки:
const transform = Cesium.Transforms.eastNorthUpToFixedFrame(center);
Матрица transform позволяет переводить локальные координаты в глобальные ECEF.
Несмотря на 3D-основу, значительная часть тайловых слоёв использует проекцию Web Mercator (EPSG:3857).
Она применяется в:
Web Mercator преобразует сферические координаты в плоскость:
CesiumJS автоматически преобразует тайлы Web Mercator в геометрическое пространство сцены.
Изображения на поверхности Земли управляются через imagery layers. Каждый слой может использовать собственную проекцию, но финальная визуализация всегда приводится к геометрии эллипсоида.
Пример добавления слоя:
const viewer = new Cesium.Viewer("cesiumContainer");
viewer.imageryLayers.addImageryProvider(
new Cesium.IonImageryProvider({ assetId: 2 })
);
Проекционные преобразования происходят в несколько этапов:
Эллипсоид используется для всех вычислений геометрии поверхности:
Ключевой объект:
const ellipsoid = Cesium.Ellipsoid.WGS84;
Преобразование географических координат:
const position = ellipsoid.cartographicToCartesian(
Cesium.Cartographic.fromDegrees(10, 45, 100)
);
Эта модель обеспечивает корректное отображение даже на больших масштабах без разрывов и искажений, характерных для плоских карт.
Полная цепочка преобразований в CesiumJS выглядит следующим образом:
Пример получения финального преобразования:
const scene = viewer.scene;
const camera = scene.camera;
const matrix = camera.viewMatrix;
const projection = camera.frustum.projectionMatrix;
Эти матрицы определяют, как 3D-координаты преобразуются в 2D-экран.
Камера в CesiumJS определяет текущую проекцию сцены через свою матрицу перспективы.
Основной режим — perspective projection, где объекты уменьшаются с удалением от камеры.
Настройка камеры:
viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(30, 50, 1000000)
});
Параметры frustum влияют на характер проекции:
viewer.camera.frustum.fov = Cesium.Math.toRadians(60);
Обратное преобразование используется для взаимодействия с картой:
const cartesian = viewer.scene.pickPosition(windowPosition);
const cartographic = Cesium.Cartographic.fromCartesian(cartesian);
const longitude = Cesium.Math.toDegrees(cartographic.longitude);
const latitude = Cesium.Math.toDegrees(cartographic.latitude);
Этот процесс включает:
В отличие от 2D-карт, где проекции неизбежно искажают:
в CesiumJS искажения перераспределяются на уровень эллипсоида и камеры. Это приводит к следующим особенностям:
3D-модели (glTF) размещаются с учётом локальных трансформаций:
const modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(
Cesium.Cartesian3.fromDegrees(40, 55, 0),
new Cesium.HeadingPitchRoll(0, 0, 0)
);
Такая матрица связывает локальную систему модели с глобальной системой ECEF.
CesiumJS ориентирован на WGS84, однако реальные данные могут использовать другие системы:
При загрузке данных выполняется нормализация:
Прямые линии в 3D-сцене не являются геодезическими на поверхности Земли. Для корректного отображения используются:
const geodesic = new Cesium.EllipsoidGeodesic(
Cesium.Cartographic.fromDegrees(0, 0),
Cesium.Cartographic.fromDegrees(30, 40)
);
Интерполяция вдоль эллипсоида обеспечивает корректную кривую маршрута.
Внутренняя архитектура CesiumJS постоянно переключается между пространствами:
Каждое преобразование основано на матричной алгебре и эллипсоидной модели Земли, что позволяет объединять растровые, векторные и 3D-данные в единую сцену без явного этапа 2D-проецирования.