GeoJSON представляет собой стандарт обмена геопространственными данными на основе JSON. В контексте CesiumJS он используется как один из ключевых форматов для отображения векторных данных на 3D-глобусе. Поддерживаются точки, линии, полигоны, мультигеометрии, а также наборы свойств, которые могут быть использованы для стилизации и интерактивности.
CesiumJS обрабатывает GeoJSON через GeoJsonDataSource,
который преобразует входные данные в набор сущностей
(Entity), интегрируемых в сцену через
Viewer.
Основная концепция заключается в следующем:
propertiesЦентральный механизм работы с GeoJSON —
GeoJsonDataSource. Он поддерживает загрузку как локальных
файлов, так и удалённых ресурсов.
const viewer = new Cesium.Viewer("cesiumContainer");
const dataSource = new Cesium.GeoJsonDataSource();
viewer.dataSources.add(
Cesium.GeoJsonDataSource.load("data/objects.geojson")
);
При загрузке создаётся набор сущностей, автоматически добавляемых в сцену. Альтернативный подход позволяет сохранить ссылку на источник:
const dataSource = await Cesium.GeoJsonDataSource.load("data/objects.geojson");
viewer.dataSources.add(dataSource);
Такой вариант обеспечивает доступ к структуре данных для дальнейшей модификации.
Каждый элемент GeoJSON трансформируется в Entity:
Point → PointGraphicsLineString → PolylineGraphicsPolygon → PolygonGraphicsMultiPolygon → набор полигоновFeatureCollection → коллекция EntityКаждый Entity получает:
idpropertiesПример доступа к сущностям:
const entity = dataSource.entities.getById("feature-1");
console.log(entity.properties.name);
CesiumJS использует геодезическую систему координат WGS84. GeoJSON по умолчанию также использует долготу и широту, что делает интеграцию прямолинейной.
Координаты интерпретируются следующим образом:
[longitude, latitude][longitude, latitude, height]Высота может быть:
Для закрепления геометрии на поверхности применяется:
dataSource.clampToGround = true;
Это особенно важно для линий и полигонов, которые должны повторять рельеф.
GeoJSON свойства могут использоваться для динамической стилизации объектов.
Пример условного окрашивания:
dataSource.entities.values.forEach(entity => {
if (entity.properties.type === "park") {
entity.polygon.material = Cesium.Color.GREEN.withAlpha(0.5);
} else if (entity.properties.type === "water") {
entity.polygon.material = Cesium.Color.BLUE.withAlpha(0.5);
}
});
Также возможно использование ColorProperty:
entity.point.color = new Cesium.Color(1.0, 0.0, 0.0, 1.0);
CesiumJS позволяет изменять визуальные параметры в реальном времени
через CallbackProperty.
entity.polygon.material = new Cesium.ColorMaterialProperty(
new Cesium.CallbackProperty(() => {
return Cesium.Color.fromRandom();
}, false)
);
Такая конструкция применяется для:
GeoJSON-полигоны могут быть преобразованы в объёмные объекты:
entity.polygon.extrudedHeight = 500;
entity.polygon.material = Cesium.Color.ORANGE.withAlpha(0.7);
Экструзия используется для:
Дополнительно:
entity.polygon.outline = true;
entity.polygon.outlineColor = Cesium.Color.BLACK;
При больших объёмах данных важно учитывать особенности рендеринга:
clampToGround только при
необходимостиasynchronous processingCesiumJS автоматически оптимизирует часть операций, но сложные полигоны могут существенно влиять на FPS.
GeoJSON-объекты в CesiumJS поддерживают интерактивность через picking:
const handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);
handler.setInputAction(movement => {
const picked = viewer.scene.pick(movement.position);
if (Cesium.defined(picked)) {
console.log(picked.id.properties);
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
Это позволяет:
Элементы GeoJSON можно скрывать или фильтровать на основе свойств:
dataSource.entities.values.forEach(entity => {
entity.show = entity.properties.population > 10000;
});
Также можно использовать масштабную зависимость:
entity.billboard.scaleByDistance = new Cesium.NearFarScalar(
1000,
1.0,
500000,
0.1
);
GeoJsonDataSource поддерживает асинхронную загрузку, что критично для больших наборов данных.
Cesium.GeoJsonDataSource.load("large.geojson", {
clampToGround: true
}).then(ds => {
viewer.dataSources.add(ds);
});
Для потоковых данных GeoJSON может обновляться частями через повторную загрузку источника или обновление entities.
GeoJSON часто комбинируется с:
Пример совместного использования:
viewer.dataSources.add(
Cesium.KmlDataSource.load("data.kml")
);
viewer.dataSources.add(
Cesium.GeoJsonDataSource.load("data.geojson")
);
Это создаёт многослойную модель представления данных.
Перед загрузкой в CesiumJS часто выполняется подготовка данных:
Оптимизированный GeoJSON снижает нагрузку на рендеринг и ускоряет инициализацию сцены.
GeoJSON в CesiumJS имеет ряд ограничений:
Несмотря на это, формат остаётся базовым инструментом для 2D/3D-векторной визуализации на глобусе.
GeoJSON properties полностью сохраняются в Entity и доступны для логики приложения:
const value = entity.properties.getValue().population;
Эти данные могут использоваться для:
CesiumJS поддерживает декларативные стили:
dataSource.entities.suspendEvents = true;
dataSource.entities.values.forEach(entity => {
entity.polygon.material = Cesium.Color.YELLOW;
});
dataSource.entities.resumeEvents();
Такой подход снижает количество перерисовок сцены при массовых изменениях.
GeoJSON в CesiumJS применяется не только для визуализации, но и для пространственного анализа:
Комбинация с вычислениями координат позволяет создавать интерактивные аналитические слои прямо на глобусе.