Формат KML (Keyhole Markup Language) стал стандартом для хранения геоданных благодаря Google Earth, но его возможности ограничены при работе с навигационными устройствами. В отличие от него, GPX (GPS Exchange Format) поддерживается большинством трекеров, смартфонов и специализированных программ — от Garmin Edge до Locus Map. Проблема в том, что прямая конвертация часто приводит к потере меток, высотных данных или временных меток.

Эта статья не просто перечислит инструменты для преобразования — мы разберём критические отличия между KML и GPX на уровне структуры файлов, покажем, как сохранить все атрибуты (включая цветовые стили и описания), и предостережём от типичных ошибок. Например, знали ли вы, что Google Earth автоматически упрощает траектории при экспорте в GPX, что может исказить маршрут на 10–15%? Или что некоторые онлайн-конвертеры ограничивают количество точек в бесплатной версии?

Почему KML не подходит для GPS-навигаторов (и когда GPX проигрывает)

Формат KML изначально разрабатывался для визуализации данных в Google Earth, а не для навигации. Его ключевые недостатки:

  • 📍 Избыточная вложенность: KML поддерживает сложные стили, 3D-модели и временные слои, которые GPX просто игнорирует. Например, анимация полёта в Google Earth теряется при конвертации.
  • 📏 Неточность координат: KML хранит данные в десятичных градусах с ограниченной точностью (до 6 знаков после запятой), тогда как GPX поддерживает до 10 знаков — критично для геодезических работ.
  • ⏱️ Отсутствие временных меток: В KML время привязано к <TimeStamp> или <TimeSpan>, но многие конвертеры их пропускают, что делает GPX-файл бесполезным для анализа скорости движения.

Однако есть случаи, когда KML предпочтительнее:

  • 🎨 Нужна визуализация с цветовыми стилями (например, тепловые карты плотности точек).
  • 📊 Требуется сохранение иерархии папок и слоёв (GPX поддерживает только плоскую структуру).
  • 🌍 Работа с 3D-моделями рельефа или зданиями (GPX ограничен 2D-координатами).
⚠️ Внимание: Если ваш KML-файл содержит <NetworkLink> (ссылки на внешние данные), большинство конвертеров проигнорирует их. Перед преобразованием откройте файл в Google Earth и сохраните как .kmz (архив), чтобы избежать потери данных.

Сравнение 5 способов конвертации: от онлайн-сервисов до Python-скриптов

Выбор метода зависит от объёма данных, требований к точности и технических навыков. Ниже — сравнительная таблица с учётом поддержки атрибутов, скорости и ограничений:

Метод Поддержка меток Сохранение высоты Ограничение по точкам Требуемые навыки
GPSVisualizer ✅ (включая описания) 10 000 точек Базовые
QGIS + плагин ✅ (с ручной настройкой) Нет Средние
gpsbabel (CLI) ❌ (только координаты) Нет Продвинутые
Python (pykml + gpxpy) ✅ (гибкая настройка) Нет Разработчик
MyGeodata Converter ❌ (упрощает рельеф) 5 000 точек Базовые

Для большинства пользователей оптимальным решением станет GPSVisualizer — он бесплатен, не требует установки и сохраняет до 90% атрибутов. Однако если вам нужно обработать маршрут с 50 000+ точек (например, данные с дрона), придётся использовать gpsbabel или Python.

📊 Какой инструмент вы используете для работы с геоданными?
  • Google Earth
  • QGIS
  • Garmin BaseCamp
  • OsmAnd
  • Другой

Пошаговая инструкция: конвертация через GPSVisualizer (без потерь данных)

Этот метод подходит для маршрутов до 10 000 точек и сохраняет названия меток, описания и высоту. Следуйте алгоритму:

  1. Перейдите на сайт GPSVisualizer и выберите вкладку Convert.
  2. Загрузите KML-файл в поле Input file. Если файл весит более 5 МБ, сожмите его в ZIP.
  3. В разделе Output format выберите GPX и активируйте опции:
    • 🔹 Preserve track/route names (сохранит имена маршрутов).
    • 🔹 Include elevation data (если в KML есть высотные метки).
    • 🔹 Use GPX 1.1 (для совместимости с Garmin).
  • Нажмите Convert the file и дождитесь обработки (может занять до 2 минут для больших файлов).
  • ☑️ Проверка результата конвертации

    Выполнено: 0 / 4

    Если в результате некоторые метки пропали, проверьте исходный KML на наличие вложенных папок (<Folder>). GPSVisualizer игнорирует папки глубиной более 2 уровней. Решение — предварительно "сплющить" структуру в Google Earth:

    1. Откройте KML в Google Earth.
    2. Щёлкните правой кнопкой по корневой папке и выберите Свойства.
    3. Вкладка СтильПоказать содержимое как моделиПрименить ко всем вложенным папкам.
    4. Сохраните файл заново.
    5. ⚠️ Внимание: Если ваш KML содержит данные в системе координат, отличной от WGS84 (например, EPSG:3857), GPSVisualizer не выполнит автоматическое преобразование. Используйте QGIS для репроекции перед конвертацией.

      Продвинутая конвертация: Python-скрипт для сохранения всех атрибутов

      Если вам нужно сохранить все данные — включая цветовые стили, временные метки и пользовательские поля — придётся написать скрипт. Ниже пример на Python с использованием библиотек pykml и gpxpy:

      from pykml import parser
      

      from gpxpy.gpx import GPX, GPXTrack, GPXTrackSegment, GPXTrackPoint

      import datetime

      # Загрузка KML

      with open('input.kml', 'r') as f:

      doc = parser.parse(f).getroot()

      # Создание GPX

      gpx = GPX()

      track = GPXTrack(name=doc.Document.name)

      gpx.tracks.append(track)

      segment = GPXTrackSegment()

      track.segments.append(segment)

      # Конвертация точек

      for placemark in doc.Document.Folder.Placemark:

      point = placemark.Point.coordinates[0].text.split(',')

      segment.points.append(

      GPXTrackPoint(

      latitude=float(point[1]),

      longitude=float(point[0]),

      elevation=float(point[2]) if len(point) > 2 else None,

      time=datetime.datetime.strptime(placemark.TimeStamp.when, '%Y-%m-%dT%H:%M:%SZ')

      if hasattr(placemark, 'TimeStamp') else None

      )

      )

      # Сохранение GPX

      with open('output.gpx', 'w') as f:

      f.write(gpx.to_xml())

      Этот скрипт обрабатывает:

      • 📌 Координаты (широта, долгота, высота).
      • ⏰ Временные метки (если есть тег <TimeStamp>).
      • 🏷️ Имена меток (из атрибута name в Placemark).

    Для установки зависимостей выполните:

    pip install pykml gpxpy
    Как обработать KML с вложенными папками?

    Для рекурсивной обработки вложенных папок (<Folder>) модифицируйте скрипт, добавив функцию:

    ```python

    def process_folder(folder, track):

    for placemark in folder.Placemark:

    # обработка точки (как в основном коде)

    for subfolder in folder.Folder:

    process_folder(subfolder, track) # рекурсия

    ```

    Затем вызовите её для корневой папки: process_folder(doc.Document.Folder, track).

    ⚠️ Внимание: Если в KML используются нестандартные теги (например, <ExtendedData> с кастомными полями), их придётся обрабатывать вручную. Для этого добавьте в скрипт парсинг дополнительных атрибутов:

    ```python

    for data in placemark.ExtendedData.Data:

    if data.name == 'speed':

    point.extensions = f'{data.value}'

    ```

    Ошибки конвертации: как исправить "битые" GPX-файлы

    Даже после успешной конвертации GPX может не открываться в навигаторе или отображаться некорректно. Рассмотрим типичные проблемы и решения:

    Симптом Причина Решение
    Файл не открывается в Garmin Неправильная версия GPX (используется 1.0 вместо 1.1) Пересохраните в GPX 1.1 через GPSVisualizer или добавьте вручную:
    <gpx version="1.1" creator="YourApp">
    Маршрут отображается "ступеньками" Потеря высотных данных при конвертации Проверьте, что в KML есть тег <altitudeMode> со значением absolute
    Метки имеют одинаковые имена Конвертер обрезал длинные названия Используйте Python-скрипт с сохранением полных имён или редактируйте GPX в Notepad++
    Файл весит в 10 раз больше исходного KML Дублирование точек или избыточная точность координат Оптимизируйте через gpsbabel -i gpx -f input.gpx -x simplify,count=1000 -o gpx -F output.gpx

    Если GPX-файл повреждён (например, из-за прерванной загрузки), восстановите его с помощью GPX Editor:

    1. Откройте файл в текстовом редакторе и найдите первую строку с <trkpt.
    2. Удалите всё до тега <gpx (включительно).
    3. Добавьте в начало корректный заголовок:
      <?xml version="1.0" encoding="UTF-8"?>
      

      <gpx version="1.1" creator="Manual Fix" xmlns="http://www.topografix.com/GPX/1/1">

    4. Сохраните с кодировкой UTF-8.
    💡

    Перед загрузкой GPX в навигатор проверьте его валидность на сайте GPSVisualizer Validator. Сервис покажет ошибки в структуре файла и предложит исправления.

    Конвертация для специфических устройств: Garmin, OsmAnd, Suunto

    Разные устройства предъявляют уникальные требования к GPX. Ниже — чек-лист для популярных брендов:

    • 📱 OsmAnd:
      • 🔹 Поддерживает GPX с треками (<trk>) и маршрутами (<rte>).
      • 🔹 Максимальный размер файла — 50 МБ (иначе приложение крашится).
      • 🔹 Для отображения высотного профиля требуется тег <ele> в каждой точке.
    • 🚴 Garmin Edge/Forerunner:
      • 🔹 Только GPX 1.1 (1.0 не поддерживается).
      • 🔹 Ограничение на 200 точек в маршруте (<rte>) и 10 000 в треке (<trk>).
      • 🔹 Для навигации по маршруту требуется тег <rtept> с атрибутом sym="Waypoint".
    • ⛷️ Suunto:
      • 🔹 Поддерживает только треки (<trk>), маршруты игнорирует.
      • 🔹 Требует временные метки (<time>) для корректного отображения скорости.
      • 🔹 Максимальная частота точек — 1 секунда (более частые данные будут прорежены).

    Для Garmin рекомендуется использовать BaseCamp для финальной проверки:

    1. Импортируйте GPX в BaseCamp.
    2. Проверьте, что маршрут отображается без разрывов (красные линии указывают на ошибки).
    3. Если есть проблемы, экспортируйте обратно в GPX с настройками:
      Файл → Экспорт → Выбрать "Трек" → Формат "GPX" → Опции: "Включить высоту"
    💡

    Для устройств Garmin критично наличие тега <extensions> с данными о сердечном ритме или мощности, если они были в исходном KML. Без этого информация не отобразится на часах Forerunner 955 или Edge 1040.

    Автоматизация: как конвертировать сотни KML-файлов за раз

    Если вам нужно обработать папку с KML-файлами (например, данные с дронов или геодезические съёмки), используйте batch-скрипт для gpsbabel:

    @echo off
    

    for %%f in (*.kml) do (

    gpsbabel -i kml -f "%%f" -o gpx -F "converted/%%~nf.gpx" -x track,merge,title="%%~nf"

    )

    pause

    Этот скрипт:

    • 🔄 Обрабатывает все .kml файлы в текущей папке.
    • 📁 Сохраняет результаты в подпапку converted с оригинальными именами.
    • 🏷️ Добавляет название трека (title) из имени файла.

    Для Linux/macOS используйте аналогичную команду в терминале:

    mkdir -p converted
    

    for file in *.kml; do

    gpsbabel -i kml -f "$file" -o gpx -F "converted/${file%.kml}.gpx" -x track,merge,title="${file%.kml}"

    done

    Если файлов тысячи, оптимизируйте процесс с помощью parallel:

    find . -name "*.kml" | parallel -j 4 gpsbabel -i kml -f {} -o gpx -F converted/{/.}.gpx

    Флаг -j 4 запускает 4 параллельных процесса (ускорит обработку в 3–5 раз).

    ⚠️ Внимание: При пакетной обработке gpsbabel по умолчанию упрощает треки до 500 точек. Чтобы сохранить все данные, добавьте флаг -x simplify,crosstrack,error=0.001k (где 0.001k — максимальное отклонение в километрах).

    FAQ: ответы на частые вопросы

    Можно ли конвертировать KML в GPX на смартфоне без компьютера?

    Да, используйте приложения:

    • 📱 GPS Visualizer Mobile (Android/iOS) — загружает файлы с облака и конвертирует в GPX.
    • 📱 OsmAnd — импортирует KML и экспортирует в GPX (меню Мои места → Экспорт).

    Ограничения: на смартфоне сложно обработать файлы >50 МБ из-за ограничений ОЗУ.

    Почему после конвертации в GPX пропадают цвета маршрутов?

    GPX не поддерживает цветовые стили — это ограничение формата. Решения:

    • 🎨 Используйте QGIS для назначения цветов после импорта GPX.
    • 📊 В OsmAnd цвета назначаются автоматически по типу активности (пеший/велосипедный маршрут).

    Если критично сохранить оригинальные цвета, конвертируйте KML в GeoJSON (поддерживает стили), а затем в GPX.

    Как конвертировать KML с временными метками, чтобы они сохранились в GPX?

    Большинство онлайн-конвертеров игнорируют <TimeStamp> или <TimeSpan>. Используйте:

    1. gpsbabel с флагом -x track,pack,interval=5s (интерполяция временных меток).
    2. Python-скрипт с ручным парсингом тегов <when> (пример в разделе про скрипты).

    Проверьте результат в GPX Editor: временные метки должны быть в формате YYYY-MM-DDTHH:MM:SSZ.

    Можно ли конвертировать KML в GPX с сохранением фотографий (геотегов)?

    Нет, GPX не поддерживает встраивание медиафайлов. Альтернативы:

    • 📸 Используйте KMZ (архив с KML + фотографиями) и конвертируйте только координаты в GPX.
    • 📌 Сохраните фотографии отдельно, а в GPX добавьте ссылки на них в теге <link>:
      <extensions>
      

      <link href="photo1.jpg"/>

      </extensions>

    Для просмотра таких GPX с фотографиями подходит Locus Map (Android).

    Как уменьшить размер GPX-файла после конвертации?

    Используйте gpsbabel с фильтрами:

    • 🗜️ Упрощение трека: -x simplify,count=2000 (оставит 2000 точек).
    • 📉 Удаление высот: -x transform,wpt=trk=del:ele.
    • ⏱️ Удаление временных меток: -x transform,wpt=trk=del:time.

    Пример команды для уменьшения файла в 10 раз:

    gpsbabel -i gpx -f input.gpx -x simplify,error=0.005k -x transform,del:ele -o gpx -F output.gpx