2D режим

CesiumJS использует гибридную архитектуру визуализации, в которой один и тот же набор данных может быть отображён в трёх режимах: глобус (3D), 2D карта и Columbus View (2.5D). 2D-режим в рамках CesiumJS представляет собой ортографическую проекцию всей сцены на плоскость с сохранением тайловой структуры, координатной модели и механизмов рендеринга слоёв.

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

Ключевой принцип заключается в том, что:

  • геометрия перестраивается в плоскую проекцию;
  • камера переключается в ортографический режим;
  • ось высот фактически игнорируется для большинства визуальных сущностей;
  • уровень детализации (LOD) сохраняется.

Основное отличие от 3D заключается не в данных, а в способе их проецирования.

Переключение в 2D-режим

Переход между режимами осуществляется через морфинг сцены:

viewer.scene.morphTo2D(0.0);

Параметр задаёт длительность перехода. Нулевое значение означает мгновенное переключение.

Возврат в 3D:

viewer.scene.morphTo3D(0.0);

и переход в Columbus View:

viewer.scene.morphToColumbusView(0.0);

Морфинг не пересоздаёт сцену, а изменяет матрицы камеры и параметры проекции.

Камера и система координат

В 2D-режиме камера перестаёт использовать перспективную проекцию. Вместо этого применяется ортографическая матрица.

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

  • отсутствует перспективное искажение;
  • масштаб зависит только от высоты камеры над плоскостью;
  • направление взгляда фиксируется строго вниз по оси Z;
  • вращение сцены ограничено или полностью отключено.

Координатная система остаётся географической (долгота/широта), но отображается в декартовой 2D-плоскости через проекцию Web Mercator.

Web Mercator и плоская проекция

Визуализация основана на проекции Web Mercator (EPSG:3857). Она преобразует сферические координаты в плоскость:

  • долгота отображается по оси X;
  • широта — по оси Y с нелинейным масштабированием;
  • полюса обрезаются из-за асимптотического поведения проекции.

Такой подход обеспечивает совместимость с тайловыми картами (XYZ, WMTS, TMS).

Тайловая система в 2D

Тайловый движок остаётся идентичным 3D-режиму. Изменяется только способ их отображения.

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

  • одинаковая схема z/x/y координат;
  • динамическая подгрузка тайлов при панорамировании;
  • кеширование изображений на уровне текстур WebGL;
  • подстройка уровня детализации при изменении масштаба.

При увеличении масштаба происходит переход на более детализированные тайлы, при уменьшении — агрегация.

Поведение слоёв

Все типы слоёв сохраняются:

  • imagery layers (картографические подложки);
  • terrain layers (в 2D визуально упрощаются);
  • vector data sources;
  • primitives.

Однако рельеф в классическом виде не отображается. Высотные данные либо игнорируются, либо визуально схлопываются в плоскость.

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

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

Отображение объектов

Геометрические примитивы

Линии, полигоны и точки проецируются на плоскость без изменения структуры.

  • Polylines остаются геодезическими или экранными;
  • Polygons перестают учитывать высоту;
  • Points фиксируются в XY-плоскости.

Billboard и Label

2D-режим сохраняет экранную ориентацию:

  • билборды всегда направлены к камере;
  • labels не искажаются перспективой;
  • масштабирование зависит от zoom, а не от глубины сцены.

Это делает 2D-режим особенно стабильным для подписей и маркеров.

Работа с камерой

Камера управляется в пределах плоскости:

viewer.camera.setView({
  destination: Cesium.Cartesian3.fromDegrees(30.5, 50.4, 1500000)
});

При этом высота камеры определяет масштаб отображения карты. Чем меньше высота — тем ближе zoom.

Ограничения:

  • отсутствует наклон (tilt);
  • недоступен свободный поворот вокруг оси;
  • ориентация фиксируется в надир.

Панорамирование и масштабирование

Навигация в 2D сводится к двум операциям:

  • перемещение по плоскости (translate X/Y);
  • изменение высоты камеры (zoom).

Колёсико мыши изменяет масштаб нелинейно, приближая или отдаляя карту.

В отличие от 3D, отсутствует параллакс-эффект, что упрощает восприятие больших картографических данных.

Производительность 2D-режима

2D-режим может быть более производительным в ряде сценариев:

  • отсутствует вычисление перспективной геометрии;
  • упрощается обработка глубины (depth buffer используется минимально);
  • снижается нагрузка на GPU при большом количестве объектов.

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

Ограничения 2D-представления

Несмотря на функциональность, существуют фундаментальные ограничения:

  • невозможность отображения глобуса;
  • отсутствие корректного рельефа;
  • искажения на высоких широтах из-за проекции Mercator;
  • невозможность естественного 3D-взаимодействия с объектами.

Некоторые 3D-специфичные эффекты полностью отключаются или упрощаются:

  • тени;
  • атмосферное рассеяние;
  • глубинные тесты сложной геометрии.

Взаимодействие с пикселями и picking

Picking объектов в 2D упрощается, так как сцена фактически становится двумерной проекцией.

const picked = viewer.scene.pick(windowPosition);

Объекты выбираются на основе экранных координат без необходимости пересечения с 3D-геометрией.

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

Внутренне CesiumJS переключает:

  • PerspectiveFrustumOrthographicFrustum;
  • 3D модель камеры → 2D camera transform;
  • globe matrix → identity flattening transform.

Это обеспечивает единый pipeline рендеринга при смене режимов.

Использование 2D-режима в архитектуре приложений

2D-представление часто используется как:

  • режим аналитических карт;
  • слой визуализации больших наборов данных;
  • интерфейс для GIS-операций;
  • упрощённая навигационная карта.

Его основное назначение — снижение когнитивной нагрузки при работе с плотными данными и обеспечение высокой читаемости пространственной информации.