Работа с проекциями

В основе системы координат CesiumJS лежит модель WGS84 (World Geodetic System 1984), представляющая Землю в виде эллипсоида вращения. Все пространственные данные в сцене в конечном итоге приводятся к этой модели, независимо от исходной проекции.

Внутреннее представление координат в движке опирается на два ключевых типа:

  • Cartesian3 — декартовы координаты в метрах относительно центра Земли
  • Cartographic — географические координаты (долгота, широта, высота)

Перевод между ними осуществляется через геодезическую модель эллипсоида:

const cartographic = Cesium.Cartographic.fromDegrees(longitude, latitude, height);
const cartesian = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);

Cartographic используется как промежуточная форма, тогда как Cartesian3 применяется непосредственно в рендеринге WebGL.


Географическая проекция как базовая модель сцены

CesiumJS не использует традиционные 2D-проекции в основной 3D-сцене. Вместо этого применяется геоцентрическая система координат, где:

  • центр системы совпадает с центром Земли
  • оси ориентированы относительно вращения планеты
  • расстояния измеряются в метрах в 3D-пространстве

Это означает отсутствие классического этапа «проецирования карты на плоскость» в стандартном смысле. Все объекты уже находятся в 3D-геометрии эллипсоида.

Основные преобразования:

  • геодезические координаты → ECEF (Earth-Centered, Earth-Fixed)
  • ECEF → экранные координаты (через матрицы вида и проекции камеры)

ECEF и локальные системы координат

ECEF является фундаментальной системой, используемой внутри движка. Любая точка на поверхности Земли выражается относительно центра эллипсоида:

const center = Cesium.Cartesian3.fromDegrees(37.6173, 55.7558, 0);

Для локальных вычислений часто используется система ENU (East-North-Up), которая строится относительно выбранной точки:

const transform = Cesium.Transforms.eastNorthUpToFixedFrame(center);

Матрица transform позволяет переводить локальные координаты в глобальные ECEF.


Географическая проекция Web Mercator

Несмотря на 3D-основу, значительная часть тайловых слоёв использует проекцию Web Mercator (EPSG:3857).

Она применяется в:

  • картографических подложках
  • тайловых сервисах (XYZ tiles)
  • растровых слоях

Web Mercator преобразует сферические координаты в плоскость:

  • долгота → X
  • широта → Y (с нелинейным искажением)

CesiumJS автоматически преобразует тайлы Web Mercator в геометрическое пространство сцены.


Слои Imagery и их проекционные особенности

Изображения на поверхности Земли управляются через imagery layers. Каждый слой может использовать собственную проекцию, но финальная визуализация всегда приводится к геометрии эллипсоида.

Пример добавления слоя:

const viewer = new Cesium.Viewer("cesiumContainer");

viewer.imageryLayers.addImageryProvider(
    new Cesium.IonImageryProvider({ assetId: 2 })
);

Проекционные преобразования происходят в несколько этапов:

  1. тайл запрашивается в Web Mercator или другой проекции
  2. выполняется перепроецирование на эллипсоид
  3. текстура накладывается на геометрию поверхности

Ellipsoid как базовая математическая модель

Эллипсоид используется для всех вычислений геометрии поверхности:

  • вычисление расстояний
  • интерполяция траекторий
  • определение нормалей
  • геодезические линии

Ключевой объект:

const ellipsoid = Cesium.Ellipsoid.WGS84;

Преобразование географических координат:

const position = ellipsoid.cartographicToCartesian(
    Cesium.Cartographic.fromDegrees(10, 45, 100)
);

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


Матрицы преобразования и цепочка координат

Полная цепочка преобразований в CesiumJS выглядит следующим образом:

  1. Cartographic (λ, φ, h)
  2. Cartesian3 (ECEF)
  3. Model/View матрица
  4. Projection матрица камеры
  5. Screen space coordinates

Пример получения финального преобразования:

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 влияют на характер проекции:

  • field of view (FOV)
  • near/far planes
  • aspect ratio
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, однако реальные данные могут использовать другие системы:

  • NAD83
  • локальные геодезические системы
  • Web Mercator (как промежуточная проекция)

При загрузке данных выполняется нормализация:

  • пересчёт датумов
  • преобразование в WGS84
  • приведение к ECEF

Геодезические линии как проекционные траектории

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

const geodesic = new Cesium.EllipsoidGeodesic(
    Cesium.Cartographic.fromDegrees(0, 0),
    Cesium.Cartographic.fromDegrees(30, 40)
);

Интерполяция вдоль эллипсоида обеспечивает корректную кривую маршрута.


Итерация между пространствами координат

Внутренняя архитектура CesiumJS постоянно переключается между пространствами:

  • географическое (Cartographic)
  • геоцентрическое (ECEF)
  • локальное (ENU, model space)
  • экранное (window coordinates)

Каждое преобразование основано на матричной алгебре и эллипсоидной модели Земли, что позволяет объединять растровые, векторные и 3D-данные в единую сцену без явного этапа 2D-проецирования.