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

В этой статье мы разберём все актуальные методы конвертации — от онлайн-сервисов до программного кода, — а также раскроем ключевые отличия форматов, которые влияют на результат. Вы узнаете, как сохранить метаданные (например, высоту, время или описания точек), избежать потерь данных при преобразовании и автоматизировать процесс для большого количества файлов.

Чем отличаются GPX и KML: что теряется при конвертации

Хотя оба формата хранят геопространственные данные, их структура и возможности существенно различаются. GPX фокусируется на точности GPS-данных: он сохраняет координаты, высоту, временные метки и дополнительные атрибуты треков (например, частоту сердечных сокращений в фитнес-трекерах). KML, в свою очередь, ориентирован на визуализацию: поддерживает стили отображения (цвета линий, иконки меток), слои и даже 3D-модели.

При конвертации из GPX в KML возможны следующие потери:

  • 📉 Метки времени: KML не всегда корректно интерпретирует временные данные из GPX, особенно если они записаны в нестандартном формате.
  • 📊 Дополнительные атрибуты: Параметры вроде <extensions> (например, данные с фитнес-браслетов) могут игнорироваться.
  • 🎨 Стили по умолчанию: В KML придётся вручную настраивать цвета линий и иконки, тогда как в GPX они часто задаются автоматически.

Однако KML выигрывает в гибкости визуализации. Например, в нём можно:

  • 🌍 Создавать многоуровневые слои (например, отдельно для маршрута и точек интереса).
  • 🎭 Использовать кастомные стили для разных типов объектов (например, красные метки для отелей, зелёные — для ресторанов).
  • 📽️ Встраивать мультимедиа: изображения, видео или HTML-описания к меткам.
⚠️ Внимание: Если ваш GPX-файл содержит данные о высоте над уровнем моря (тег <ele>), убедитесь, что конвертер поддерживает их экспорт в KML. Некоторые онлайн-сервисы игнорируют этот параметр, что приводит к "плоским" трекам в Google Earth.

Топ-5 онлайн-конвертеров GPX в KML: сравнение и ограничения

Онлайн-сервисы удобны для разовых задач, но часто имеют ограничения по размеру файлов или функционалу. Мы протестировали популярные инструменты и составили таблицу их возможностей:

Сервис Макс. размер файла Сохраняет высоту Сохраняет время Поддержка пакетной обработки Экспорт стилей
GPX2KML 50 МБ
GPS Visualizer 10 МБ ✅ (до 5 файлов) ✅ (частично)
MyGeodata 50 МБ
AllTrails 20 МБ
GPSies 100 МБ

Для большинства задач подойдёт GPS Visualizer — он бесплатен, не требует регистрации и поддерживает расширенные настройки (например, можно указать цвет линии или размер иконок). Если нужно обработать несколько файлов сразу, обратите внимание на MyGeodata или GPSies, но учтите, что последний может удалять временные метки при большом объёме данных.

📊 Какой онлайн-конвертер GPX в KML вы используете чаще?
  • GPS Visualizer
  • GPX2KML
  • MyGeodata
  • GPSies
  • Другой

Десктопные программы для конвертации: когда онлайн не подходит

Если вы работаете с конфиденциальными данными, большими файлами (более 100 МБ) или нуждаетесь в пакетной обработке, онлайн-сервисы не подойдут. В таких случаях используйте десктопные программы:

  • 🖥️ QGIS (бесплатно, кроссплатформенный): Мощный GIS-инструмент с поддержкой плагинов. Позволяет не только конвертировать форматы, но и редактировать геоданные, добавлять атрибуты или фильтровать объекты.
  • 🖥️ Global Mapper (платный, Windows): Поддерживает более 300 форматов, включая GPX и KML. Имеет встроенный инструмент для оптимизации треков (упрощение линий, удаление дубликатов точек).
  • 🖥️ GPS Babel (бесплатно, Windows/macOS/Linux): Консольная утилита для продвинутых пользователей. Поддерживает скрипты для автоматической обработки файлов.

Для большинства пользователей оптимальным выбором станет QGIS. Вот пошаговая инструкция:

  1. Установите QGIS с официального сайта (qgis.org).
  2. Запустите программу и перейдите в Слой → Добавить слой → Добавить векторный слой.
  3. Выберите ваш GPX-файл. Он отобразится на карте.
  4. Щёлкните правой кнопкой по слою в панели слоёв и выберите Экспортировать → Сохранить объекты как....
  5. В поле "Формат" укажите Keyhole Markup Language [KML], выберите папку для сохранения и нажмите OK.

Убедиться, что файл не повреждён (открывается в текстовом редакторе)

Проверить кодировку (должна быть UTF-8)

Удалить лишние метки или сегменты (если нужно)

Сохранить резервную копию оригинального файла-->

Если вам нужна автоматизация, воспользуйтесь GPS Babel. Например, для конвертации всех GPX-файлов в папке в KML выполните в терминале:

for file in *.gpx; do

gpsbabel -i gpx -f "$file" -o kml -F "${file%.gpx}.kml"

done

⚠️ Внимание: При использовании Global Mapper отключите опцию "Упрощение линий" (Tools → Configuration → Vector Options), если важна точность трека. Алгоритм упрощения может удалять до 30% точек, что критично для детальных маршрутов.

Конвертация через Python: для разработчиков и автоматизации

Если вам нужно интегрировать конвертацию в свой проект или обработать сотни файлов, используйте скрипты на Python. Библиотека gpxpy позволяет парсить GPX, а simplekml — создавать KML-файлы. Установите зависимости:

pip install gpxpy simplekml

Пример скрипта для базовой конвертации:

import gpxpy

import simplekml

# Чтение GPX

with open('track.gpx', 'r') as gpx_file:

gpx = gpxpy.parse(gpx_file)

# Создание KML

kml = simplekml.Kml()

for track in gpx.tracks:

for segment in track.segments:

linestring = kml.newlinestring(name=track.name)

linestring.coords = [(point.longitude, point.latitude, point.elevation)

for point in segment.points]

linestring.style.linestyle.width = 3

linestring.style.linestyle.color = simplekml.Color.red

kml.save('track.kml')

Этот скрипт:

  • 📌 Сохраняет все треки из GPX (включая название и точки).
  • 🎨 Задаёт красный цвет линии толщиной 3 пикселя.
  • 📏 Включает высоту (если она есть в исходном файле).

Для обработки меток (waypoints) добавьте в скрипт:

for waypoint in gpx.waypoints:

point = kml.newpoint(name=waypoint.name, coords=[(waypoint.longitude, waypoint.latitude)])

point.style.iconstyle.icon.href = 'http://maps.google.com/mapfiles/kml/shapes/placemark_circle.png'

Как обработать большие GPX-файлы (>100 МБ) без ошибок памяти?

Для файлов размером более 100 МБ используйте потоковое чтение с xml.etree.ElementTree вместо gpxpy, так как последний загружает весь файл в память. Пример:

import xml.etree.ElementTree as ET

context = ET.iterparse('large_track.gpx', events=('start', 'end'))

for event, elem in context:

if event == 'end' and elem.tag.endswith('trkpt'):

# Обработка точки

elem.clear() # Освобождение памяти

Это снизит потребление RAM с 1+ ГБ до ~50 МБ.

Проблемы при конвертации и как их решить

Даже с надёжными инструментами могут возникать ошибки. Рассмотрим типичные проблемы и способы их устранения:

1. Кодировка файла

Если в KML-файле вместо кириллических символов отображаются ????, значит, исходный GPX сохранён не в UTF-8. Исправьте кодировку с помощью Notepad++ или командой:

iconv -f WINDOWS-1251 -t UTF-8 input.gpx > output.gpx

2. Потеря высоты

Некоторые конвертеры (например, MyGeodata) игнорируют тег <ele>. Чтобы сохранить высоту:

  • 🔧 Используйте QGIS или GPS Babel с флагом -x track,pack.
  • 📝 Проверьте, что в GPX высоты указаны в метрах (не в футах!).

3. Разрывы в треке

Если в KML линия прерывается, причины могут быть следующими:

  • 🕒 Большие временные разрывы между точками (например, пауза >1 часа). Решение: разделите трек на сегменты вручную.
  • 🌐 Неправильные координаты (например, 0,0). Удалите их в QGIS фильтром "x" != 0 AND "y" != 0.
<gx:altitudeMode>absolute</gx:altitudeMode>
-->

Оптимизация KML для Google Earth и Google Maps

Чтобы ваш KML-файл корректно отображался и быстро загружался, следуйте этим рекомендациям:

  • 🗺️ Упростите геометрию: Для треков длиной >1000 точек используйте упрощение (например, алгоритм Douglas-Peucker в QGIS). Это сократит размер файла без потери визуального качества.
  • 🎨 Настройте стили: Задайте прозрачность линий (<color>aabbggrr</color>, где aa — альфа-канал) и иконки для меток. Пример:
    <Style id="track">
    

    <LineStyle>

    <color>ff0000ff</color> <!-- Красный, непрозрачный -->

    <width>4</width>

    </LineStyle>

    </Style>

  • 📂 Разделите на слои: В одном KML-файле может быть несколько <Folder> для маршрута, точек интереса и фотографий.

Критическая особенность: Google Earth поддерживает KML версий 2.1 и 2.2, а Google Maps — только 2.2. Если ваш файл не открывается в Maps, проверьте версию в первой строке KML и замените на <kml xmlns="http://www.opengis.net/kml/2.2">.

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

💡

Для максимальной совместимости с Google Earth добавьте в KML тег <gx:altitudeMode>clampToGround</gx:altitudeMode>. Это прижмёт трек к рельефу, избегая "парения" над землёй.

FAQ: Частые вопросы о конвертации GPX в KML

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

Частично. При обратной конвертации теряются стили KML (цвета, иконки), но геометрия (координаты, высоты) и базовые атрибуты (названия точек) сохранятся. Для этого используйте GPS Babel с командой:

gpsbabel -i kml -f input.kml -o gpx -F output.gpx
Почему в Google Earth трек отображается криво, хотя в GPX он правильный?

Вероятная причина — несовпадение систем координат. GPX всегда использует WGS84 (EPSG:4326), а KML может интерпретировать координаты иначе. Откройте KML в текстовом редакторе и убедитесь, что нет тега <gx:coord> с преобразованными значениями. Если нужно, перепроецируйте данные в QGIS.

Как автоматизировать конвертацию для 100+ файлов?

Используйте скрипт на Python с библиотеками os и gpxpy:

import os

import gpxpy

import simplekml

for filename in os.listdir('gpx_folder'):

if filename.endswith('.gpx'):

with open(f'gpx_folder/{filename}', 'r') as f:

gpx = gpxpy.parse(f)

kml = simplekml.Kml()

# Логика конвертации (см. пример выше)

kml.save(f'kml_folder/{filename.replace(".gpx", ".kml")}')

Для ускорения обработки запускайте скрипт в multiprocessing или на сервере.

Какие метаданные из GPX переносятся в KML?

Стандартно переносятся:

  • 📍 Координаты (широта, долгота, высота).
  • ⏰ Временные метки (если конвертер их поддерживает).
  • 🏷️ Названия треков и точек (<name>).
  • 📝 Описания (<desc>).

Не переносятся:

  • 🔄 Данные из <extensions> (например, частота пульса).
  • 🎯 Специфичные для GPX теги вроде <hdop> (точность GPS).
Как добавить в KML свои иконки для меток?

Используйте тег <Icon> внутри <Style>. Пример для кастомной иконки:

<Style id="custom_icon">

<IconStyle>

<Icon>

<href>https://example.com/my_icon.png</href>

</Icon>

</IconStyle>

</Style>

Чтобы применить стиль к метке:

<Placemark>

<name>Моя метка</name>

<styleUrl>#custom_icon</styleUrl>

<Point><coordinates>-122.082,37.422</coordinates></Point>

</Placemark>