DataSource API в CesiumJS представляет собой слой абстракции, который отделяет источники пространственных данных от механизма их визуализации на глобусе. Эта система позволяет унифицировать работу с различными форматами геоданных, предоставляя единый интерфейс для загрузки, обновления и управления сущностями сцены.
Основная идея заключается в том, что любые данные — GeoJSON, CZML,
KML или пользовательские структуры — приводятся к модели
Entity, после чего могут быть отрисованы через единый
механизм рендеринга сцены.
Каждый DataSource в CesiumJS реализует интерфейс, который включает:
entitiesload и updatechangedEventisLoadingВся система построена вокруг реактивного обновления: при изменении данных автоматически обновляется сцена без ручного вмешательства в рендеринг.
const dataSource = new Cesium.GeoJsonDataSource();
viewer.dataSources.add(dataSource);
dataSource.load("data.geojson");
В этом примере источник данных загружается асинхронно, а все объекты
автоматически преобразуются в Entity.
Контейнером всех источников данных выступает
DataSourceCollection, доступный через
viewer.dataSources.
const viewer = new Cesium.Viewer("cesiumContainer");
viewer.dataSources.add(new Cesium.CzmlDataSource());
viewer.dataSources.add(new Cesium.KmlDataSource());
Каждый добавленный DataSource:
Удаление DataSource полностью очищает связанные сущности:
viewer.dataSources.remove(dataSource, true);
Вся логика DataSource сводится к созданию объектов
Entity. Это универсальная модель, включающая:
Пример структуры Entity:
const entity = new Cesium.Entity({
id: "unique-id",
position: Cesium.Cartesian3.fromDegrees(30, 50),
point: {
pixelSize: 10,
color: Cesium.Color.RED
}
});
DataSource автоматически управляет созданием таких сущностей на основе входных данных.
GeoJSON является одним из наиболее часто используемых форматов в
CesiumJS. GeoJsonDataSource преобразует геометрии в объекты
Entity.
const geoJsonSource = new Cesium.GeoJsonDataSource();
geoJsonSource.load("cities.geojson", {
clampToGround: true
});
viewer.dataSources.add(geoJsonSource);
Особенности:
propertiesКаждый feature GeoJSON становится отдельным Entity с набором атрибутов.
CZML — формат, ориентированный на динамические сцены и временные
зависимости. CzmlDataSource используется для потоковой
анимации объектов.
const czmlSource = new Cesium.CzmlDataSource();
viewer.dataSources.add(czmlSource);
czmlSource.load("flight.czml");
Ключевая особенность — поддержка времени:
Clock сценыCZML тесно связан с системой JulianDate в CesiumJS.
KmlDataSource обеспечивает поддержку формата KML,
используемого в геоинформационных системах.
const kmlSource = new Cesium.KmlDataSource();
viewer.dataSources.add(kmlSource);
kmlSource.load("regions.kml", {
camera: viewer.scene.camera,
canvas: viewer.scene.canvas
});
Особенности:
Все DataSource работают асинхронно. Метод load
возвращает Promise:
geoJsonSource.load("data.geojson")
.then(function(dataSource) {
console.log("Загружено:", dataSource.entities.values.length);
})
.catch(function(error) {
console.error(error);
});
Это позволяет:
Каждый DataSource проходит через несколько стадий:
DataSourceCollectionМетод update вызывается на каждом кадре:
dataSource.update(time);
Он используется для:
Пользовательский DataSource позволяет полностью контролировать генерацию сущностей.
function CustomDataSource() {
this.entities = new Cesium.EntityCollection();
this.changedEvent = new Cesium.Event();
this.isLoading = false;
}
CustomDataSource.prototype.load = function() {
this.isLoading = true;
const entity = new Cesium.Entity({
position: Cesium.Cartesian3.fromDegrees(40, 55),
point: {
pixelSize: 12,
color: Cesium.Color.BLUE
}
});
this.entities.add(entity);
this.isLoading = false;
this.changedEvent.raiseEvent(this);
};
Такой подход используется для:
DataSource активно использует реактивную модель Entity:
Property система CesiumПример динамического изменения:
entity.point.color = Cesium.Color.YELLOW;
Или через property:
entity.position = new Cesium.SampledPositionProperty();
Для больших наборов данных применяется кластеризация:
geoJsonSource.clustering.enabled = true;
geoJsonSource.clustering.pixelRange = 50;
geoJsonSource.clustering.minimumClusterSize = 3;
Кластеризация:
Каждый DataSource поддерживает глобальную стилизацию через
EntityStyle:
geoJsonSource.entities.values.forEach(function(entity) {
entity.point.color = Cesium.Color.ORANGE;
entity.point.outlineColor = Cesium.Color.BLACK;
});
Дополнительно можно использовать ColorMaterialProperty,
LabelStyle, HeightReference.
DataSource тесно интегрирован с системой времени Cesium:
viewer.clockJulianDateTimeIntervalCollectionЭто позволяет строить:
При работе с DataSource важно учитывать:
Оптимизационные стратегии:
Каждый DataSource предоставляет события:
dataSource.changedEvent.addEventListener(function() {
console.log("DataSource изменился");
});
Также доступны:
errorEventloadingEventЭто позволяет интегрировать DataSource в сложные системы обработки данных.
В экосистеме Cesium DataSource часто используется совместно с облачной платформой Cesium ion, которая предоставляет:
DataSource может загружать данные напрямую из ion assets, включая tilesets и геометрии.
DataSource API применяется в системах:
Общая модель Entity позволяет объединять разнородные источники в единую сцену без дополнительной адаптации рендеринга.