KML (Keyhole Markup Language) представляет собой XML-формат для описания географических данных: точек, линий, полигонов, 3D-объектов и связанных с ними метаданных. В контексте веб-картографии он используется как универсальный способ обмена слоями между различными GIS-системами, включая Google Earth и серверные геоинформационные платформы.
Структура KML включает:
Особенность формата заключается в том, что он изначально рассчитан на визуализацию, а не на аналитическую обработку, поэтому часто содержит встроенные стили и описания объектов.
OpenLayers предоставляет встроенный парсер KML через модуль
ol/format/KML. Он позволяет:
Основной класс для работы:
import KML from 'ol/format/KML';
Чаще всего KML подключается как источник векторного слоя.
import VectorSource from 'ol/source/Vector';
import VectorLayer from 'ol/layer/Vector';
import KML from 'ol/format/KML';
const kmlSource = new VectorSource({
url: 'data/routes.kml',
format: new KML()
});
const kmlLayer = new VectorLayer({
source: kmlSource
});
url может указывать на локальный файл или удалённый
ресурсFeatureEPSG:3857)Конструктор KML поддерживает ряд настроек, влияющих на
поведение парсинга.
Определяет, будут ли использоваться стили из KML.
const format = new KML({
extractStyles: true
});
Если включено:
Если выключено:
Управляет отображением названий точек.
new KML({
showPointNames: true
});
При включении:
<name>Позволяет задать fallback-стиль для объектов без встроенного оформления.
import Style from 'ol/style/Style';
import Fill from 'ol/style/Fill';
import Stroke from 'ol/style/Stroke';
const format = new KML({
defaultStyle: new Style({
fill: new Fill({
color: 'rgba(0, 150, 255, 0.3)'
}),
stroke: new Stroke({
color: '#0096ff',
width: 2
})
})
});
После загрузки KML данные преобразуются в объекты
Feature, содержащие геометрию:
PointLineStringPolygonMultiGeometryПример доступа к данным:
kmlSource.on('addfeature', (event) => {
const feature = event.feature;
const geometry = feature.getGeometry();
const properties = feature.getProperties();
});
name — название объектаdescription — HTML-описаниеstyleUrl — ссылка на стильДаже при использовании встроенных стилей часто требуется
переопределение отображения через styleFunction.
import Style from 'ol/style/Style';
import CircleStyle from 'ol/style/Circle';
import Fill from 'ol/style/Fill';
const layer = new VectorLayer({
source: kmlSource,
style: (feature) => {
const type = feature.getGeometry().getType();
if (type === 'Point') {
return new Style({
image: new CircleStyle({
radius: 6,
fill: new Fill({ color: 'red' })
})
});
}
}
});
При этом стили KML могут быть полностью игнорированы, если
extractStyles отключён.
KML может содержать ссылки на внешние данные, обновляемые динамически.
OpenLayers поддерживает их загрузку, но с ограничениями:
source.refresh()kmlSource.refresh();
KML использует WGS84 (EPSG:4326), где координаты
представлены как:
longitude, latitude, altitude
OpenLayers автоматически преобразует данные в проекцию карты.
При необходимости ручного контроля используется:
import { transform } from 'ol/proj';
const coord = transform([lon, lat], 'EPSG:4326', 'EPSG:3857');
Помимо загрузки по URL, KML можно парсить из строки:
const kmlText = `
<kml xmlns="http://www.opengis.net/kml/2.2">
<Placemark>
<name>Example</name>
<Point>
<coordinates>70.0,50.0</coordinates>
</Point>
</Placemark>
</kml>
`;
const features = new KML().readFeatures(kmlText, {
dataProjection: 'EPSG:4326',
featureProjection: 'EPSG:3857'
});
OpenLayers поддерживает обратное преобразование через
writeFeatures.
const kmlFormat = new KML();
const kmlOutput = kmlFormat.writeFeatures(features, {
featureProjection: 'EPSG:3857',
dataProjection: 'EPSG:4326'
});
Результат — строка XML, готовая для сохранения или передачи.
KML может содержать комбинированные геометрии:
Иерархия Folder преобразуется в плоский набор Feature, при этом:
folderNameПри больших файлах KML возникают типовые ограничения:
Оптимизационные подходы:
extractStyleshttp://www.opengis.net/kml/2.2KML-слой может комбинироваться с другими слоями:
При наложении важно учитывать порядок:
map.addLayer(rasterLayer);
map.addLayer(kmlLayer);
Векторный слой KML обычно размещается поверх растровых данных для корректной визуализации объектов.