KML файлы

KML (Keyhole Markup Language) представляет собой XML-формат, предназначенный для описания географических данных: точек, линий, полигонов, слоёв и метаданных. В контексте веб-картографии он используется как универсальный способ передачи геопространственных объектов между системами.

В рамках платформы HERE Technologies работа с KML встроена в экосистему визуализации слоёв, позволяя загружать внешние геоданные и отображать их поверх базовой карты без предварительной конвертации в собственные форматы.


Структура KML и особенности интерпретации

KML-файл представляет собой XML-документ, содержащий иерархию географических сущностей.

Основные элементы:

Placemark

  • точка, линия или полигон
  • содержит координаты
  • может включать описание и стили

LineString

  • последовательность координат
  • используется для маршрутов, треков, границ

Polygon

  • замкнутая область
  • поддерживает внутренние отверстия (holes)

Style

  • визуальное оформление объектов
  • цвет, толщина линий, иконки

Folder

  • логическая группировка объектов

В KML важным аспектом является порядок координат:

longitude,latitude,altitude

что часто становится источником ошибок при первичной интеграции.


Загрузка KML в JavaScript-карту

В JavaScript SDK HERE Maps KML обычно загружается через специализированный загрузчик, который преобразует XML-структуру в объекты карты.

Базовый сценарий включает:

  1. загрузку KML-файла
  2. парсинг XML
  3. преобразование в графические объекты
  4. добавление слоя на карту

Пример типовой интеграции:

// Инициализация платформы
const platform = new H.service.Platform({
  apikey: 'YOUR_API_KEY'
});

const defaultLayers = platform.createDefaultLayers();

const map = new H.Map(
  document.getElementById('map'),
  defaultLayers.vector.normal.map,
  {
    center: { lat: 50.4501, lng: 30.5234 },
    zoom: 10,
    pixelRatio: window.devicePixelRatio
  }
);

// UI и поведение карты
const beh * avior = new H.mapevents.Behavior(new H.mapevents.MapEvents(map));
const ui = H.ui.UI.createDefault(map, defaultLayers);

Загрузка KML через Data Layer

Для работы с KML используется слой данных, который умеет интерпретировать геометрии.

const reader = new H.data.kml.Reader('data/example.kml');

reader.parse();

reader.addEventListener('statechange', function () {
  if (reader.getState() === H.data.AbstractReader.State.READY) {
    map.addLayer(reader.getLayer());
  }
});

В этом процессе ключевую роль играет объект Reader, который:

  • загружает файл по URL
  • разбирает XML
  • строит набор гео-объектов
  • возвращает готовый слой

Архитектура KML-слоя в HERE Maps

После парсинга KML данные преобразуются в внутренние сущности карты:

  • H.map.Marker для точек
  • H.map.Polyline для линий
  • H.map.Polygon для областей

Каждый объект получает:

  • геометрию
  • метаданные (properties)
  • стили (если определены в KML)

Слой работает как контейнер, позволяющий управлять группами объектов единым образом:

map.addLayer(kmlLayer);

Обработка стилей KML

KML поддерживает встроенные стили, но их интерпретация в веб-картах часто требует адаптации.

Примеры параметров:

  • LineStyle

    • color
    • width
  • PolyStyle

    • fill color
    • outline
  • IconStyle

    • URL иконки
    • масштаб

В HERE Maps API стили могут быть преобразованы в:

const lineString = new H.map.Polyline(coords, {
  style: {
    strokeColor: 'rgba(0, 128, 255, 0.7)',
    lineWidth: 4
  }
});

При этом KML-стили не всегда полностью совпадают с возможностями рендерера, поэтому часто применяется нормализация.


Работа с координатами и проекциями

HERE Maps использует проекцию Web Mercator, тогда как KML оперирует географическими координатами WGS84.

Преобразование происходит автоматически:

  • вход: latitude / longitude
  • выход: пиксельные координаты карты

Однако при ручной обработке важно учитывать:

  • порядок координат в KML
  • отсутствие обязательного altitude
  • возможные NaN при некорректном XML

Динамическая загрузка KML

KML может подгружаться асинхронно, что важно для больших наборов данных.

function loadKML(url) {
  const reader = new H.data.kml.Reader(url);

  reader.parse();

  reader.addEventListener('statechange', () => {
    if (reader.getState() === H.data.AbstractReader.State.READY) {
      const layer = reader.getLayer();
      map.addLayer(layer);
    }
  });
}

Такой подход позволяет:

  • подгружать слои по мере необходимости
  • разделять данные по категориям
  • управлять производительностью

Управление объектами после загрузки

После добавления KML-слоя объекты становятся частью карты и могут быть доступны для взаимодействия.

Основные операции:

Поиск объектов

layer.getProvider().getRootGroup().forEach((obj) => {
  console.log(obj.getData());
});

Изменение стиля

obj.setStyle({
  fillColor: 'rgba(255,0,0,0.5)'
});

Удаление слоя

map.removeLayer(layer);

Ограничения KML в HERE Maps

Несмотря на поддержку формата, существуют ограничения:

  • не все расширения Google Earth KML поддерживаются
  • сложные 3D-модели игнорируются
  • кастомные схемы расширений (ExtendedData) частично доступны
  • большие KML-файлы могут требовать предварительной оптимизации

Также стоит учитывать производительность:

  • тысячи объектов резко увеличивают нагрузку
  • сложные полигоны замедляют рендеринг
  • анимации KML не интерпретируются напрямую

Оптимизация больших KML-наборов

При работе с массивными слоями применяются следующие подходы:

Разбиение файлов

KML делится на логические части:

  • регионы
  • категории объектов
  • временные слои

Упрощение геометрии

Перед загрузкой выполняется:

  • снижение количества точек
  • удаление лишних сегментов

Кэширование

  • хранение готовых слоёв
  • повторное использование уже распарсенных данных

Преобразование KML в внутренние структуры

В некоторых сценариях KML используется только как промежуточный формат. После загрузки данные переводятся в более оптимальные структуры:

  • GeoJSON-подобные объекты
  • собственные модели приложения
  • серверные тайлы

Такой подход позволяет:

  • ускорить рендеринг
  • уменьшить нагрузку на клиент
  • гибко управлять стилями

Интеграция KML с событиями карты

Объекты KML могут участвовать в событиях:

  • click
  • pointerenter
  • pointerleave

Пример:

map.addEventListener('tap', function (evt) {
  const target = evt.target;

  if (target instanceof H.map.Polygon) {
    console.log('Polygon clicked');
  }
});

Это позволяет использовать KML как основу для интерактивных слоёв аналитики.


Использование KML в гибридных приложениях

KML часто комбинируется с другими источниками данных:

  • REST API геосервисов
  • realtime GPS-трекинг
  • пользовательские GeoJSON слои

В таких системах KML выступает как:

  • статический слой
  • справочная география
  • базовая разметка территории

Поведение при ошибках парсинга

При некорректных KML-файлах система может:

  • игнорировать повреждённые узлы XML
  • частично загружать доступные элементы
  • завершать загрузку с состоянием ERROR

Типичные причины:

  • неправильный XML
  • отсутствующие координаты
  • неверная кодировка
  • некорректные теги KML версии

Особенности работы с большими картографическими наборами

При интеграции KML в масштабные проекты важно учитывать:

  • лимиты браузера по памяти
  • скорость DOM-парсинга XML
  • нагрузку на WebGL-рендер

Практика показывает, что KML лучше использовать для:

  • средних наборов данных
  • административных границ
  • маршрутов и треков

для потоковых данных предпочтительнее другие форматы.