В CesiumJS сущность Entity представляет собой высокоуровневую абстракцию над графическими примитивами и служит основным строительным блоком для описания объектов сцены. Архитектура Entity построена вокруг концепции композиции свойств, временной изменчивости и иерархической организации объектов.
Entity не является изолированным объектом. Он всегда существует внутри EntityCollection или DataSource, а его поведение и визуализация определяются набором динамических свойств. Именно через эти свойства формируется логическая и графическая структура сцены, включая иерархию объектов.
EntityCollection выступает базовым контейнером для хранения сущностей. Любой Viewer содержит набор коллекций, напрямую или через DataSourceDisplay.
Основные характеристики EntityCollection:
Структурно EntityCollection можно рассматривать как плоский список, однако внутри логики CesiumJS он участвует в построении иерархических связей через свойства самих Entity.
Пример добавления сущности:
const entity = viewer.entities.add({
id: "city-center",
position: Cesium.Cartesian3.fromDegrees(30.5, 50.45),
point: {
pixelSize: 10,
color: Cesium.Color.YELLOW
}
});
Entity редко используется в одиночку. Более распространённый сценарий — использование DataSource. Каждый DataSource содержит собственную EntityCollection, а Viewer агрегирует несколько источников.
Иерархическая структура выглядит следующим образом:
Viewer
DataSourceDisplay
DataSource (GeoJSON, CZML, Custom)
EntityCollection
Такая организация позволяет:
Пример добавления источника:
const geoJsonSource = new Cesium.GeoJsonDataSource();
viewer.dataSources.add(geoJsonSource);
Внутри CesiumJS реализована мягкая иерархия Entity через свойства parent и children. Это не строгая сцепка сценографического графа, как в WebGL-движках низкого уровня, но логическая структура, используемая для группировки и наследования поведения.
Каждая сущность может ссылаться на родительскую:
const parent = viewer.entities.add({
id: "building",
position: Cesium.Cartesian3.fromDegrees(30.5, 50.45)
});
const child = viewer.entities.add({
id: "roof",
parent: parent,
position: Cesium.Cartesian3.fromDegrees(30.5, 50.45, 50)
});
Хотя children не всегда явно задаётся пользователем, CesiumJS формирует его автоматически на основе связей parent.
Такой подход позволяет:
Иерархия Entity влияет не только на логическую структуру, но и на поведение свойств.
Если дочерняя сущность не определяет свойство явно, она может наследовать его от родителя в рамках определённых правил.
Типы свойств:
Пример наследуемой логики:
Entity в CesiumJS поддерживает временные свойства через JulianDate и интервалы времени. Иерархия в этом контексте становится многослойной: каждый уровень может иметь собственную временную динамику.
Пример:
Использование SampledPositionProperty:
const position = new Cesium.SampledPositionProperty();
position.addSample(Cesium.JulianDate.fromIso8601("2026-01-01T10:00:00Z"),
Cesium.Cartesian3.fromDegrees(30.5, 50.45));
position.addSample(Cesium.JulianDate.fromIso8601("2026-01-01T11:00:00Z"),
Cesium.Cartesian3.fromDegrees(30.6, 50.46));
Entity может включать несколько визуальных компонентов одновременно:
Каждый из этих компонентов является свойством Entity, а не отдельной сущностью сцены.
Иерархия проявляется в том, что:
Пример:
viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(30.5, 50.45),
billboard: {
image: "marker.png"
},
label: {
text: "Объект",
pixelOffset: new Cesium.Cartesian2(0, -20)
}
});
Некоторые типы геометрий внутри Entity поддерживают вложенность, которая фактически формирует подуровни иерархии.
polygon: {
hierarchy: {
positions: Cesium.Cartesian3.fromDegreesArray([
30.0, 50.0,
31.0, 50.0,
31.0, 51.0,
30.0, 51.0
]),
holes: [{
positions: Cesium.Cartesian3.fromDegreesArray([
30.3, 50.3,
30.7, 50.3,
30.7, 50.7,
30.3, 50.7
])
}]
}
}
Здесь hierarchy внутри polygon формирует подиерархию геометрии:
3D-модели также вписываются в структуру Entity как зависимые визуальные компоненты.
model: {
uri: "building.glb",
scale: 1.0
}
Модель наследует:
Таким образом, Entity выступает контейнером верхнего уровня, а модель — дочерним узлом визуального дерева.
Хотя CesiumJS не предоставляет пользователю явного scene graph API на уровне Entity, внутренняя система рендеринга трансформирует Entity в граф примитивов.
Соответствие:
Иерархия Entity существует на уровне данных, тогда как scene graph — на уровне визуализации.
Entity может изменять свою структуру во время выполнения:
Пример переноса в иерархии:
child.parent = newParent;
Это вызывает перерасчёт отображения и обновление сцены без полного пересоздания объектов.
Каждый DataSource может представлять отдельную область иерархии:
При этом все они объединяются в Viewer, но сохраняют автономность.
Структура:
Viewer
DataSource A (город)
DataSource B (транспорт)
DataSource C (события)
Иерархия Entity позволяет строить сложные составные структуры:
Каждый уровень реализуется через:
Такая модель делает Entity универсальным механизмом описания пространственных данных различной сложности без перехода к низкоуровневым примитивам сцены.