CesiumJS предоставляет встроенную поддержку форматов KML и KMZ через
модуль KmlDataSource, который позволяет загружать,
отображать и интерактивно использовать геоданные, созданные в стандартах
Keyhole Markup Language. Эти форматы широко применяются для описания
геометрии, стилей, временных интервалов и сложных пространственных
структур.
В основе работы с KML в Cesium лежит объект
KmlDataSource. Он выполняет разбор XML-структуры,
преобразование геометрии в примитивы Cesium и привязку стилей к
сущностям сцены.
Основной поток обработки включает:
Entity объектовDataSourceCollection сценыconst viewer = new Cesium.Viewer("cesiumContainer");
const kmlDataSource = new Cesium.KmlDataSource();
viewer.dataSources.add(
kmlDataSource.load("data/sample.kml", {
camera: viewer.scene.camera,
canvas: viewer.scene.canvas
})
);
Cesium поддерживает как текстовые KML-файлы, так и архивированные KMZ. KMZ представляет собой ZIP-архив, внутри которого находится KML и связанные ресурсы: изображения, иконки, модели.
Cesium.KmlDataSource.load("data/complex.kmz", {
camera: viewer.scene.camera,
canvas: viewer.scene.canvas
}).then(function (dataSource) {
viewer.dataSources.add(dataSource);
});
При загрузке KMZ происходит автоматическое извлечение ресурсов и корректное связывание путей внутри документа.
KmlDataSource.load принимает объект опций, влияющих на
поведение визуализации и интерпретацию данных:
camera — используется для корректного позиционирования
объектов относительно текущего видаcanvas — необходим для расчёта размеров и экранных
координатellipsoid — задаёт модель ЗемлиscreenOverlayContainer — контейнер для
HTML-оверлеевshow — начальная видимость слояCesium.KmlDataSource.load("data.kml", {
camera: viewer.scene.camera,
canvas: viewer.scene.canvas,
clampToGround: true
});
KML поддерживает несколько типов геометрии, каждый из которых преобразуется в соответствующие сущности Cesium:
Точки преобразуются в Billboard или
Label.
Линии становятся Polyline.
Полигоны отображаются как PolygonGraphics с возможностью
привязки к поверхности земли.
3D-модели (например, COLLADA .dae) интегрируются как
ModelGraphics.
Одной из ключевых особенностей является возможность прижатия геометрии к поверхности Земли:
Cesium.KmlDataSource.load("terrain.kml", {
clampToGround: true
});
Это особенно важно для:
При включённом режиме Cesium использует GroundPrimitive
или декартову проекцию с учётом высотной модели.
KML включает встроенную систему стилей (Style,
StyleMap). Cesium интерпретирует:
Пример KML-стиля:
<Style id="routeStyle">
<LineStyle>
<color>ff0000ff</color>
<width>4</width>
</LineStyle>
</Style>
Cesium автоматически применяет стиль к соответствующим
Entity.
ExtendedData позволяет хранить произвольные атрибуты
объектов. Cesium сохраняет их в properties сущности.
<ExtendedData>
<Data name="speed">
<value>120</value>
</Data>
</ExtendedData>
Доступ в Jav * aScript:
entity.properties.speed.getValue();
Это используется для:
KML поддерживает временные интервалы (TimeSpan,
TimeStamp), которые Cesium интерпретирует как
availability.
<TimeSpan>
<begin>2024-01-01</begin>
<end>2024-01-02</end>
</TimeSpan>
В Cesium это позволяет:
NetworkLink позволяет загружать внешние KML по URL,
включая обновляемые данные.
Cesium поддерживает автоматическое обновление:
<NetworkLink>
<Link>
<href>https://example.com/data.kml</href>
<refreshMode>onInterval</refreshMode>
<refreshInterval>60</refreshInterval>
</Link>
</NetworkLink>
Использование:
KMZ может содержать:
Cesium выполняет:
Особенности:
После загрузки KML/KMZ доступен контроль через
DataSource:
kmlDataSource.show = false;
viewer.dataSources.remove(kmlDataSource);
Также можно фильтровать сущности:
kmlDataSource.entities.values.forEach(e => {
if (e.name === "restricted") {
e.show = false;
}
});
Cesium позволяет переопределять стили после загрузки KML:
kmlDataSource.entities.values.forEach(entity => {
if (entity.billboard) {
entity.billboard.scale = 1.5;
}
});
Распространённые сценарии:
При больших KML/KMZ файлах возникают узкие места:
Оптимизационные подходы:
clampToGround вместо 3D-экструзийLabelПри интеграции KML в Cesium проявляются особенности стандарта:
gx: расширенийTour поддерживаютсяКаждый KML-объект становится Entity, что даёт доступ к
интерактивности:
viewer.selectedEntityChanged.addEventListener(function(entity) {
if (entity && entity.name) {
console.log(entity.name);
}
});
KML-данные часто используются как слой поверх кастомного UI:
ExtendedDataCesium предоставляет прямой доступ к свойствам без необходимости парсинга XML вручную, что упрощает интеграцию в приложения пространственного анализа.