CesiumJS построен вокруг концепции источников данных (DataSource), которые отделяют получение и обновление пространственных данных от их отображения в сцене. Такая архитектура позволяет унифицировать работу с различными форматами — от GeoJSON и CZML до полностью пользовательских потоков данных, поступающих из API, WebSocket или собственных вычислительных моделей.
Внутри CesiumJS слой данных отделён от слоя рендеринга. Viewer не
работает напрямую с геометрией, он взаимодействует с абстракцией
DataSource через коллекцию viewer.dataSources.
Каждый источник данных отвечает за три ключевых аспекта:
Такой подход позволяет комбинировать разные источники в одной сцене без конфликтов форматов и логики обновления.
Базовая идея: DataSource — это адаптер между внешними данными и внутренней моделью сущностей Cesium.
Любой источник данных в CesiumJS реализует интерфейс, включающий следующие обязательные элементы:
entities — коллекция сущностейclock (опционально) — управление временемshow — видимость источникаchangedEvent — сигнал обновления данныхerrorEvent — обработка ошибок загрузкиisLoading — состояние загрузкиupdate() — метод синхронизации состоянияВажнейшая часть — entities. Это контейнер, содержащий
объекты Entity, которые описывают геометрию, стили, анимации и привязку
ко времени.
Entity — это высокоуровневая абстракция над примитивами (Primitive API), позволяющая описывать объекты декларативно.
Пользовательский источник данных обычно реализуется через класс
CustomDataSource, либо через прямую реализацию интерфейса
DataSource.
Простейшая структура кастомного источника:
Основная логика строится вокруг преобразования входного формата в Entity-представление.
Типовой сценарий: получение данных с REST API и отображение объектов на карте.
Ключевая идея заключается в том, что данные могут поступать в любом виде, но внутри CesiumJS они должны быть приведены к Entity.
Псевдоструктура:
entities.add()Entity может включать:
Все источники данных подключаются через:
viewer.dataSources.add(dataSource)viewer.dataSources.remove(dataSource)После добавления источник автоматически становится частью сцены, а Viewer начинает учитывать его в:
Важно, что Viewer не делает различий между встроенными и пользовательскими источниками.
Большинство пользовательских источников работает асинхронно. CesiumJS поддерживает Promise-based загрузку через методы:
load()update()Асинхронность используется для:
Типовая модель:
changedEventCesiumJS тесно связан с концепцией времени. DataSource может быть временно-зависимым.
Clock в CesiumJS управляет:
Entity может содержать:
Availability (доступность во времени)SampledPositionProperty (траектории)TimeIntervalCollectionPropertyЭто позволяет строить динамические системы:
Каждый DataSource поддерживает событийную модель:
changedEvent — изменения данныхerrorEvent — ошибки загрузкиloadingEvent — состояние загрузкиСобытия используются для синхронизации UI и внешней логики без постоянного опроса состояния.
Типичный сценарий — обновление интерфейса при завершении загрузки данных.
Пользовательские источники часто выступают в роли адаптеров для стандартных форматов:
GeoJSONDataSource внутри CesiumJS уже реализует подобную логику, но пользовательские источники позволяют расширять её под специфические структуры.
Особое внимание уделяется координатным преобразованиям:
После создания Entity внешний вид управляется через свойства:
pointbillboardpolylinepolygonКаждое из них поддерживает:
В пользовательских источниках часто применяется вычисляемая стилизация:
При работе с большим количеством данных пользовательские источники должны учитывать производительность.
Основные механизмы:
Кластеризация особенно важна при отображении тысяч точек:
CesiumJS поддерживает кластеризацию на уровне EntityCollection через
entityCluster.
Одним из наиболее мощных сценариев пользовательских источников является работа с потоками данных.
Типичная архитектура:
В таких системах критично:
Пользовательский DataSource проходит несколько фаз:
При удалении источника важно:
Это предотвращает утечки памяти при длительной работе приложений визуализации.
На практике применяются несколько устойчивых архитектурных подходов:
Особенно эффективна комбинация Adapter + Observer при работе с телеметрией.
Источники данных могут комбинироваться:
Это позволяет строить сложные сцены:
Каждый источник остаётся независимым, но визуально интегрированным в единую сцену.
При работе с внешними источниками данных неизбежны:
CesiumJS предоставляет errorEvent, но логика
устойчивости обычно реализуется на уровне пользовательского
источника:
Пользовательские источники часто включают механизмы фильтрации:
Фильтрация может выполняться:
showЭто позволяет управлять сложными сценами без пересоздания данных.