Главная страница Russian | English


Хотите поддержать
проект?

Поддержите проект!

Формат растровых карт JNX


На этой странице:

  1. Файлы JNX службы BirdsEye
  2. Устройство файлов JNX
  3. Нетривиальное использование формата


Файлы JNX службы BirdsEye

Кратко о формате JNX

Файлы в формате JNX используются в устройствах Garmin для показа спутниковых карт, доступных через подписку BirdsEye. В навигаторах эти файлы располагаются в папке Garmin\BirdsEye на внутреннем диске или SD-карточке.
JNX - так называемый тайловый формат, то есть большое растровое изображение в карте разбито на меньшие прямоугольные части для ускорения показа навигатором.
Поддержка карт JNX имеется в следующих устройствах: Alpha 100, Astro 320, Colorado 300/400, Dakota 10/20, Edge 800, Etrex 20/30, GPSMAP 62/78, Montana 600/650, Oregon 200/300/400/450/550, Rino 610/650/655.

Существенным ограничением формата JNX является жесткая привязка карт к устройству.


Результаты исследования

Формат JNX почти полностью исследован (за исключением части блока служебных данных загрузчика, которой можно вполне пренебречь при создании собственных карт).
Разработан набор утилит как для преобразования растровых карт в формат JNX, так и для обратной конвертации.

Хотя файлы в формате JNX содержат код привязки к устройству, известны два способа использования собственных карт JNX в навигаторах Garmin.


Первый способ.
Можно пропатчить прошивку устройства таким образом, чтобы снять ограничение на количество показываемых демонстрационных карт и их площадь. Патчер можно скачать отсюда (последняя версия - 3.50 от 18.01.2017; список изменений, на английском; список поддерживаемых прошивок).


Второй способ.
Если у вас оформлена подписка BirdsEye, можно воспользоваться BaseCamp для активации собственных карт JNX. Для этого достаточно сделать карту одним из конвертеров, загрузить полученный файл JNX в устройство, затем запустить BaseCamp и скопировать карту с устройства в Коллекцию. После этого карту можно будет послать обратно на устройство, при этом BaseCamp активирует карту и привяжет её к устройству. Этот метод сработает только в том случае, если устройство связано с подпиской BirdsEye.


Инструменты.
Последние версии программы MAPC2MAPC поддерживают сохранение карт в формате JNX. Автор MAPC2MAPC также сделал программу mobat2jnx для преобразования сохраненных тайлов в формате OSMTracker Tile Storage (можно сделать в Mobile Atlas Creator) в JNX.

Кроме того, имеется работающий из командной строки конвертер map2jnx, основанный на GDAL, который можно использовать для преобразования файлов в формате GeoTIFF и других в карты JNX. Последняя версия конвертера устанавливается вместе с программой QLandkarte GT 1.6.0 и старше. Эта версия создает только JNX-карты версии 4 (см. ниже), поддерживающие порядок отрисовки, но требующие установки прошивок, выпущенных позже марта 2011 года.
Для скачивания также доступна версия 0.2.5 (использует пакет FWTools) и версия 0.2.3 (последняя, записывающая JNX-файлы версии 3).

Сохранение в формат JNX имеется в программе OkMap версии 9.7.0 и старше.
Экспорт в многоуровневые JNX реализован также в SAS.Планете, начиная с версии 120808.
Кроме того, поддержка сохранения в формат JNX была добавлена в 14 версии Global Mapper.

Важное замечание: прошивки, вышедшие в марте 2011 года (то есть, 2.93 для GPSMAP 62/78, 4.16 для Oregon, 4.45 для Oregon x50, и 4.01 для Dakota) и позже, совместимы только с картами, сделанными в MAPC2MAPC версии 445 и выше, mobat2jnx версии 1008 и выше, а также map2jnx версии 0.2.0 и выше. Карты, сделанные в предыдущих версиях этих программ в большинстве случаев вызывают зависание устройства при загрузке. Чтобы преобразовать старые карты JNX в совместимый с новыми прошивками формат, можно воспользоваться программой JNXFixer.

Для просмотра файлов JNX можно использовать QLandkarte GT версии 1.0.0 и старше.

Библиотека для работы с картами JNX на Delphi/FreePascal доступна здесь.
JNXLib была откомпилирована в виде DLL, которую можно использовать в проектах на MS Visual C++. Архив, содержащий 32х- и 64х- разрядные версии DLL, а также файлы для подключения к проектам на MSVC, находится здесь.

Некоторые другие инструменты перечислены в этом сообщении.


Форумы.
Основная англоязычная тема, посвященная исследованию формата, размещению ссылок на инструменты для преобразования в и из формата JNX и т.д, находится здесь.

Задать вопросы про JNX на русском языке и узнать основные новости о формате и инструментах можно здесь.

Неплохой ЧАВО по созданию карт JNX (при помощи GlobalMapper и MAPC2MAPC), на русском.
Более упорядоченный вариант того же ЧАВО, содержит инструкции по созданию карт при помощи SAS.Планеты.

А здесь пошаговая инструкция по преобразованию космоснимков, скачанных при помощи SAS.Planet, в JNX (используются GlobalMapper и map2jnx); также на русском.



Устройство файлов JNX

Внутренняя структура файлов JNX

Описание формата получено в результате экспериментов с файлами JNX, полученными от добровольцев.

Файл формата JNX можно условно разделить на 7 частей:
  1. заголовок;
  2. таблица с описанием уровней;
  3. служебная информация загрузчика карт;
  4. таблица с описанием тайлов;
  5. сигнатура;
  6. набор тайлов;
  7. метка конца файла.
Теперь подробнее остановимся на каждой из упомянутых частей.
Замечание 1: во всех двух и четырехбайтовых полях ниже используется "интеловский" порядок следования байтов, то есть сначала младшие байты, а потом старшие.
Замечание 2: во всех таблицах ниже, кроме описания заголовка, смещения указаны относительно начала файла, если не указано обратное. Смещения до сигнатуры, таблиц описания тайлов и изображений тайлов являются беззнаковыми 32х-битными целыми, и их значения могут выходить за пределы 2GB в очень больших JNX-файлах.
Замечание 3: тип CString означает последовательность символов переменной длины, завершающуюся нулевым символом.

1. Заголовок
Смещение от начала
заголовка
Тип поляОписание
0x00int32Версия формата JNX. В настоящее время имеется две версии формата JNX - 3 и 4.
0x04int32ID устройства, для которого делалась карта. В демонстрационных картах это поле нулевое.
0x084 int32Координаты, в которых рисуется карта. Описание системы координат см. ниже.
0x18int32Количество уровней детализации. Текущие версии прошивок загружают не более 5 уровней.
0x1Cint32Дата и время окончания подписки (судя по всему, это число секунд с 12:00 30 декабря 1989).
0 в демонстрационных картах, а также картах подписки BirdsEye Select Deutschland.
0x20int32Идентификатор подписки:
    0 - BirdsEye
    2 - BirdsEye Select EIRE
    3 - BirdsEye Select Deutschland
    4 - BirdsEye Select Great Britain
    5 - BirdsEye Select France
    6 - BirdsEye Select Kompass - Switzerland
    7 - BirdsEye Select Kompass - Austria + East Alps
    8 - USGS Quads (BirdsEye TOPO, U.S. and Canada)
    9 - NRC TopoRama (BirdsEye TOPO, U.S. and Canada)
Полный список поддерживаемых значений пока неизвестен.
0x24int32CRC32 координат тайлов (см. ниже). 0 в демонстрационных картах.
0x28int32Версия сигнатуры. Все не демонстрационные JNX содержат 0x00040001 в этом поле. 0 в демонстрационных картах.
0x2Cuint32Смещение до сигнатуры (см. 5. Сигнатура ниже). 0 в демонстрационных картах.
В картах JNX 4й версии имеется еще одно поле
0x30int32Z-порядок (или порядок отрисовки). Диапазон допустимых значений - от 0 до 100. Для карт JNX 3й версии в качестве значения порядка отрисовки используется 30.
Начиная с версий прошивок, выпущенных в марте 2011 года, устройства группируют карты по значению поля заголовка 0x20 (идентификатор подписки). Для того, чтобы предоставить пользователям возможность настраивать группировку карт, разработчикам конвертеров JNX рекомендуется разрешить пользователям выбирать, какое значение будет записываться в это поле при создании карт.

Те же версии прошивок вводят поддержку 4й версии формата JNX, позволяющей указывать порядок отрисовки карт JNX. Порядок отрисовки используюется таким же образом, как поле DrawOrder в картах Custom Maps. Поддержка карт 4й версии JNX доступна в BaseCamp версии 3.2 и выше.

О координатах, используемых в файлах JNX.
Координаты хранятся в виде знаковых 4х-байтовых целых чисел. Две пары чисел описывают координаты двух углов карты.
Первая пара - верхний правый (то есть северо-восточный) угол, вторая - нижний левый (юго-западный).
Первым значением в паре идет широта, вторым - долгота.
Для получения координат эти целые числа нужно разделить на 0x7fffffff, а потом умножить на 180.
Пример. Допустим, в файле указаны координаты 0x1FCD7932, 0x1ADEBDDA. После преобразования получаем координаты N 44°43'20.81", E 37°47'9.80".

Автор программы MAPC2MAPC предполагает, что в файлах JNX используется проекция Latitude/Longitude.

Эксперименты показывают, что демонстрационные карты могут отображать не более 1 кв. км. (приблизительно), в противном случае устройство откажется их загружать.

Вычисление CRC32 в заголовке.
Для вычисления значения поля CRC32 нужно последовательно пробежаться по описаниям всех тайлов карты, взять из них первые 2 координаты (т.е. первые 8 байтов для каждого тайла) и вычислить CRC32 для буфера, составленного из этих координат.

2. Таблица описания уровней
Эта таблица всегда находится сразу после заголовка файла.

Количество уровней детализации в заголовке определяет количество элементов этой таблицы.
Структура элементов:
Смещение от начала
таблицы
Тип поляОписание
0x00int32Количество тайлов на уровне. Это значение не должно превышать 50000.
0x04uint32Смещение до таблицы описания тайлов этого уровня.
0x08int32Значение масштаба для уровня. По предположению Дмитрия Склярова, в этом поле хранится выраженная в миллиметрах длина части экватора, соответствующей одной точке растра данного уровня. Подробнее см. тут.
В картах JNX 4й версии имеются дополнительные поля
0x0Cint32Неизвестно. Обчыно 2.
0x10CStringКопирайт уровня карты в кодировке UTF8. Выводится на странице О системе.

JNX-файлы, полученные по подписке BirdsEye, содержат уровни со значениями масштаба 0x12A95 (76437), 0x12A9 (4777), 0x4AA (1194), а также 0x255 (597).
В картах подписки BirdsEye Select Deutschland имеются масштабы 0x17D0 (6096), 0x12F1 (4849), 0x9C6 (2502).
В картах подписки BirdsEye Select Great Britain используются масштабы 0x387c (14460) и 0x05e5 (1509).

В таблице ниже приведены значения масштаба, начиная с которых уровни карт JNX показываются на том или ином уровне приближении в устройстве.
Строчка 80m - 209 означает, что при установке в устройстве приближения 80m будут показаны тайлы уровней со значениями масштабов 209 и больше.
Уровень приближения
(m, km)
Минимальное значение
масштаба JNX
5m14
8m21
12m32
20m52
30m79
50m131
80m209
120m313
200m521
300m782
500m1303
800m2084
1.2km3125
2km5209
3km7813
5km13021
8km20834
12km31250
20km52084
30km78125
50km130209
80km208334
120km312500
200km520834
300km781250
500km1302084
800km2083334
Уровень приближения
(yd, mi)
Минимальное значение
масштаба JNX
5yd 12
10yd 24
15yd 36
25yd 60
40yd 96
60yd 143
100yd239
150yd358
250yd596
0.2mi839
0.3mi1258
0.5mi2096
0.8mi3353
1.2mi5030
2mi 8383
3mi 12574
5mi 20956
8mi 33529
12mi 50293
20mi 83821
30mi 125731
50mi 209551
80mi 335281
120mi502921
200mi838202
300mi1257303
500mi2095504
Уровень приближения
(ft, nm)
Минимальное значение
масштаба JNX
20ft 16
30ft 24
50ft 40
80ft 64
120ft96
200ft159
300ft239
500ft397
800ft636
0.2nm965
0.3nm1447
0.5nm2412
0.8nm3859
1.2nm5788
2nm 9646
3nm 14469
5nm 24115
8nm 38584
12nm 57875
20nm 96458
30nm 144687
50nm 241145
80nm 385832
120nm578747
200nm964578
300nm1446867
500nm2411444

В том случае, если в прибор загружаются карты JNX с различными значениями масштабов, и тайлы уровней с различными масштабами оказываются одновременно видимыми, тайлы с бОльшими значениями масштаба отключаются.
Чтобы избежать взаимного отключения слоев карт разработчикам программ преобразования в JNX рекомендуется использовать следующие значения масштабов для соответствующих уровней: 75, 149, 298, 597, 1194, 2388, 4777, 9554, 19109, 38218, 76437, 152877, 305758, 611526, 1223072, 2446184 (этот набор представляет собой расширение стандартного списка значений, используемых в картах BirdsEye). Промежуточные значения предполагается заменять на ближайшее из этого набора.

3. Служебная информация загрузчика карт
Эта часть файла JNX не используется для отрисовки карты как таковой. Этот блок переменной длины состоит из списка URL'ов, с которых были получены тайлы, а также уникальный идентификатор карты и копирайты.

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

Начиная с версий прошивок, выпущенных в марте 2011 года, некоторые части этого блока необходимы для корректной загрузки карты и выводятся в меню настроек карты.

Ниже приводится неполное описание структуры блока. Перечислены только те части, которые необходимы для загрузки карт JNX.
Блок служебной информации загрузчика карт условно может быть разделен на следующие три подблока: Замечание для разработчиков JNX-конвертеров: так как пользователи время от времени хотят перемещать карты между различными группами, рекомендуется резервировать некоторое дополнительное пустое пространство (к примеру, 1024 байта) под блок служебной информации загрузчика при создании JNX-файлов. В этом случае становится возможным изменение названия группы карт в существующем файле без необходимости создания промежуточного файла и весьма медленного копирования этого файла обратно на устройство.

4. Таблица описания тайлов
Смещение от начала
таблицы
Тип поляОписание
0x004 int32Координаты отдельного тайла.
0x10int16Ширина изображения.
0x12int16Высота изображения.
0x14int32Размер изображения в байтах.
0x18uint32Смещение до изображения.


5. Сигнатура
Блок длиной 0x314 (788) байтов. Здесь хранится код привязки JNX к устройству.

Блок с сигнатурой обычно расположен между последним элементом в таблице описания тайлов и перед первым изображением тайла.
Состоит из небольшого заголовка и зашифрованной основной части.
Судя по всему, используется асимметричная схема шифрования, аналогичная той, что применяется в GMA-сертификатах карт (Garmin Map Activation), введенных в новых устройствах.
Сигнатура генерируется сервером на основании координат карты, числа уровней и ID'а устройства.

6. Набор тайлов
Тайлы представляют собой обычные рисунки в формате JPG, из которых выкушены маркеры SOI (то есть начальные два байта 0xFF, 0xD8).
Большая часть рисунков в картах BirdsEye имеют разрешение 256 на 256 пикселей. Поддерживаются рисунки и большего размера. Устройства способны показывать тайлы с размером до 1 мегапикселя, при выходе размеров за этот предел производится автоматическое уменьшение картинки с потерей качества.

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

7. Метка конца файла
Все файлы JNX завершаются строкой "BirdsEye" (0x42, 0x69, 0x72, 0x64, 0x73, 0x45, 0x79, 0x65 - в 16-ричном виде).



Нетривиальное использование формата

"Многотомные" карты

Хотя формат JNX допускает не более 50000 тайлов на каждом уровне, есть способ обхода этого ограничения, условно называющийся "многотомными" JNX.
Заключается он в том, что уровни с бОльшим количеством тайлов сохраняются в отдельных файлах, уровни которых содержат не более 50000 тайлов. Координаты в заголовках каждого файла при этом соответствуют реальным координатам сохраненных в них тайлов.

Пример. Допустим, требуется записать в файл формата JNX 3х-уровневую карту, на первом уровне которой 10000 тайлов, на втором - 40000, а на третьем - 160000 тайлов. В этом случае создается 4 файла: 3х-уровневый с 10000 тайлами на первом уровне, 40000 тайлами на втором и 50000 на третьем; и три одноуровневых - два по 50000 тайлов, и еще один с оставшимися 10000 тайлами.

Насколько известно автору, создание многотомных карт пока поддерживается только в программе SAS.Планета.

Нижнее ограничение на видимость уровня

В картах JNX имеется только верхнее ограничение на уровни приближения, при которых показывается тот или иной уровень карты. Скажем, если в заголовке уровня JNX прописано значение масштаба 76437, то тайлы этого уровня будут показываться при зумах от 20км до 5м. А вот возможности явно указать, что уровень должен отключаться, скажем, при достижении приближения в 1,2 км (то есть задать нижнее ограничение), форматом не предусматривается.
Однако есть неявный способ введения подобного ограничения, предложенный пользователем aabbcc форума gpsunderground.

Чтобы отключить карту ниже некоторого приближения, требуется создать в карте еще один слой с нужным значением масштаба (для зума 1,2км это будет 4777), содержащий единственный тайл с координатами, не пересекающимися с координатами карты.
Естественно, карта, в которую добавляется новый ограничивающий уровень, может содержать не более четырех обычных уровней.

В качестве изображения тайла может быть использована однопиксельная картинка, либо можно записать в файл ссылку на первый тайл из первого уровня карты.

Координаты можно взять равными, скажем, 90N, 180E - это предпочтительный вариант, однако для него потребуется доделка имеющихся на сегодняшний день конвертеров. А можно просто использовать в качестве координат тайла координаты одного из углов карты - такой способ можно применять даже с доступными сейчас программами.

Насколько известно автору, добавление ограничения видимости реализовано только в программе SAS.Планета.


Обе описанные выше техники являются экспериментальными.
Взаимодействие многотомных карт и карт с нижними ограничениями с соседними картами не исследовалось.




Пока всё.
Если у вас есть комментарии или дополнения по формату JNX, напишите, пожалуйста, автору.



Last modification: 21 Dec 2016
Яндекс.Метрика