Формат KML (Keyhole Markup Language) широко используется в Google Earth и Google Maps для хранения геопространственных данных, но когда речь заходит о навигационных устройствах или специализированных программах вроде Garmin BaseCamp, OsmAnd или Locus Map, требуется формат GPX (GPS Exchange Format). Разница между ними не только в синтаксисе, но и в поддержке меток, треков и маршрутов: GPX оптимизирован для обмена данными между GPS-приёмниками, в то время как KML больше ориентирован на визуализацию.
Проблема в том, что прямая конвертация часто приводит к потере данных: исчезают высотные метки, временные штампы или атрибуты точек. Например, при переносе маршрута из Google My Maps в навигатор Garmin Edge может пропасть информация о скорости или сердечном ритме, если она была привязана к треку. В этой статье разберём как избежать типичных ошибок при конвертации KML в GPX, включая сохранение всех атрибутов и работу с большими файлами (более 10 000 точек).
Чем отличаются KML и GPX: когда нужна конвертация
Формат KML разработан компанией Keyhole Inc. (позже приобретённой Google) и поддерживает сложные геометрические объекты: многоугольники, 3D-модели, стили отображения и даже HTML-подсказки. Это делает его идеальным для создания интерактивных карт, но избыточным для GPS-навигаторов. GPX, в свою очередь, — это стандарт XML, предназначенный для обмена данными между устройствами: он содержит только координаты, высоту, время и базовые метаданные.
Конвертация требуется в следующих случаях:
- 🗺️ Перенос маршрутов из Google Maps или Google Earth в навигаторы Garmin, Magellan или приложения вроде OsmAnd.
- 🏔️ Экспорт треков с сервисов планирования походов (например, AllTrails или Komoot) для использования в офлайн-навигации.
- 🚴 Подготовка данных для спортивных трекеров (Strava, Suunto), которые не поддерживают KML.
- 📊 Анализ геоданных в программах вроде QGIS, где GPX обрабатывается быстрее из-за меньшего объёма.
Ключевое отличие — обработка <Placemark> (в KML) и <wpt>/<trkpt> (в GPX). Например, в KML одна метка может содержать описание на HTML, изображение и стиль отображения, тогда как в GPX та же метка будет представлена только координатами и кратким названием. Это означает, что при конвертации часть данных неизбежно теряется, если не использовать специализированные инструменты.
⚠️ Внимание: Если ваш KML-файл содержит <MultiGeometry> (например, сложные полигоны), большинство онлайн-конвертеров преобразуют их в набор точек без связей, что делает GPX-файл непригодным для навигации. В таких случаях требуется ручная доработка или использование QGIS.
Топ-5 онлайн-конвертеров KML в GPX: плюсы и минусы
Онлайн-сервисы удобны для разовых задач, но имеют ограничения по размеру файла (обычно до 10 МБ) и не всегда сохраняют все метаданные. Ниже — сравнение популярных инструментов с учётом поддержки атрибутов и скорости работы.
| Сервис | Макс. размер файла | Сохранение высоты | Сохранение времени | Поддержка сложных объектов |
|---|---|---|---|---|
| GPS Visualizer | 50 МБ | ✅ | ✅ | ❌ (упрощает геометрию) |
| GPSies | 10 МБ | ✅ | ❌ | ❌ |
| MyGeodata | 200 МБ (платно) | ✅ | ✅ | ⚠️ (частично) |
| OgreTools | 5 МБ | ✅ | ✅ | ❌ |
| KML2GPX | 2 МБ | ❌ | ❌ | ❌ |
Для большинства задач оптимален GPS Visualizer: он бесплатен, поддерживает пакетную обработку и позволяет настраивать выходной формат (например, разбивать длинные треки на сегменты). Однако если ваш файл содержит временные метки, проверьте результат в GPX-валидаторе (например, на сайте TopoGrafix), так как некоторые сервисы округляют время до секунд.
- GPS Visualizer
- MyGeodata
- OgreTools
- Другой
- Не конвертирую
Офлайн-конвертация: программы для Windows, macOS и Linux
Если вы работаете с конфиденциальными данными или нуждаетесь в регулярной конвертации, офлайн-программы предотвращают утечки и предлагают больше настроек. Рассмотрим лучшие решения для разных платформ.
Для Windows:
- 🖥️ GPSBabel — кроссплатформенный инструмент с поддержкой более 100 форматов. Командная строка позволяет автоматизировать процесс:
gpsbabel -i kml -f input.kml -o gpx -F output.gpxЧтобы сохранить высоту и время, добавьте флаг
--track. - 🗂️ QGIS — профессиональная GIS-платформа, которая позволяет редактировать данные перед конвертацией. Подходит для сложных KML с полигонами.
Для macOS:
- 🍎 GPS Babel GUI — оболочка для GPSBabel с графическим интерфейсом. Позволяет выбирать, какие данные сохранять (например, только треки или только метки).
- 📊 Merkaartor — редактор OpenStreetMap, который умеет экспортировать KML в GPX с сохранением всех атрибутов.
Для Linux:
- 🐧 GPSBabel (из репозиториев) + скрипт для пакетной обработки:
for file in *.kml; dogpsbabel -i kml -f "$file" -o gpx -F "${file%.kml}.gpx"
done
- 🌍 GRASS GIS — для продвинутых пользователей, нуждающихся в анализе данных перед конвертацией.
⚠️ Внимание: При использовании GPSBabel для файлов с кириллическими названиями меток добавьте флаг-c utf8, иначе символы превратятся в кракозябры. Пример:gpsbabel -i kml -f "маршрут.kml" -o gpx -F "маршрут.gpx" -c utf8
Установите GPSBabel с официального сайта|Проверьте кодировку исходного файла (UTF-8)|Создайте резервную копию KML|Настройте параметры вывода (--track или --route)-->
Конвертация с сохранением всех данных: временные метки, высота, атрибуты
Стандартные конвертеры часто игнорируют дополнительные поля в KML, такие как <ExtendedData> (где могут храниться скорость, температура или пользовательские метки). Чтобы перенести их в GPX, потребуется:
- Использовать XSLT-преобразование: создать шаблон, который маппирует поля KML в теги GPX. Пример для переноса высоты:
<xsl:template match="kml:coordinates"><gpx:ele><xsl:value-of select="substring-before(substring-after(.,','),',')"/></gpx:ele>
</xsl:template>
Для автоматизации подойдёт Oxygen XML Editor или бесплатный XML Copy Editor.
- Применить Python-скрипт с библиотекой
lxml:from lxml import etreekml = etree.parse('input.kml')
gpx = etree.Element('gpx', version='1.1')
# Далее парсинг координат и атрибутов
etree.ElementTree(gpx).write('output.gpx', pretty_print=True)
Полный скрипт можно найти на GitHub (поиск по запросу "kml to gpx extended data").
Если в KML есть временные метки в формате <TimeStamp> или <TimeSpan>, их нужно преобразовать в <time> в GPX. Например:
<trkpt lat="55.75" lon="37.61">
<ele>150</ele>
<time>2026-05-20T14:30:00Z</time>
</trkpt>
Для проверки корректности временных меток используйте валидатор Epoch Converter. Он покажет, правильно ли распознано время в UTC.
Ошибки конвертации и как их исправить
Даже с лучшими инструментами результат может содержать ошибки. Рассмотрим типичные проблемы и способы их решения:
1. Пропущенные координаты или "дыры" в треке
- 🔍 Причина: В KML координаты могут быть записаны в формате
лон,лат,высота, а конвертер ожидаетлат,лон. - 🛠️ Решение: Откройте KML в текстовом редакторе и проверьте формат. При необходимости поменяйте местами широту и долготу с помощью
sed:sed 's/\([^,]*,\([^,]*\),\([^ ]*\)/\2,\1,\3/g' input.kml > fixed.kml
2. Неправильная кодировка (кракозябры вместо кириллицы)
- 🔍 Причина: KML сохранён в
Windows-1251, а GPX ожидаетUTF-8. - 🛠️ Решение: Конвертируйте файл с помощью
iconv:iconv -f WINDOWS-1251 -t UTF-8 input.kml > output.kml
3. Потеря высоты (элемент <ele> пустой)
- 🔍 Причина: В KML высота указана как
0или отсутствует. - 🛠️ Решение: Воспользуйтесь сервисом GPS Visualizer с опцией "Add elevations" (он подтянет высоты из Google Maps API).
4. GPX не открывается в навигаторе
- 🔍 Причина: Несоответствие версии GPX (например, навигатор поддерживает только
GPX 1.0, а вы экспортировали в1.1). - 🛠️ Решение: Укажите версию явно в GPSBabel:
gpsbabel -i kml -f input.kml -o gpx,gpxver=1.0 -F output.gpx
Что делать, если GPX-файл слишком большой?
Если файл превышает лимит навигатора (например, 20 000 точек для Garmin), разбейте его с помощью GPX Editor или команды:
gpsbabel -i gpx -f large.gpx -o gpx -F "part_%n.gpx" --split=20000
Это создаст несколько файлов по 20 000 точек каждый.
Автоматизация конвертации: скрипты и API
Если вам регулярно приходится конвертировать KML в GPX (например, для обработки данных с дронов или геодезических приборов), ручные методы неэффективны. Автоматизировать процесс можно следующими способами:
1. Bash-скрипт для пакетной обработки
Создайте файл convert.sh:
#!/bin/bash
for file in *.kml; do
gpsbabel -i kml -f "$file" -o gpx -F "${file%.kml}.gpx" --track
done
Сделайте его исполняемым (chmod +x convert.sh) и запускайте в папке с KML-файлами.
2. Python + библиотека pykml
Установите зависимости:
pip install pykml gpxpy
Затем используйте скрипт:
from pykml import parser
import gpxpy.gpx
with open('input.kml') as f:
doc = parser.parse(f).getroot()
gpx = gpxpy.gpx.GPX()
# Далее парсинг координат и создание GPX-объектов
with open('output.gpx', 'w') as f:
f.write(gpx.to_xml())
3. Облачные функции (AWS Lambda, Google Cloud Functions)
Если файлы хранятся в облаке, можно настроить триггер на загрузку KML в Google Drive или S3, который автоматически генерирует GPX. Пример для AWS Lambda:
const AWS = require('aws-sdk');
const { parseString } = require('xml2js');
const { buildGPX } = require('gpx-builder');
exports.handler = async (event) => {
const s3 = new AWS.S3();
const kmlData = await s3.getObject({ Bucket: event.bucket, Key: event.key }).promise();
// Парсинг KML и генерация GPX
await s3.putObject({ Bucket: 'output-bucket', Key: 'output.gpx', Body: gpx }).promise();
};
Для автоматизации выбирайте инструменты с поддержкой API: GPS Visualizer и MyGeodata позволяют интегрировать конвертацию в свои приложения через HTTP-запросы.
Конвертация KML в GPX на мобильных устройствах
Если вам нужно срочно преобразовать файл в полевых условиях (например, скачанный маршрут из Google My Maps), используйте мобильные приложения. Они менее функциональны, чем десктопные решения, но справляются с базовыми задачами.
Для Android:
- 📱 GPX Viewer — импортирует KML из облака или локального хранилища, экспортирует в GPX с сохранением высоты.
- 🗺️ OsmAnd — поддерживает прямую загрузку KML, но для экспорта в GPX потребуется плагин "Export".
Для iOS:
- 🍏 Gaia GPS — конвертирует KML в GPX прямо в приложении, но требует подписки для работы с большими файлами.
- 📲 GPS Kit — позволяет редактировать метки перед экспортом.
Ограничения мобильных приложений:
- ❌ Нет поддержки
<ExtendedData>. - ❌ Максимальный размер файла — обычно 5–10 МБ.
- ❌ Нет точной настройки выходного формата (например, выбора версии GPX).
⚠️ Внимание: При использовании OsmAnd для конвертации проверьте настройки экспорта: по умолчанию приложение может округлять координаты до 5 знаков после запятой, что снижает точность до ~1 метра. Включите опцию "High precision" в меню экспорта.
FAQ: Частые вопросы о конвертации KML в GPX
Можно ли конвертировать KML в GPX без потери данных?
Полностью избежать потерь невозможно, так как форматы имеют разную структуру. Однако с помощью XSLT или Python-скриптов можно перенести до 90% данных, включая пользовательские атрибуты. Главное — проверить результат в валидаторе GPX.
Почему после конвертации трек в GPX стал "рваным"?
Это происходит из-за разного порядка точек в KML и GPX или пропущенных координат. Используйте QGIS для визуальной проверки исходного KML: если трек уже "рваный" там, проблема в исходных данных. Если нет — повторите конвертацию с флагом --track в GPSBabel.
Как конвертировать KML с полигонами в GPX?
GPX не поддерживает полигоны напрямую, но их можно преобразовать в набор точек (waypoints) или маршрут (route). В QGIS экспортируйте полигон как LineString, а затем конвертируйте в GPX. Альтернатива — использовать MyGeodata с опцией "Convert polygons to lines".
Мой навигатор не видит GPX-файл. В чём дело?
Проблема может быть в:
- Неправильной версии GPX (попробуйте
1.0вместо1.1). - Несоответствии кодировки (преобразуйте в
UTF-8). - Слишком большом размере файла (разбейте его на части).
- Неправильном пути сохранения (например, Garmin требует размещать GPX в папке
/Garmin/GPX/).
Можно ли конвертировать GPX обратно в KML?
Да, но с теми же ограничениями: потеря стилей, упрощение геометрии. Для обратной конвертации используйте те же инструменты (GPSBabel, GPS Visualizer), но учитывайте, что KML не поддерживает некоторые GPX-теги, например <hr> (сердечный ритм) или <cad> (каденс).