Формат 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 точек и сохраняет названия меток, описания и высоту. Следуйте алгоритму:
- Перейдите на сайт GPSVisualizer и выберите вкладку
Convert. - Загрузите KML-файл в поле
Input file. Если файл весит более 5 МБ, сожмите его в ZIP. - В разделе
Output formatвыберитеGPXи активируйте опции:- 🔹
Preserve track/route names(сохранит имена маршрутов). - 🔹
Include elevation data(если в KML есть высотные метки). - 🔹
Use GPX 1.1(для совместимости с Garmin).
- 🔹
Convert the file и дождитесь обработки (может занять до 2 минут для больших файлов).☑️ Проверка результата конвертации
Если в результате некоторые метки пропали, проверьте исходный KML на наличие вложенных папок (<Folder>). GPSVisualizer игнорирует папки глубиной более 2 уровней. Решение — предварительно "сплющить" структуру в Google Earth:
- Откройте KML в Google Earth.
- Щёлкните правой кнопкой по корневой папке и выберите
Свойства. - Вкладка
Стиль→Показать содержимое как модели→Применить ко всем вложенным папкам. - Сохраните файл заново.
- 📌 Координаты (широта, долгота, высота).
- ⏰ Временные метки (если есть тег
<TimeStamp>). - 🏷️ Имена меток (из атрибута
nameвPlacemark).
⚠️ Внимание: Если ваш 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())
Этот скрипт обрабатывает:
Для установки зависимостей выполните:
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 или добавьте вручную:
|
| Маршрут отображается "ступеньками" | Потеря высотных данных при конвертации | Проверьте, что в 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:
- Откройте файл в текстовом редакторе и найдите первую строку с
<trkpt. - Удалите всё до тега
<gpx(включительно). - Добавьте в начало корректный заголовок:
<?xml version="1.0" encoding="UTF-8"?><gpx version="1.1" creator="Manual Fix" xmlns="http://www.topografix.com/GPX/1/1">
- Сохраните с кодировкой
UTF-8.
Перед загрузкой GPX в навигатор проверьте его валидность на сайте GPSVisualizer Validator. Сервис покажет ошибки в структуре файла и предложит исправления.
Конвертация для специфических устройств: Garmin, OsmAnd, Suunto
Разные устройства предъявляют уникальные требования к GPX. Ниже — чек-лист для популярных брендов:
- 📱 OsmAnd:
- 🔹 Поддерживает GPX с треками (
<trk>) и маршрутами (<rte>). - 🔹 Максимальный размер файла — 50 МБ (иначе приложение крашится).
- 🔹 Для отображения высотного профиля требуется тег
<ele>в каждой точке.
- 🔹 Поддерживает GPX с треками (
- 🚴 Garmin Edge/Forerunner:
- 🔹 Только
GPX 1.1(1.0 не поддерживается). - 🔹 Ограничение на 200 точек в маршруте (
<rte>) и 10 000 в треке (<trk>). - 🔹 Для навигации по маршруту требуется тег
<rtept>с атрибутомsym="Waypoint".
- 🔹 Только
- ⛷️ Suunto:
- 🔹 Поддерживает только треки (
<trk>), маршруты игнорирует. - 🔹 Требует временные метки (
<time>) для корректного отображения скорости. - 🔹 Максимальная частота точек — 1 секунда (более частые данные будут прорежены).
- 🔹 Поддерживает только треки (
Для Garmin рекомендуется использовать BaseCamp для финальной проверки:
- Импортируйте GPX в BaseCamp.
- Проверьте, что маршрут отображается без разрывов (красные линии указывают на ошибки).
- Если есть проблемы, экспортируйте обратно в 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>. Используйте:
gpsbabelс флагом-x track,pack,interval=5s(интерполяция временных меток).- 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