Первое приложение на базе CesiumJS обычно решает несколько базовых задач:
Архитектурно любое приложение начинается с создания объекта
Viewer, который объединяет основные подсистемы движка и
предоставляет готовую среду визуализации.
CesiumJS может использоваться несколькими способами:
Для знакомства с библиотекой наиболее простым вариантом является использование npm и современного сборщика.
Установка пакета:
npm install cesium
После установки структура проекта может выглядеть следующим образом:
project/
│
├── src/
│ ├── main.js
│ └── style.css
│
├── public/
│
├── package.json
└── vite.config.js
В основном файле приложения выполняется импорт библиотеки:
import * as Cesium from "cesium";
import "cesium/Build/Cesium/Widgets/widgets.css";
Первый импорт предоставляет доступ ко всем классам движка.
Второй импорт подключает стили пользовательского интерфейса:
Без подключения CSS многие элементы будут отображаться некорректно.
Cesium отрисовывает сцену внутри указанного HTML-элемента.
Пример разметки:
<div id="cesiumContainer"></div>
Контейнер должен иметь размеры.
Пример CSS:
html,
body,
#cesiumContainer {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
Без задания высоты контейнер окажется невидимым, поскольку браузер не сможет вычислить его размеры.
Основой любого приложения является класс Viewer.
Минимальный пример:
const viewer = new Cesium.Viewer("cesiumContainer");
После выполнения этой строки происходит:
Результатом становится интерактивная трёхмерная модель Земли.
Класс Viewer представляет собой высокоуровневую оболочку
над большим количеством подсистем.
В его состав входят:
| Компонент | Назначение |
|---|---|
| Scene | Трёхмерная сцена |
| Camera | Управление камерой |
| Globe | Отображение планеты |
| Clock | Работа со временем |
| EntityCollection | Коллекция объектов |
| DataSourceCollection | Источники данных |
| ImageryLayers | Картографические слои |
Через объект viewer осуществляется доступ практически ко
всем возможностям движка.
Например:
viewer.scene
viewer.camera
viewer.clock
viewer.entities
viewer.imageryLayers
По умолчанию Cesium создаёт большое количество виджетов.
Можно управлять их отображением.
Пример:
const viewer = new Cesium.Viewer("cesiumContainer", {
animation: false,
timeline: false,
fullscreenButton: false,
vrButton: false,
geocoder: false
});
Параметры отвечают за следующие элементы:
| Параметр | Назначение |
|---|---|
| animation | Панель анимации |
| timeline | Временная шкала |
| geocoder | Поиск объектов |
| homeButton | Кнопка возврата |
| sceneModePicker | Выбор режима сцены |
| navigationHelpButton | Справка |
| fullscreenButton | Полноэкранный режим |
| vrButton | Режим виртуальной реальности |
Такой подход позволяет создавать минималистичные интерфейсы.
Cesium поддерживает несколько способов визуализации планеты.
Полноценная трёхмерная Земля:
sceneMode: Cesium.SceneMode.SCENE3D
Плоская карта:
sceneMode: Cesium.SceneMode.SCENE2D
Промежуточный режим:
sceneMode: Cesium.SceneMode.COLUMBUS_VIEW
Пример:
const viewer = new Cesium.Viewer("cesiumContainer", {
sceneMode: Cesium.SceneMode.SCENE3D
});
После запуска приложения камера автоматически располагается над Землёй.
Для перемещения используется метод:
viewer.camera.flyTo();
Пример перелёта:
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(
37.6176,
55.7558,
10000
)
});
Параметры:
В данном случае камера перемещается к Москве на высоту 10 километров.
Большая часть API работает с географическими координатами.
Формат:
долгота,
широта,
высота
Создание позиции:
const position =
Cesium.Cartesian3.fromDegrees(
37.6176,
55.7558,
0
);
Важно помнить, что порядок отличается от привычного формата:
широта, долгота
Используемого во многих геоинформационных системах.
Коллекция сущностей находится в:
viewer.entities
Создание точки:
viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(
37.6176,
55.7558
),
point: {
pixelSize: 12,
color: Cesium.Color.RED
}
});
После добавления объект автоматически отображается на карте.
Точка часто сопровождается текстом.
Пример:
viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(
37.6176,
55.7558
),
point: {
pixelSize: 10,
color: Cesium.Color.RED
},
label: {
text: "Москва",
font: "18px sans-serif"
}
});
Теперь рядом с точкой отображается надпись.
После добавления сущности удобно автоматически перемещать камеру.
Для этого используется:
viewer.zoomTo(
viewer.entities
);
Либо:
viewer.flyTo(
viewer.entities
);
Разница заключается в том, что flyTo() выполняет плавную
анимацию, а zoomTo() осуществляет быстрое
позиционирование.
Объект глобуса доступен через:
viewer.scene.globe
Пример отключения атмосферы:
viewer.scene.skyAtmosphere.show = false;
Пример скрытия глобуса:
viewer.scene.globe.show = false;
Пример отключения освещения:
viewer.scene.globe.enableLighting = false;
Подобные настройки часто используются для специализированных картографических приложений.
Основой отображения являются картографические изображения.
Cesium использует систему Imagery Layers.
Получение коллекции слоёв:
const layers =
viewer.imageryLayers;
Добавление нового слоя:
layers.addImageryProvider(
new Cesium.OpenStreetMapImageryProvider()
);
После загрузки слой автоматически накладывается на поверхность Земли.
Часто требуется открывать приложение сразу на определённом регионе.
Пример:
viewer.camera.setView({
destination:
Cesium.Cartesian3.fromDegrees(
37.6176,
55.7558,
500000
)
});
В отличие от flyTo(), метод setView()
выполняется мгновенно.
Продолжительность перелёта задаётся через параметр
duration.
viewer.camera.flyTo({
destination:
Cesium.Cartesian3.fromDegrees(
37.6176,
55.7558,
50000
),
duration: 5
});
В данном случае анимация займёт пять секунд.
Cesium содержит встроенный набор цветов.
Примеры:
Cesium.Color.RED
Cesium.Color.BLUE
Cesium.Color.GREEN
Cesium.Color.YELLOW
Cesium.Color.ORANGE
Создание собственного цвета:
const color =
Cesium.Color.fromCssColorString(
"#4CAF50"
);
Использование прозрачности:
Cesium.Color.RED.withAlpha(0.5)
Значение находится в диапазоне:
0.0 – полностью прозрачно
1.0 – полностью непрозрачно
Сцена является центральным объектом рендеринга.
Получение ссылки:
const scene =
viewer.scene;
Через неё доступны:
Пример:
scene.fog.enabled = false;
import * as Cesium from "cesium";
import "cesium/Build/Cesium/Widgets/widgets.css";
const viewer = new Cesium.Viewer(
"cesiumContainer",
{
animation: false,
timeline: false
}
);
viewer.entities.add({
position:
Cesium.Cartesian3.fromDegrees(
37.6176,
55.7558
),
point: {
pixelSize: 12,
color: Cesium.Color.RED
},
label: {
text: "Москва",
font: "18px sans-serif"
}
});
viewer.camera.flyTo({
destination:
Cesium.Cartesian3.fromDegrees(
37.6176,
55.7558,
50000
),
duration: 3
});
После запуска приложение выполняет следующие действия:
Ошибка:
#cesiumContainer {
width: 100%;
}
Результат:
Пустая страница
Решение:
#cesiumContainer {
width: 100%;
height: 100%;
}
Ошибка:
Cesium.Cartesian3.fromDegrees(
55.7558,
37.6176
);
Результат:
Объект оказывается в другой точке мира
Правильно:
Cesium.Cartesian3.fromDegrees(
37.6176,
55.7558
);
Ошибка:
import * as Cesium from "cesium";
Результат:
Интерфейс отображается некорректно
Правильно:
import * as Cesium from "cesium";
import "cesium/Build/Cesium/Widgets/widgets.css";
Ошибка:
new Cesium.Viewer("map");
При наличии:
<div id="cesiumContainer"></div>
Результат:
Контейнер не найден
Правильно:
new Cesium.Viewer("cesiumContainer");
После создания минимального проекта обычно добавляются:
Именно объект Viewer, созданный на первых этапах
разработки, становится центральной точкой взаимодействия со всеми
возможностями CesiumJS и основой любого полноценного геоинформационного
веб-приложения.