KML (Keyhole Markup Language) представляет собой XML-формат для описания географических объектов: точек, линий, полигонов, а также стилей их отображения. В контексте Google Maps JavaScript API работа с внешними KML-файлами реализуется через класс KmlLayer, который позволяет накладывать готовые геоданные поверх карты без необходимости ручного парсинга или рендеринга объектов.
Основной подход заключается в передаче URL-адреса к KML или KMZ-файлу в конструктор слоя. Библиотека самостоятельно выполняет загрузку, парсинг и отрисовку объектов на карте.
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 48.0, lng: 66.9 },
zoom: 5,
});
const kmlLayer = new google.maps.KmlLayer({
url: "https://example.com/data/regions.kml",
map: map,
});
После добавления слоя все объекты из KML становятся частью визуального слоя карты, сохраняя структуру и стили, заданные в исходном файле.
KmlLayer работает с двумя основными типами файлов:
.kml) — текстовый XML-документ.kmz) — сжатый архив, содержащий KML и
дополнительные ресурсы (иконки, изображения)Ключевым требованием является доступность файла по публичному HTTPS-адресу. Использование локальных файлов или небезопасного HTTP приводит к отказу загрузки.
При работе с внешними KML-файлами необходимо учитывать ряд ограничений:
Эти ограничения обусловлены тем, что обработка KML выполняется на стороне инфраструктуры Google Maps API, а не в браузере напрямую.
Конструктор KmlLayer принимает набор опций, влияющих на поведение слоя.
const layer = new google.maps.KmlLayer({
url: "https://example.com/data.kml",
map: map,
preserveViewport: true,
suppressInfoWindows: false,
zIndex: 1,
});
Адрес KML/KMZ файла. Единственный обязательный параметр.
Привязка слоя к конкретному объекту карты. При установке в
null слой удаляется с карты.
Определяет поведение камеры:
false — карта автоматически центрируется и
масштабируется под данные KMLtrue — текущее положение и масштаб карты
сохраняютсяИспользование этого параметра критично при работе с несколькими слоями, чтобы избежать постоянного изменения viewport.
Управляет отображением всплывающих окон при клике на объекты KML.
false — инфоокна отображаютсяtrue — стандартные окна отключаются для реализации
кастомной логикиОпределяет порядок наложения слоя относительно других векторных слоёв.
KmlLayer поддерживает события, позволяющие отслеживать процесс загрузки и взаимодействие с объектами.
Событие изменения статуса загрузки позволяет определить результат обработки KML-файла.
google.maps.event.addListener(kmlLayer, "status_changed", () => {
console.log(kmlLayer.getStatus());
});
Возможные статусы:
OK — успешная загрузкаDOCUMENT_NOT_FOUND — файл недоступенDOCUMENT_TOO_LARGE — превышен допустимый размерFETCH_ERROR — ошибка сетиINVALID_DOCUMENT — некорректный KMLLIMITS_EXCEEDED — превышены ограничения APIПри взаимодействии с элементами слоя генерируются события, содержащие структурированную информацию об объекте.
google.maps.event.addListener(kmlLayer, "click", (event) => {
console.log(event.featureData);
});
Объект featureData содержит:
name — название объектаdescription — HTML-описаниеgeometry — геометрия (точка, линия, полигон)properties — дополнительные атрибутыПри необходимости можно полностью перехватывать поведение клика и реализовывать собственные информационные панели.
Стилизация KML-объектов определяется самим файлом и может включать:
Google Maps API не предоставляет полного контроля над стилями после загрузки KML. Изменение внешнего вида возможно только через модификацию исходного файла или отключение стандартных инфоокон с последующей кастомной отрисовкой данных.
KMZ-файлы представляют собой архивы, содержащие KML и связанные ресурсы. При загрузке такие файлы автоматически распаковываются на стороне сервера Google.
Особенности:
При работе с большими KML-файлами производительность зависит от количества объектов и сложности геометрии.
Практические аспекты:
preserveViewport может ускорить первичную
загрузку картыПри большом объёме данных предпочтительнее использовать векторные тайлы или GeoJSON через собственные слои, однако KML остаётся удобным для интеграции готовых геоданных.
KML-файлы загружаются через серверную инфраструктуру Google, что накладывает дополнительные требования:
Любые ограничения доступа приводят к статусу FETCH_ERROR
или DOCUMENT_NOT_FOUND.
KmlLayer не поддерживает частичное обновление содержимого. Для обновления данных используется пересоздание слоя:
kmlLayer.setMap(null);
const newLayer = new google.maps.KmlLayer({
url: "https://example.com/updated.kml",
map: map,
});
Для имитации динамики часто применяется изменение URL с параметром версии:
url: "https://example.com/data.kml?v=2"
Это позволяет обходить кэширование.
В практических задачах KML-слои применяются для:
Каждый сценарий опирается на возможность быстрого подключения внешнего геодатасета без предварительной обработки на клиентской стороне.
Архитектурно KmlLayer является высокоуровневой абстракцией, что приводит к ряду ограничений:
Эти особенности определяют его роль как инструмента интеграции готовых данных, а не как системы для интерактивной GIS-визуализации высокой сложности.