В CesiumJS геометрическая модель мира построена вокруг глобуса, а не плоской карты. Это принципиально отличает её от классических 2D-картографических библиотек. Основная проекция здесь — географическая (WGS84 эллипсоид), на которую накладываются различные режимы отображения сцены.
Внутренняя архитектура разделяет два уровня:
Таким образом, «переключение проекций» в CesiumJS на практике означает смену режима сцены и/или математической проекции тайлового слоя.
CesiumJS поддерживает три основных режима отображения:
Режим трёхмерного глобуса представляет Землю как эллипсоид с возможностью вращения и наклона камеры.
Ключевые характеристики:
В коде:
viewer.scene.mode = Cesium.SceneMode.SCENE3D;
Этот режим является базовым и используется по умолчанию.
2D-режим представляет поверхность Земли в виде плоской проекции. Геометрия глобуса «разворачивается» в плоскость.
Особенности:
В Cesium используется Web Mercator как базовая схема отображения тайлов.
viewer.scene.mode = Cesium.SceneMode.SCENE2D;
В этом режиме камера теряет свободу наклона и вращения вокруг горизонта.
Гибридный режим между 2D и 3D. Геометрия отображается в псевдотрёхмерной проекции:
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).
Стандартная проекция для большинства картографических источников:
В Cesium она используется по умолчанию для imagery layers.
Альтернативная схема, основанная на широте и долготе:
Cesium позволяет задавать проекцию через провайдер изображений.
const layer = new Cesium.WebMapTileServiceImageryProvider({
url: "https://example.com/wmts",
layer: "layer_name",
style: "default",
format: "image/png",
tileMatrixSetID: "GoogleMapsCompatible"
});
viewer.imageryLayers.addImageryProvider(layer);
Здесь проекция определяется сервером тайлов.
Используется для диагностики тайловой структуры:
const debugLayer = new Cesium.TileCoordinatesImageryProvider();
viewer.imageryLayers.addImageryProvider(debugLayer);
Позволяет визуально анализировать проекцию тайлов.
В CesiumJS проекция тесно связана с моделью камеры:
Ключевые параметры:
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);
}
}
При переходе между режимами происходит трансформация координат:
Важный аспект — сохранение текущего центра карты:
viewer.scene.camera.flyHome(0);
или
viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(37.6173, 55.7558, 1000000)
});
Terrain остаётся активным в 3D и Columbus View, но:
viewer.terrainProvider = Cesium.createWorldTerrain();
С точки зрения архитектуры CesiumJS:
Эти уровни работают независимо, но синхронизированы через рендер-цикл сцены.