Форматы навигационных файлов

Какие форматы маршрутов используют навигаторы и картографические сервисы?

Нарисовал я как-то маршрут очередного похода на Яндекс.Карте и захотелось перенести его в телефон. Оказалось, что мой любимый навигатор Androzic принимает маршруты только в формате rt2. Сначала я попробовал найти описание формата в интернете, но безуспешно, поэтому решил изучать самостоятельно. Открыв один из таких маршрутов в блокноте, сначала показалось, что разобраться в этой куче цифр и символов невозможно: слишком много цифр и ни одного значащего слова или намёка на комментарий. Но опытным путём сначала удалось постичь тайны формата rt2, а затем многих других навигационных форматов. Спустя некоторое время у меня получился достаточно обширный список с описанием форматов навигационных файлов и ссылок сервисов Яндекс и Wikimapia.

Итак, сначала немного общей информации. Маршрут любой длины состоит из точек на местности, пройдя через которые, путник попадает к цели путешествия. То есть в файле маршрута надо хранить географические координаты каждой точки. Или не обязательно? Правильно, можно задать абсолютные координаты только первой точки, а остальные координаты записывать как смещения относительно начальной точки. Зачем так сложно? Для сжатия данных. Например, когда строится маршрут с помощью обычной линейки Яндекс.Карт, все данные о координатах точек хранятся в URL (поэтому маршрутом можно легко поделиться), а длина URL ограничена. Вот в таких и подобных случаях применяются различные способы сократить общий размер списка точек. Ещё один способ сжатия данных — кодиравние с помощью алгоритма Base64 и подобных ему, но это ещё более трудный способ. Начнём с простого.

Форматы списка точек, разработанные для программы OziExplorer

Формат RT2

Формат маршрута OziExplorer

H1,OziExplorer CE Route2 File Version 1.0
H2,WGS 84
H3,<название маршрута>,,<цвет>
W,<Имя точки>,<широта>,<долгота>,<высота*>

Цвет маршрута задаётся в целочисленном формате. Например "-65536" - красный цвет. Высота точки указывается в футах над уровнем моря. Если вместо значение высоты написать "-777", то это значит, что высота точки неизвестна. Во второй строчке указывается информация об используемом в файле эллипсоиде, обычно это WGS 84.

Фомат WPT

Список путевых точек OziExplorer. Формат во многом похож на RT2, но рассчитан на хранение подробной информации о каждой точке.

OziExplorer Waypoint File Version 1.1
WGS 84
0,,,0
Reserved 3
<номер точки>,<Имя точки>,<широта>,<долгота>,<время>,<>,<>,<>,<>,<65535>,<описание>,<0>,<0>,<сходное расстояние>,<высота в футах>,<параметры отображения>

Время указывается в формате OADate и в нулевом часовом поясе. Этот формат используется для хранения подробной информации об остановках на маршруте. Для этого так много зарезервированных разделов, которые могут не использоваться.

Формат PLT

Список точек OziExplorer, обычно используемый при экспорте GPS трека из записывающих программ.

OziExplorer Track Point File Version 2.0
WGS 84
Altitude is in Feet
Reserved 3
0,1,<цвет трека>,<название>,0
<количество точек в файле>
<широта>,<долгота>,<код точки*>,<высота**>,<время***>

Код точки — значение 0, если это обычная точка или 1, если после точки трек временно прерывается. Шестая строка должна содержать количество точек в файле, но очень часто там стоит просто 0. Это не ошибка, так как количество точек можно легко определить по длине файла. Время точки в формате OADate и нулевом часовом поясе. Указание высоты аналогично формату RT2.

Формат RTE

Этот формат немного сложнее предыдущих. Он предназначен для хранения в одном файле нескольких маршрутов.

OziExplorer Route File Version 1.0
WGS 84
Reserved 1
Reserved 2
<тип строки>,<информация>

Возможные типы строки:
R (заголовок маршрута) или W (очередная путевая точка в маршруте, заголовок которого был выше)

Формат информации:
Для строки заголовка маршрута (R):
<номер маршрута>,<имя маршрута>,<описание маршрута>,<цвет маршрута>
Для строки описания точки маршрута (W):
<номер маршрута>,<номер точки в маршруте>,<имя точки>,<описание точки>,<широта>,<долгота>,<время OADate>,<>,<>,<>,<>,<65535>,<описание>,<0>,<0>,<сходное расстояние>,<высота в футах>

XML форматы файлов

Кроме простых текстовых форматов существует несколько типов, основанных на XML. Обычно это форматы описания не только маршрутов, а вообще геометрических объектов в пространстве. Примерами таких форматов могут служить KML (KMZ), разработанный Google и формат OSM, разработанный Open Street Maps для передачи информации об объектах.
Подробно останавливаться на этих форматах не буду, есть описания на соответствующих сайтах:
https://wiki.openstreetmap.org/wiki/OSM_XML
https://developers.google.com/kml/documentation/kml_tut?hl=ru

Ещё есть формат GPX, описание которого можно найти даже на Википедии:
https://ru.wikipedia.org/wiki/GPX

В этой части постараюсь объяснить, как составляются ссылки для картографических сервисов Яндекса и Wikimapia. У них у обоих есть инструмент "Линейка", вот о нём и пойдёт речь. При добавлении очередной точки в маршрут на карте в браузере, в адресной строке добавляются координаты новой точки. Для каждого из сервисов это происходит по разным алгоритмам.

Начнём с Яндекса. В ссылке хранится достаточно много ненужной нам информации о центре карты, открытых окнах и прочем. Нас интересует параметр rl, отвечающий за хранение координат вершин ломаной. Его значение имеет примерно такой формат:

долгота0%2Cширота0~приращение долготы1%2Cприращение широты1~приращение долготы2%2Cприращение широты2

Разные точки отделяются друг от друга символом "~", а широта и долгота — символом "%2C", что означает ",". Координаты первой точки являются базовыми для всех остальных. Чтобы получить координаты второй точки, надо к координатам первой точки прибавить смещение (следующая пара). Дальше смещение прибавляется к предыдущей точке.

Центр карты устанавливается с помощью параметра ll.


Сайт wikimapia.org отличился ещё большей изобретательностью. Здесь за информацию о точках отвечает параметр gz. Параметр представляет собой список чисел, разделённых ";". Первым числом идёт 0. Следующие два числа — координаты базовой точки, округлённые до шести знаков после запятой и умноженные на 1000000. Координаты базовой точки выбираются как минимальные широта и долгота точек маршрута. Эти координаты не обязательно совпадают с какой-либо точкой в списке.

Остальные числа — значения, которые надо прибавлять к базовой точке, чтобы получить очередную точку маршрута. Аналогично базовым координатам, полученное значение надо разделить на 1000000 для получения координаты в градусах. Список точек делится на пары, первое число в паре — это приращение долготы, а второе — приращение широты.

Центр карты устанавливается с помощью параметров lat и lon.