Векторный слой в 3D-картографических приложениях на базе CesiumJS
представляет собой набор геометрических объектов, описанных координатами
и атрибутами. Ключевая особенность заключается в том, что такие данные
не зависят от пиксельной сетки и могут быть масштабированы без потери
точности. В контексте веб-визуализации векторный экспорт используется
для сохранения сцен, извлечения пользовательских объектов, обмена
геоданными и интеграции с внешними ГИС-системами.
Основные источники векторных данных в CesiumJS включают:
- Entity API (EntityCollection)
- DataSource (GeoJsonDataSource, KmlDataSource, CzmlDataSource)
- Primitive API (Primitive, GroundPrimitive)
- Пользовательские геометрии (PolygonGeometry, PolylineGeometry,
CorridorGeometry)
Каждый из этих уровней требует собственного подхода к сериализации и
преобразованию координат.
Координатные
преобразования как основа экспорта
Вся геометрия CesiumJS в рантайме хранится в декартовой системе
координат Earth-Centered Earth-Fixed (ECEF). Для векторного экспорта
требуется обратное преобразование в географическую систему координат
WGS84.
Базовая операция выполняется через Cartographic:
- Cartesian3 → Cartographic
- radians → degrees
Ключевая логика преобразования:
- X, Y, Z сцены не являются географическими координатами
- долгота и широта извлекаются через эллипсоид WGS84
- высота сохраняется отдельно или нормализуется
Типовой процесс декодирования геометрии:
- получение массива Cartesian3
- преобразование каждого узла через
Cartographic.fromCartesian
- перевод радиан в градусы
- формирование GeoJSON-совместимой структуры
Экспорт объектов Entity API
Entity API представляет собой высокоуровневую модель сцены. Каждый
объект содержит геометрию, стиль и метаданные. Наиболее распространённый
сценарий экспорта — преобразование EntityCollection в GeoJSON.
Структура Entity:
- point (точки)
- polyline (линии)
- polygon (полигоны)
- billboard (символьные маркеры)
Преобразование Entity →
GeoJSON
Алгоритм экспорта включает обход коллекции сущностей:
- фильтрация по типу геометрии
- извлечение координат
- нормализация свойств
- упаковка в FeatureCollection
Пример логики обработки полигона:
- entity.polygon.hierarchy → Cartesian3[]
- декодирование вершин
- замыкание контура
- формирование массива координат
[lon, lat, height]
Особенность Entity API заключается в том, что геометрия может быть
динамической (CallbackProperty), поэтому перед экспортом требуется
вычисление финального состояния на конкретный момент времени.
Экспорт DataSource
(GeoJSON, KML, CZML)
DataSource API является наиболее удобным уровнем для векторного
экспорта, поскольку многие форматы уже поддерживаются нативно.
GeoJSONDataSource
GeoJSON используется как промежуточный формат для обмена:
- легко сериализуется в JSON
- поддерживает Feature и FeatureCollection
- совместим с GIS системами
Экспорт выполняется через:
- обход entities внутри dataSource
- ручная сериализация при кастомных свойствах
KmlDataSource
KML ориентирован на Google Earth-совместимые структуры:
- Placemark
- LineString
- Polygon
- Extrude и altitude modes
Особенности экспорта:
- требуется учёт высотного режима clampToGround
- стилизация часто теряется при обратной конвертации
- сложные материалы CesiumJS не всегда имеют прямой аналог
CZML
CZML представляет собой потоковую модель временных данных:
- поддержка анимации
- интервальные значения
- динамические позиции
Экспорт CZML требует:
- фиксации временных интервалов
- сериализации Property-объектов
- упрощения сложных вычисляемых свойств
Экспорт примитивов (Primitive
API)
Primitive API используется для высокопроизводительного рендеринга, но
не хранит семантической структуры объектов. Это усложняет векторный
экспорт.
Типичные проблемы:
- отсутствует явная геометрическая модель
- данные хранятся в буферах GPU
- нет метаданных объектов
Подходы к извлечению:
- доступ к geometryInstances
- декодирование VertexBuffer
- восстановление индексов треугольников
Для полилиний и полигонов:
- позиции извлекаются из attribute.position
- индексы используются для реконструкции топологии
Векторный экспорт на уровне Primitive фактически является обратной
деконструкцией GPU-данных.
Работа с Polyline и
Polygon Geometry
Геометрии высокого уровня проще всего экспортировать в стандартные
форматы.
Polyline
Структура:
- список Cartesian3 точек
- отсутствие замкнутой структуры
Процесс экспорта:
- извлечение positions
- последовательное преобразование координат
- сохранение как LineString
Polygon
Структура:
- outerBoundary
- holes (внутренние кольца)
Особенности:
- обязательное замыкание контура
- соблюдение ориентации вершин
- обработка вложенных отверстий
В GeoJSON:
- outer ring → coordinates[0]
- holes → coordinates[1..n]
Экспорт высот и 3D-геометрии
Векторные данные в CesiumJS часто содержат высотную составляющую:
- абсолютная высота (ellipsoid height)
- относительная высота (clamped or relative)
- extrusion (выдавливание)
При экспорте необходимо учитывать:
- сохранение z-координаты или её нормализация
- выбор модели высот (terrain vs ellipsoid)
- потерю точности при округлении
Для 3D-полигонов используется формат:
Для 2.5D сцен:
- height может быть зафиксирован или опущен
Стилизация и её влияние на
экспорт
В CesiumJS стилизация объектов не является частью геометрии. Она
хранится отдельно:
- ColorMaterialProperty
- ImageMaterialProperty
- PolylineGlowMaterialProperty
При векторном экспорте возникает разделение:
- геометрия → экспортируется
- стиль → преобразуется в атрибуты или теряется
Возможные стратегии:
- перенос цвета в properties
- сохранение стиля как расширенных атрибутов
- генерация SLD/StyleMap для KML
Экспорт сценической
коллекции Viewer
Viewer содержит комплексную структуру:
- entities
- dataSources
- primitives
Экспорт полной сцены включает:
- обход всех DataSource
- сериализацию EntityCollection
- отдельную обработку primitives
- объединение в единый контейнер (например, GeoJSON
FeatureCollection)
При этом важно учитывать:
- временные объекты (destroyed entities)
- скрытые элементы (show = false)
- динамические источники данных
Потоковый экспорт и
производительность
При больших объёмах данных векторный экспорт требует оптимизации:
- батчинг координат
- ленивое преобразование Cartographic
- использование TypedArray для промежуточных структур
- асинхронная сериализация JSON
Проблемные зоны:
- глубокие EntityCollection (тысячи объектов)
- сложные polygon hierarchy
- частые CallbackProperty вычисления
Оптимизация включает:
- кэширование Cartographic результатов
- предварительную дискретизацию кривых
- упрощение геометрии (Douglas–Peucker алгоритм)
Преобразование
криволинейных объектов
Кривые (arc, ellipse, circle) в CesiumJS не хранятся как
аналитические функции в экспортируемом виде. Они дискретизируются:
- окружности → набор сегментов
- эллипсы → полилинии
- коридоры → полигональные ленты
Процесс экспорта:
- выбор шага дискретизации
- генерация точек по параметрической функции
- преобразование в линейную геометрию
Обработка временных
данных при экспорте
Динамические сцены используют JulianDate и интервальные свойства.
При экспорте необходимо:
- фиксировать момент времени
- извлекать значение property.getValue(time)
- сериализовать результат как статическую геометрию
Для временных рядов:
- формирование нескольких GeoJSON Feature с time property
- либо переход в CZML структуру
Итоговая структура
экспортируемых данных
На уровне форматов чаще всего используются:
- GeoJSON для универсального обмена
- KML для визуализации в сторонних GIS
- CZML для анимации и временных сцен
Каждый формат требует собственной стратегии:
- GeoJSON — упрощённая 2D/3D геометрия
- KML — визуально-ориентированная модель
- CZML — временная и событийная структура
Векторный экспорт в CesiumJS фактически представляет собой обратную
трансформацию графовой 3D-сцены в линейно описанные геометрические и
атрибутивные структуры, где ключевую роль играет корректное
восстановление координатной модели и семантики объектов.