Загрузка и парсинг данных

Загрузка и обработка пространственных данных в CesiumJS опирается на несколько взаимосвязанных уровней: источники данных, механизмы их асинхронной загрузки, парсинг форматов и последующее преобразование в граф сцены. Архитектура построена таким образом, чтобы поддерживать потоковую передачу больших объёмов геоданных без блокировки основного потока выполнения.

DataSource как центральный слой абстракции

Ключевым механизмом работы с данными выступает система DataSource. Она предоставляет унифицированный интерфейс для различных форматов и источников:

  • CZML через CzmlDataSource
  • GeoJSON через GeoJsonDataSource
  • KML через KmlDataSource
  • пользовательские реализации через базовый CustomDataSource

Каждый DataSource отвечает за:

  • загрузку внешнего ресурса
  • парсинг структуры данных
  • преобразование в сущности (Entity)
  • синхронизацию с Viewer.entities

Важным свойством является асинхронность: все операции загрузки возвращают Promise, что позволяет не блокировать рендеринг сцены.

Асинхронная модель загрузки

CesiumJS использует многоуровневую систему асинхронной обработки:

  • Cesium.Resource инкапсулирует HTTP-запросы
  • loadJson, loadText, loadBlob выполняют базовые операции загрузки
  • DataSource.load управляет цепочкой парсинга

Типичный процесс выглядит следующим образом:

  1. Формирование запроса через Resource
  2. Получение данных (JSON, XML, бинарный поток)
  3. Предварительная нормализация структуры
  4. Преобразование в объекты Cesium
  5. Регистрация в сцене

Асинхронность обеспечивает возможность потоковой загрузки даже при работе с тяжёлыми слоями данных.

Парсинг GeoJSON

GeoJSON является одним из наиболее часто используемых форматов благодаря простоте структуры и широкой поддержке.

GeoJsonDataSource

GeoJsonDataSource выполняет разбор следующих типов объектов:

  • Point
  • LineString
  • Polygon
  • MultiPoint
  • MultiLineString
  • MultiPolygon
  • GeometryCollection

Каждый объект преобразуется в Entity, содержащую:

  • геометрию (PositionProperty, PolygonHierarchy)
  • стилизацию (ColorMaterialProperty, PolylineDashMaterialProperty)
  • метаданные (properties из исходного JSON)

Процесс преобразования

Парсинг GeoJSON включает несколько этапов:

  1. Разбор JSON-структуры
  2. Определение типа геометрии
  3. Конвертация координат в Cartesian3
  4. Применение проекции WGS84
  5. Создание сущностей сцены

Особое значение имеет преобразование координат. Cesium использует систему:

  • географические координаты (долгота, широта, высота)
  • декартовы координаты Cartesian3

Каждая точка проходит трансформацию через Cesium.Cartesian3.fromDegrees.

Оптимизация загрузки GeoJSON

При больших наборах данных применяется:

  • упрощение геометрии
  • кластеризация точек
  • динамическая генерация билбордов вместо геометрии
  • частичная загрузка через тайлы

CZML как потоковый формат

CZML представляет собой специализированный формат для временных и динамических сцен.

CzmlDataSource

CzmlDataSource поддерживает:

  • временные интервалы
  • анимацию свойств
  • постепенное обновление объектов
  • потоковую синхронизацию состояния

CZML описывает не только геометрию, но и её изменение во времени.

Модель временных данных

Каждый объект CZML содержит:

  • interval
  • position
  • orientation
  • динамические свойства (color, scale, path)

Cesium интерпретирует эти данные через систему Property.

Принцип интерполяции

Динамические значения вычисляются через:

  • линейную интерполяцию
  • сплайны
  • дискретные ключевые кадры

Это позволяет воспроизводить движение объектов без постоянного пересоздания сущностей.

KML и его особенности

KmlDataSource

KML является более сложным форматом, поскольку включает:

  • стилизацию через Style и StyleMap
  • сетевые ссылки (NetworkLink)
  • вложенные структуры папок (Folder, Document)

При парсинге Cesium выполняет:

  1. Разбор XML
  2. Построение DOM-подобной структуры
  3. Интерпретацию стилей
  4. Преобразование в Entity-граф

Ограничения и особенности

KML требует дополнительных шагов нормализации:

  • конвертация стилей в Cesium Material
  • обработка внешних ссылок
  • загрузка вложенных ресурсов

NetworkLink может инициировать каскадную загрузку, что усложняет контроль за производительностью.

Работа с 3D Tiles

Cesium3DTileset

3D Tiles — основной формат потоковой загрузки трёхмерных сцен.

Cesium3DTileset обеспечивает:

  • иерархическую загрузку тайлов
  • адаптивное качество (LOD)
  • стриминг по видимости камеры

Структура 3D Tiles

Каждый tileset включает:

  • root tile
  • bounding volumes
  • content references
  • refinement strategy

Cesium использует два типа уточнения:

  • REPLACE
  • ADD

Потоковая загрузка

Алгоритм загрузки:

  1. Определение видимых тайлов
  2. Оценка ошибки аппроксимации
  3. Выбор уровня детализации
  4. Асинхронная загрузка контента
  5. Кэширование в памяти

Парсинг бинарных форматов

3D Tiles поддерживает:

  • B3DM (batched 3D models)
  • I3DM (instanced models)
  • PNTS (point clouds)
  • CMPT (composite tiles)

Каждый формат требует специализированного декодера.

Внутренние механизмы Entity

Entity как результат парсинга

Все DataSource в конечном итоге создают объекты Entity. Они служат универсальным контейнером для:

  • геометрии
  • свойств
  • временных зависимостей
  • визуальных атрибутов

Entity поддерживает ленивые вычисления через Property систему.

Property система

Свойства могут быть:

  • статическими
  • динамическими
  • зависящими от времени

Примеры:

  • ConstantProperty
  • SampledProperty
  • TimeIntervalCollectionProperty

Это позволяет описывать изменения без постоянного пересоздания сцены.

Кастомные источники данных

CustomDataSource

Создание собственного источника требует реализации:

  • load()
  • changedEvent
  • entities

Типичный сценарий:

  • получение данных из API
  • преобразование в Entity
  • управление обновлениями вручную

Интеграция внешних API

При работе с внешними сервисами выполняются:

  • нормализация форматов
  • маппинг полей
  • конвертация координат
  • кэширование результатов

Потоковая обработка и производительность

CesiumJS оптимизирует загрузку через:

  • request scheduler (ограничение параллельных запросов)
  • кэш ресурсов
  • приоритет загрузки по видимости
  • декомпозицию сцен на тайлы

Приоритеты загрузки

Система учитывает:

  • расстояние до камеры
  • размер объекта
  • влияние на визуальное качество

Кэширование данных

Кэширование происходит на нескольких уровнях:

  • HTTP-кэш ресурсов
  • memory cache для tilesets
  • internal cache для parsed entities

Это уменьшает повторные загрузки и ускоряет взаимодействие со сценой.

Обработка ошибок при загрузке

Механизмы обработки включают:

  • retry стратегию для сетевых запросов
  • fallback для повреждённых данных
  • graceful degradation визуализации

Ошибки парсинга изолируются, чтобы не разрушать всю сцену.

Синхронизация данных и сцены

После загрузки данные проходят этап синхронизации:

  • добавление в Viewer.scene
  • обновление DataSourceCollection
  • триггер событий изменения

Cesium использует реактивную модель обновления, где изменения свойств автоматически отражаются в рендере без ручного обновления сцены.