Переключение проекций

В CesiumJS геометрическая модель мира построена вокруг глобуса, а не плоской карты. Это принципиально отличает её от классических 2D-картографических библиотек. Основная проекция здесь — географическая (WGS84 эллипсоид), на которую накладываются различные режимы отображения сцены.

Внутренняя архитектура разделяет два уровня:

  • Геометрическая модель Земли (Globe) — всегда остаётся сфероидальной
  • Режимы отображения сцены (Scene Modes) — определяют способ визуализации

Таким образом, «переключение проекций» в CesiumJS на практике означает смену режима сцены и/или математической проекции тайлового слоя.


Режимы сцены и их значение

CesiumJS поддерживает три основных режима отображения:

3D-глобус (SCENE3D)

Режим трёхмерного глобуса представляет Землю как эллипсоид с возможностью вращения и наклона камеры.

Ключевые характеристики:

  • Полноценная 3D-геометрия
  • Поддержка высотных данных (terrain)
  • Реалистичное освещение и тени
  • Перспективная камера

В коде:

viewer.scene.mode = Cesium.SceneMode.SCENE3D;

Этот режим является базовым и используется по умолчанию.


2D-карта (SCENE2D)

2D-режим представляет поверхность Земли в виде плоской проекции. Геометрия глобуса «разворачивается» в плоскость.

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

  • Отсутствие перспективы
  • Ортографическая камера
  • Упрощённая навигация по карте
  • Ограниченная работа с высотами

В Cesium используется Web Mercator как базовая схема отображения тайлов.

viewer.scene.mode = Cesium.SceneMode.SCENE2D;

В этом режиме камера теряет свободу наклона и вращения вокруг горизонта.


Columbus View (COLUMBUS_VIEW)

Гибридный режим между 2D и 3D. Геометрия отображается в псевдотрёхмерной проекции:

  • X/Y — географические координаты
  • Z — высота
  • Камера остаётся ортографической
viewer.scene.mode = Cesium.SceneMode.COLUMBUS_VIEW;

Этот режим часто используется для анализа рельефа без полной 3D-нагрузки.


Механизм переключения режимов сцены

Переключение режимов сцены выполняется через свойство scene.mode. Важно учитывать, что Cesium выполняет внутреннюю интерполяцию камеры при переходе между режимами.

Прямое переключение

viewer.scene.mode = Cesium.SceneMode.SCENE2D;
viewer.scene.mode = Cesium.SceneMode.SCENE3D;
viewer.scene.mode = Cesium.SceneMode.COLUMBUS_VIEW;

Анимированное переключение

Используется метод morphTo, обеспечивающий плавный переход:

viewer.scene.morphTo2D(1.5);
viewer.scene.morphTo3D(2.0);
viewer.scene.morphToColumbusView(1.5);

Параметр определяет длительность анимации в секундах.


Проекции тайловых слоёв

Помимо режима сцены, важную роль играет проекция растровых данных (imagery layers).

Web Mercator Projection

Стандартная проекция для большинства картографических источников:

  • EPSG:3857
  • Используется большинством тайловых серверов
  • Оптимизирована для квадратных тайлов

В Cesium она используется по умолчанию для imagery layers.


Geographic Projection (EPSG:4326)

Альтернативная схема, основанная на широте и долготе:

  • Прямоугольная сетка координат
  • Отсутствие искажений на полюсах в математическом смысле
  • Используется реже из-за несовместимости с тайловыми схемами

Настройка проекции через ImageryProvider

Cesium позволяет задавать проекцию через провайдер изображений.

WebMapTileServiceImageryProvider

const layer = new Cesium.WebMapTileServiceImageryProvider({
    url: "https://example.com/wmts",
    layer: "layer_name",
    style: "default",
    format: "image/png",
    tileMatrixSetID: "GoogleMapsCompatible"
});
viewer.imageryLayers.addImageryProvider(layer);

Здесь проекция определяется сервером тайлов.


TileCoordinatesImageryProvider

Используется для диагностики тайловой структуры:

const debugLayer = new Cesium.TileCoordinatesImageryProvider();
viewer.imageryLayers.addImageryProvider(debugLayer);

Позволяет визуально анализировать проекцию тайлов.


Влияние камеры на восприятие проекции

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

  • В 3D-режиме камера имеет перспективную матрицу
  • В 2D и Columbus View используется ортографическая проекция
  • Параметры камеры напрямую влияют на визуальное искажение

Ключевые параметры:

viewer.camera.position
viewer.camera.direction
viewer.camera.up
viewer.camera.frustum

Программное управление переходами

Определение текущего режима

const mode = viewer.scene.mode;

if (mode === Cesium.SceneMode.SCENE3D) {
    console.log("3D режим");
}

Плавная логика переключения

function switchMode(targetMode) {
    if (targetMode === Cesium.SceneMode.SCENE2D) {
        viewer.scene.morphTo2D(1.0);
    }

    if (targetMode === Cesium.SceneMode.SCENE3D) {
        viewer.scene.morphTo3D(1.0);
    }

    if (targetMode === Cesium.SceneMode.COLUMBUS_VIEW) {
        viewer.scene.morphToColumbusView(1.0);
    }
}

Особенности переходов между 2D и 3D

При переходе между режимами происходит трансформация координат:

  • Географические координаты остаются неизменными
  • Изменяется матрица проекции камеры
  • Перестраивается сцена Globe rendering pipeline

Важный аспект — сохранение текущего центра карты:

viewer.scene.camera.flyHome(0);

или

viewer.camera.setView({
    destination: Cesium.Cartesian3.fromDegrees(37.6173, 55.7558, 1000000)
});

Ограничения и особенности архитектуры

  • Globe остаётся неизменным во всех режимах
  • 2D и Columbus View являются визуальными трансформациями
  • Не существует «переключения проекций» в классическом GIS-смысле
  • Большинство искажений контролируется камерой и тайловой сеткой

Взаимодействие с террейном при смене режимов

Terrain остаётся активным в 3D и Columbus View, но:

  • В 2D режимах высотная модель упрощается
  • Некоторые эффекты освещения отключаются
  • Производительность повышается за счёт отключения 3D-рендеринга
viewer.terrainProvider = Cesium.createWorldTerrain();

Практическая модель восприятия проекций

С точки зрения архитектуры CesiumJS:

  • «Проекция» = способ отображения глобуса
  • «Режим сцены» = визуальный контейнер проекции
  • «Imagery projection» = способ разбиения текстурных тайлов
  • «Camera projection» = математическое преобразование координат в экран

Эти уровни работают независимо, но синхронизированы через рендер-цикл сцены.