CesiumJS включает набор встроенных интерфейсных компонентов,
предназначенных для управления сценой, режимами отображения и навигацией
по виртуальному глобусу. Эти элементы интегрируются в объект
Viewer и формируют слой управления поверх WebGL-сцены.
Навигационные виджеты в CesiumJS разделяются на несколько функциональных категорий:
Каждый компонент реализуется как отдельный модуль, но в стандартной
конфигурации они создаются автоматически через Viewer.
Основная точка входа интерфейса CesiumJS — объект
Viewer. Он инкапсулирует сцену, камеру, источники данных и
набор UI-виджетов.
При создании Viewer можно управлять набором включённых
навигационных элементов:
const viewer = new Cesium.Viewer("cesiumContainer", {
homeButton: true,
sceneModePicker: true,
baseLayerPicker: true,
navigationHelpButton: true,
fullscreenButton: true,
geocoder: true,
animation: true,
timeline: true
});
Каждый параметр отвечает за создание соответствующего виджета. При отключении параметра компонент не инициализируется, что снижает нагрузку на DOM и уменьшает количество обработчиков событий.
Компонент HomeButton обеспечивает возврат камеры к
исходному состоянию сцены.
Внутренне он сохраняет состояние камеры при инициализации
Viewer и восстанавливает его при активации.
Основные особенности:
Camera.flyHome()Поведение можно переопределить через событие:
viewer.homeButton.viewModel.command.beforeExecute.addEventListener(function (commandInfo) {
commandInfo.cancel = true;
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(0, 0, 20000000)
});
});
Это позволяет полностью заменить стандартную логику возврата.
SceneModePicker управляет режимами визуализации
сцены:
Каждый режим соответствует внутреннему состоянию
SceneMode:
Cesium.SceneMode.SCENE3DCesium.SceneMode.SCENE2DCesium.SceneMode.COLUMBUS_VIEWПереключение сопровождается трансформацией матриц проекции и пересчётом камеры.
viewer.scene.morphTo2D();
viewer.scene.morphTo3D();
viewer.scene.morphToColumbusView();
Виджет синхронизируется с состоянием сцены через
SceneModePickerViewModel.
BaseLayerPicker предоставляет интерфейс выбора базового
слоя карты и глобуса.
Он работает с источниками изображений (imagery providers) и terrain providers.
Пример источников:
Cesium.IonImageryProviderOpenStreetMapImageryProviderArcGisMapServerImageryProviderСтруктура конфигурации:
const viewer = new Cesium.Viewer("cesiumContainer", {
baseLayerPicker: true,
imageryProviderViewModels: [
new Cesium.ProviderViewModel({
name: "OSM",
iconUrl: "osm.png",
creationFunction: () => new Cesium.OpenStreetMapImageryProvider()
})
],
terrainProviderViewModels: []
});
Каждый ProviderViewModel описывает источник данных и его
отображение в UI.
NavigationHelpButton отображает панель с подсказками по
управлению камерой и сценой.
Он включает информацию о:
Внутри реализован как всплывающий overlay с HTML-шаблоном,
синхронизированным с событиями ScreenSpaceEventHandler.
FullscreenButton обеспечивает переключение контейнера
CesiumJS в полноэкранный режим браузера.
Используется стандартный Fullscreen API:
requestFullscreenexitFullscreenОсобенности реализации:
document.fullscreenElementviewer.fullscreenButton.viewModel.command.afterExecute.addEventListener(() => {
console.log("Fullscreen toggled");
});
Хотя Geocoder относится к поисковым компонентам, он
тесно связан с навигацией камеры.
Функциональность:
Пример использования API:
viewer.geocoder.viewModel.searchText = "London";
viewer.geocoder.viewModel.search();
Результат поиска вызывает Camera.flyTo с рассчитанными
координатами.
CesiumJS включает временные навигационные компоненты:
Animation — управление воспроизведением времениTimeline — визуализация временной шкалыОни взаимодействуют с JulianDate и
Clock.
Основные функции:
viewer.clock.multiplier = 60;
viewer.clock.shouldAnimate = true;
Timeline отображает диапазон времени, связанный с
Clock.startTime и Clock.stopTime.
UI CesiumJS строится на DOM-структуре, где каждый виджет закреплён в определённой зоне:
Стилизация осуществляется через классы:
.cesium-viewer-toolbar.cesium-viewer-navigationContainer.cesium-widgetИзменение расположения возможно через CSS:
.cesium-viewer-fullscreenContainer {
position: absolute;
right: 10px;
top: 10px;
}
Все навигационные компоненты доступны через свойства
viewer:
viewer.homeButton
viewer.sceneModePicker
viewer.baseLayerPicker
viewer.navigationHelpButton
viewer.fullscreenButton
viewer.geocoder
viewer.animation
viewer.timeline
Каждый объект содержит viewModel, отвечающий за
состояние и команды.
Пример отключения виджета после инициализации:
viewer.homeButton.container.style.display = "none";
Расширение стандартного интерфейса осуществляется через создание
пользовательских DOM-компонентов, синхронизированных с камерой
Cesium.Camera.
Типовой сценарий:
flyTo, lookAt,
setViewconst button = document.createElement("button");
button.textContent = "Перейти к точке";
button.oncl ick = () => {
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(37.6173, 55.7558, 1000000)
});
};
Кастомные элементы часто размещаются в
cesium-viewer-toolbar.
Навигационные компоненты тесно связаны с системой камеры:
Camera управляет положением, ориентацией и
масштабомScene обеспечивает рендеринг и режимы отображенияClock синхронизирует временную осьЛюбое действие UI преобразуется в операции над камерой:
flyTo — анимационный переходsetView — мгновенное позиционированиеlookAt — привязка к объектуСобытия камеры позволяют отслеживать изменения:
viewer.camera.changed.addEventListener(() => {
console.log("Camera updated");
});
CesiumJS использует модель ViewModel для синхронизации
интерфейса и состояния движка.
Каждый навигационный виджет содержит:
Это обеспечивает реактивное обновление интерфейса без ручного DOM-обновления.
Стандартные контролы могут быть модифицированы через перехват команд:
viewer.sceneModePicker.viewModel.command.beforeExecute.addEventListener((e) => {
e.cancel = true;
});
Такая архитектура позволяет: