CesiumJS поддерживает подключение внешних картографических провайдеров через систему imagery layers, где Mapbox занимает одно из ключевых мест благодаря поддержке тайлов, стилей и векторных данных.
В основе взаимодействия CesiumJS с Mapbox лежит модель слоёв (Imagery Layers). Каждый слой представляет собой источник тайлов, накладываемый на глобус. Mapbox предоставляет несколько типов ресурсов:
CesiumJS не зависит от конкретного провайдера, поэтому Mapbox подключается через специализированные классы ImageryProvider.
Основная схема:
Viewer → ImageryLayer → ImageryProvider → Mapbox API → Tiles
Самый базовый способ интеграции — использование готового Mapbox raster tiles endpoint.
Ключевая особенность: требуется access token, выдаваемый платформой Mapbox.
import { Viewer, UrlTemplateImageryProvider } from "cesium";
const viewer = new Viewer("cesiumContainer");
const mapboxLayer = new UrlTemplateImageryProvider({
url: "https://api.mapbox.com/styles/v1/mapbox/streets-v11/tiles/{z}/{x}/{y}?access_token=YOUR_MAPBOX_TOKEN",
tileWidth: 512,
tileHeight: 512,
minimumLevel: 0,
maximumLevel: 19
});
viewer.imageryLayers.addImageryProvider(mapboxLayer);
Особенности конфигурации:
{z}/{x}/{y} — стандартная схема Web MercatortileSize 512 используется Mapbox для современных
стилейMapbox предоставляет систему стилевых описаний в формате JSON. Это позволяет централизованно управлять визуальным представлением карты.
Пример подключения через style endpoint:
const styleLayer = new UrlTemplateImageryProvider({
url: "https://api.mapbox.com/styles/v1/mapbox/light-v11/tiles/{z}/{x}/{y}?access_token=YOUR_MAPBOX_TOKEN",
tileWidth: 512,
tileHeight: 512
});
viewer.imageryLayers.addImageryProvider(styleLayer);
Популярные стили:
Более сложный сценарий — использование векторных тайлов. Они позволяют рендерить геометрию на стороне клиента, обеспечивая масштабируемость и гибкость.
CesiumJS поддерживает векторные источники через
VectorTileImageryProvider (или кастомные реализации).
Структура данных:
Основная проблема интеграции — различие в рендеринговых моделях: Mapbox GL использует собственный стиль-рендерер, тогда как CesiumJS работает через WebGL сцены глобуса.
Поэтому векторные тайлы часто конвертируются в растровые слои или используются ограниченно.
Mapbox требует авторизации через access token:
const MAPBOX_TOKEN = "pk.eyJ1Ijo...";
const provider = new UrlTemplateImageryProvider({
url: `https://api.mapbox.com/...&access_token=${MAPBOX_TOKEN}`
});
Особенности:
Mapbox использует стандарт Web Mercator (EPSG:3857). CesiumJS также работает в геодезической модели WGS84, но визуализация тайлов происходит в проекции:
Преобразование выполняется автоматически внутри CesiumJS.
Ключевой момент: несоответствие между 3D-глобусом и плоскими тайлами компенсируется системой reprojection.
Imagery layers в CesiumJS упорядочиваются по индексу:
viewer.imageryLayers.addImageryProvider(layer);
viewer.imageryLayers.raise(layer);
viewer.imageryLayers.lower(layer);
Mapbox слой может комбинироваться с:
Пример многослойной конфигурации:
Mapbox satellite → terrain → labels overlay → vector data
Спутниковые тайлы обладают высокой нагрузкой на сеть, поэтому важны настройки кэширования:
const satellite = new UrlTemplateImageryProvider({
url: "https://api.mapbox.com/v4/mapbox.satellite/{z}/{x}/{y}.jpg?access_token=TOKEN",
tileWidth: 256,
tileHeight: 256
});
Режимы применения:
При интеграции Mapbox в CesiumJS критичны следующие аспекты:
CesiumJS использует встроенный tile cache, но можно дополнительно оптимизировать:
maximumScreenSpaceError: 2
Меньшее значение → выше качество → ниже производительность.
Тайлы подгружаются по мере движения камеры, что снижает нагрузку на сеть.
Главное отличие CesiumJS — полноценный 3D-глобус. Mapbox традиционно работает как 2.5D карта. При интеграции возникают особенности:
Пример камеры:
viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(71.4304, 51.1283, 15000)
});
Mapbox terrain (высотные данные) может конфликтовать с Cesium terrain provider.
Типовые сценарии:
Такое разделение позволяет:
При использовании Mapbox внутри CesiumJS возникают ограничения:
Вместо прямого подключения Mapbox иногда используется:
Такие подходы уменьшают зависимость от внешнего API.
Смена стиля Mapbox может выполняться динамически:
viewer.imageryLayers.removeAll();
const darkLayer = new UrlTemplateImageryProvider({
url: "https://api.mapbox.com/styles/v1/mapbox/dark-v11/tiles/{z}/{x}/{y}?access_token=TOKEN"
});
viewer.imageryLayers.addImageryProvider(darkLayer);
Используется для:
Mapbox слой часто комбинируется с GeoJSON:
import { GeoJsonDataSource } from "cesium";
const data = await GeoJsonDataSource.load("data.geojson");
viewer.dataSources.add(data);
Результат:
Mapbox использует CDN, что влияет на:
CesiumJS компенсирует это:
Типовая архитектура решений:
Такой подход используется в: