CesiumJS построен вокруг концепции слоёв данных, где карта, рельеф и объекты сцены разделены на независимые источники. Одним из базовых и наиболее часто используемых источников подложки выступает OpenStreetMap, предоставляющий свободные тайловые карты, совместимые с веб-стандартом Web Mercator (EPSG:3857). В CesiumJS данные OpenStreetMap чаще всего используются как растровая подложка (imagery layer), накладываемая на глобус Cesium.
OpenStreetMap предоставляет карту в виде XYZ-тайлов, где каждый
фрагмент изображения определяется координатами
{z}/{x}/{y}:
CesiumJS интерпретирует такие источники через
UrlTemplateImageryProvider, который формирует URL запросов
к тайловому серверу.
Основная модель работы выглядит так:
Наиболее прямой способ интеграции OSM — использование стандартного тайлового сервера:
const viewer = new Cesium.Viewer("cesiumContainer", {
imageryProvider: false,
baseLayerPicker: false
});
const osmLayer = new Cesium.ImageryLayer(
new Cesium.UrlTemplateImageryProvider({
url: "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
credit: "© OpenStreetMap contributors",
maximumLevel: 19
})
);
viewer.imageryLayers.add(osmLayer);
Ключевые параметры:
Cesium автоматически добавляет слой на глобус и управляет его видимостью в зависимости от положения камеры.
OpenStreetMap использует проекцию Web Mercator, которая является стандартом для большинства веб-карт. В CesiumJS это важно, поскольку глобус по умолчанию работает в геодезической модели WGS84 (эллипсоид), а растровые тайлы OSM “натягиваются” на сферу с искажениями на высоких широтах.
Особенности:
Cesium выполняет трансформацию координат автоматически, не требуя ручной конвертации.
OpenStreetMap-слой редко используется в одиночку. CesiumJS позволяет комбинировать несколько imagery layers, формируя сложные картографические композиции.
Пример наложения OSM и полупрозрачного слоя:
const osmLayer = viewer.imageryLayers.addImageryProvider(
new Cesium.UrlTemplateImageryProvider({
url: "https://tile.openstreetmap.org/{z}/{x}/{y}.png"
})
);
osmLayer.alpha = 1.0;
const overlayLayer = viewer.imageryLayers.addImageryProvider(
new Cesium.UrlTemplateImageryProvider({
url: "https://example.com/tiles/{z}/{x}/{y}.png"
})
);
overlayLayer.alpha = 0.5;
Механизмы управления слоями:
imageryLayers определяет стек рендерингаДанные OpenStreetMap распространяются под лицензией ODbL. Это накладывает обязательство корректного отображения авторства.
В CesiumJS это реализуется через объект Credit:
credit: new Cesium.Credit("© OpenStreetMap contributors")
Cesium автоматически отображает кредиты в нижней части экрана. При комбинировании нескольких источников каждый слой может добавлять собственную атрибуцию, которая объединяется в общий блок.
Работа с OpenStreetMap в CesiumJS сильно зависит от сетевой нагрузки и стратегии загрузки тайлов.
Основные механизмы оптимизации:
1. Тайловое кеширование Cesium хранит загруженные изображения в памяти, избегая повторных HTTP-запросов.
2. Приоритизация запросов Тайлы в центре экрана загружаются первыми, периферийные — с задержкой.
3. Ограничение максимального уровня детализации
maximumLevel: 18
Снижение значения уменьшает нагрузку на сервер и ускоряет рендеринг.
4. Frustum culling Тайлы вне области видимости камеры не запрашиваются.
Стандартный сервер OpenStreetMap не предназначен для высоконагруженных коммерческих приложений. В CesiumJS это проявляется в следующих ограничениях:
Поэтому в архитектуре CesiumJS часто используют:
CesiumJS позволяет подключать любой сервер, совместимый с XYZ-структурой OpenStreetMap:
const customOsm = new Cesium.UrlTemplateImageryProvider({
url: "https://mytileserver.com/osm/{z}/{x}/{y}.png",
tilingScheme: new Cesium.WebMercatorTilingScheme(),
maximumLevel: 20
});
viewer.imageryLayers.addImageryProvider(customOsm);
Важный аспект — совпадение схемы тайлинга. Если сервер использует
другую систему координат, требуется явное указание
tilingScheme.
OpenStreetMap предоставляет ограниченный диапазон уровней
масштабирования. CesiumJS интерпретирует это через параметр
level, который влияет на:
При недостатке данных Cesium использует интерполяцию или повтор тайлов меньшего уровня.
Сильная сторона CesiumJS — объединение 2D-картографии и 3D-сцены. OpenStreetMap часто выступает базовым слоем под:
Пример интеграции:
viewer.scene.globe.depthTestAgainstTerrain = true;
viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(71.4304, 51.1282),
point: { pixelSize: 10, color: Cesium.Color.RED }
});
OSM в данном случае обеспечивает визуальный контекст, а 3D-слой добавляет пространственную интерпретацию.
CesiumJS использует геометрически корректную модель Земли, поэтому OpenStreetMap тайлы:
При низком уровне зума OSM выглядит почти идентично плоской карте, но при приближении проявляется трёхмерная природа сцены.
На практике встречаются характерные проблемы:
maximumLevel → перегрузка сервераtilingScheme → смещение тайловCesiumJS решает часть проблем автоматически, но архитектурные ошибки на уровне конфигурации остаются критичными.
При переходе между уровнями zoom CesiumJS:
Это создаёт эффект непрерывного масштабирования без резких скачков изображения.
OSM часто применяется как резервный источник при недоступности коммерческих провайдеров. В таких конфигурациях логика слоёв строится следующим образом:
CesiumJS позволяет реализовать это через управление
imageryLayers и обработку событий загрузки тайлов.