Создание карты под Garmin своими руками

Всем доброго времени. Буду потихоньку (по мере сил и возможности) пилить здесь разные гайды по созданию карт для навигаторов Garmin своими руками. Зачем? А прост. Картографическое покрытие нашей необъятной оставляет желать лучшего. Нормально расчерчены только районы близ городов и дорожная сетка. Причем этим грешат как коммерческие карты (Дороги России), так и открытые (OSM). Вторая причина - бывает очень нужно набросать карту определенного объекта, отсутствующий на карте, вплоть до зелени и зданий в нормальном разрешении. Ну, вы поняли.
Итак, почему Garmin? Нет, я не являюсь рекламным агентом компании, если что. Первое и самое важное - формат карт был раскрыт в далеких двухтысячных путем реверс-инженеринга. Следом были написаны бесплатные и не только компиляторы карт в этот формат. Нормально начерченную и скомпилированную карту прибор съест с вероятностью в 100%. Второе - хоть Garmin является достаточно бронебойным и водонепроницаемым девайсом, да и стОит соотвтетственно, но мы не ищем новую дорогую модель. Можно взять старенький аппарат на вторичном рынке за совсем недорого. Он нас порадует долгой автономной работой от двух пальчиковых полуторавольтовых элементов и тормозами при отрисовке, надежностью, а главное и неоспоримое преимущество - можно закачивать собственноручно сделанные карты или дополнять существующие. А еще ему не нужен интернет. Потихоньку буду стараться объяснять простым языком, как и что работает, и по возможности редактировать свои посты. Авось кому пригодится.
 
Часть 0. Введение.

Для любителей немного почитать - добро пожаловать!

Как это было и с чего началось.

Говоря о гражданских навигаторах, компактные аппараты данной фирмы появились на рынке приблизительно в середине двухтысячных. Тогда они имели совсем немного памяти, да и картография под них была достаточно скудновата. А незадолго до этого произошла отмена введения искусственной погрешности в сам GPS-сигнал, что сделало доступным точную навигацию для гражданского применения. Точность определения координат сделала скачок на целый порядок. Вот тогда и понадобилась точная картография. Люди были полны энтузиазма, и началось...
Как я уже говорил выше, формат раскрыли путем "обратной разработки", буквально разбирая побайтно карты, содержащиеся в приборе. В конечном итоге все это вылилось в документ, называющийся "Garmin IMG format description". А с появлением GisRussa и Navitel появился и первый простой в использовании редактор карт, прикрутивший себе возможность создавать собственные карты под Garmin. Но все было не так просто, как кажется на первый взгляд. Редактор позволял создавать только исходные данные для карт. У Garmin-а был свой двоичный формат, требовалась сторонняя программа для конвертации. И тут рождается компилятор cgpsmapper со своим "польским" форматом (polish format) на входе, который и был добавлен в выше описанный редактор gpsmapedit. Но разработчики компилятора хотели денег, а потому выпустили разные версии компиляторов. Бесплатная версия позволяла просто конвертировать исходную картографическую информацию в формат Garmin. Фактически, аппарат показывал только карту, возможности поиска объектов и прокладки маршрутов (расскажу ниже) по дорогам отсутствовали. Впрочем, людей занимавшихся туризмом и прочим бездорожьем это нисколько не беспокоило, и в таком виде компилятор использовался очень долго. Конечно, умельцы снимали ограничения с компилятора путем обратной разборки, но выходили новые версии с добавлением новых функций, усиливалась защита, которая опять ломалась (а зачастую туда еще встраивалось что-то вредоносное) и так далее.
Немного стОит сказать и о редакторе. Он тоже был условно бесплатным, но картографическую основу создать позволял. Возможность подгружать спутниковые тайлы с серверов гугла была платной, но тогда это был настоящий прорыв в создании собственных карт. Можно было, не бегая с навигатором, не отмечая точки / пути с домами, улицами, лесами и другими объектами, просто обрисовывать их контуры. Редактор тоже взламывался, но часто не очень успешно, многое работало достаточно криво. Достать спутниковый снимок, привязанный к координатам, было достаточно нетривиальной задачей. Но, благо, те времена прошли, и мы имеем открытые бесплатные наборы программного обеспечения, о котором речь пойдет ниже. Да, зачастую некоторые из применяемых программ очень древние, но они выполняют поставленные задачи на 100% не хуже своих профессиональных собратьев. Описанное ниже ПО будет узкоспециализированным, но простым и понятным в обращении. Потому, дабы не нагружать читателя ненужными в профессиональном ПО функциями (которых для наших задач ну чересчур много), буду расписывать только самое необходимое.
 
Часть 1. Из чего состоит карта?

Здесь все очень просто. Любая карта состоит из трех типов объектов, привязанных к координатам. В любых картографических программах они зовутся POI, Polyline, Polygon. По нашему POI (Point of interest) - это просто точка. Это может быть название города на обзорной карте, номер дома, расположение залаза, отдельно стоящее дерево в качестве ориентира. То есть точка, нанесенная на карту, имеющая название.
Polyline - ломаная линия. В нашем случае это дорога, тропинка, ЖД полотно, автотрасса и так далее.
Polygon - с точки зрения геомерии - многоугольник, объект, занимающий определенную площадь на карте. Проще говоря, это может быть болото, озеро, лес и так далее. Как мы можем понять, самый простой тип полигона - треугольник.
У всех объектов есть координаты. В случае точки - это обычные координаты, нам привычные - широта / долгота. В случае полилинии - координаты точек изгибов. То есть, есть начало, далее - где линия меняет направление (поворот) и конечная точка. В случае полигона - коодинаты всех точек нашего многоугольника. Как вы поняли, они занимают больше всего места в памяти устройства.
Точки, линии и полигоны имеют свои типы. Нам же нужно как-то отличать грунтовку от автомагистрали, либо лес от озера, вот потому каждому объекту на карте присваивается свой тип, дабы он наглядно вырисовывался на нашем экране.
 
Уровни детализации.

Здесь один из важных моментов, что зачастую приводит к ошибкам при разработке цифровых карт начинающими. Это уровни детализации. Взглянем на картинку:

Здесь в качестве примера взята Республика Адыгея. Красным в каждом углу подписан уровень детализации при приближении карты. Если говорить проще, карта состоит из "слоев", располагающихся друг над другом, от менее подробного к более подробному. То же самое, когда мы берем карты ГШ и рассматриваем масштабы, начиная с 10-километровки, переходя к двух-, однокилометровке и так до 250-метровки.
Level0, он же нулевой уровень - самый подробный слой карты. На нем рисуются здания, отдельно стоящие объекты и прочее. В нашем случае рисование обычно начинается с него. Это самый сложный и затратный по времени уровень, так как на нем обозначается абсолютно все. Далее - уровень 1. На него обычно выносятся самые крупные объекты на ваше усмотрение. В редакторе, речь о котором пойдет ниже, не нужно заново перерисовывать их с нулевого слоя, достаточно просто "расширить" самые крупные из объектов до уровня 1 в пару кликов. На уровнях выше рисуют просто контура, территории, скопления зелени и прочее, здесь уже все гораздо проще. Важный момент - создаваемая карта должна иметь те же уровни детализации, что и ваша основная. Если вы рисуете в основной карте, не забывайте переключать уровни. Может возникнуть случай, когда у вас на уровнях 1 и выше возникают мелкие объекты и отдельно стоящие ориентиры, а при приближении карты они исчезают (как пример, такое может получиться, если мы нарисуем объекты на уровне 1 по ошибке, а нулевой слой останется пустым. Но это поравимо.). Второй момент - ваша карта находится по соседству с основной, либо располагается поверх основной карты. При разных уровнях детализации навигатор не будет понимать, на какую карту ему ориентироваться. На практике это выражается на пропадании одной из карт с экрана, либо видимой только в определенном масштабе. Потому и обязательно, чтобы уровни обеих карт совпадали (дальше опишу, как это просто сделать). Уровни детализации обычно добываются из основной карты и прописываются в нашу карту.
 
Здесь хотелось бы сделать небольшое отступление. Разумеется, Гармину не нравилось, что формат стал открытым, и любой желающий мог дорисовать карту. Потому стали вводиться меры противодействия. Формат стал плавно мигрировать в сторону закрытия. Карты старого типа принято называть non-NT (не-NT, NT означает "New Technology".). Сначала появился так называемый pseudo-NT, который по началу тоже худо-бедно начали потрошить, его поддержка попала в единственную версию компилятора cgpsmapper 0.85 (И что самое интересное, из последующих версий была убрана). Сложно сказать, что произошло, возможно Гарминовцы погрозили пальцем. Затем появился новый формат карт - NT. В текущий момент открыть его для редактирования невозможно. Но поддержка старых форматов так и осталась в навигаторах, что и сыграло на руку. Были попытки реверсить и NT формат (а отличался он только заголовками и методом хранения данных), но в достояние общественности это так и не пошло, да и не нужно было особо, по-хорошему. Потому в открытых проектах и используются карты non-NT типа. Есть еще и морские карты, имеющие собственный формат - серии Bluechart и прочие, но здесь рассматриваться не будут за ненадобностью. Все карты и компиляторы, которые мы будем использовать, будут non-NT типа, как свободные для редактирования и понятные всем устройствам Garmin.
 
Часть 2. Добываем спутниковый снимок нужной нам местности.

Итак, первое, что необходимо для создания карты - нам нужно добыть спутниковый снимок, привязанный к координатам местности. По нему мы и будем создавать нашу будущую карту. Для этого мы и используем уже появлявшуюся на форуме программу SASPlanet. Программу берем отсюда. Поначалу она у нас не запустится и будет ругаться на отсутствие источников карт. Для добавления источников карт в программу скачиваем файл отсюда и кидаем распакованную папку из архива в папку с нашей программой. Затем запускаем саму SASPlanet.

Первое, что неоходимо сделать - выбрать источник изображений из списка, как показано на картинке ниже. В качестве примера я выбрал Google Hybrid RU HD. Место - тоже. Также рекомендуется провести эксперименты со спутниковыми снимками яндекса, качество бывает получше.



Затем ищем нужный нам участок, приближая карту. Определяем уровень наилучшей детализации. По этому снимку мы и будем рисовать нашу карту, а если быть точнее - обводить.



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



На рисунке выше снимки в масштабе z16. Область, что мы обвели, мы будем загружать в z19. Как только процесс закончится, все тайлы окажутся в кэше SASPlanet. Теперь нам нужно все эти тайлы в z19 склеить в один файл, плюс создать файл геопривязки. Это файл .map. Проделываем операции, как на картинке ниже:



Что такое файл .map? Это файл, идущий в комплекте к нашей склеенной из тайлов картинки. В нем описано несколько точек - соответствия точки на картинке (пикселя) его координатам широты / долготы (в картографии этот процесс называется Georeferencing). Для чего это нужно? Представим себе простую ситуацию: у нас есть снимок местности (снятый под углом 90 градусов к поверхности, ориентированный строго на север, привожу для простоты). Нам известны координаты, к примеру, верхнего левого угла картинки, и правого нижнего угла. Имея эти координаты диагональных углов, мы с легкостью определяем координаты двух других углов. У левого нижнего угла будет та же самая долгота, что у левого верхнего. У правого верхнего будет та же долгота, что и у правого нижнего угла. Аналогично и с широтой. Теперь мы имеем 4 точки с фиксированными координатами. Положение внутри этих четырех точек легко определяется пропорциями расстояниий по отношению к другим точкам. Отсюда и следует вывод - если мы знаем координаты углов картинки, то можем посчитать координаты каждого пикселя по отдельности.

Вообще, на программу SASPlanet стоит обратить внимание. Она содержит в себе очень большое количество растровых карт. Есть много ГШ, ГГЦ. Посмотрите источники, которые там есть. Если будете выкачивать карты способом, описанным на второй картинке, они останутся в кэше и будут доступны без интернета. Но в таком случае лучше выкачивать сразу несколько зумов.
 
Часть 3. Создаем исходник для карты.

Итак, в прошлой главе мы добыли спутниковый снимок нашего участка. Теперь нам понадобится редактор, позволяющий просто и быстро создать карту. Такой редактор есть, причем с открытыми исходными кодами - mapedit++. Это открытый клон пропиетарного gpsmapedit. Интерфейсы у них практически одинаковые, отличие gmsmapedit - добавление некоторых платных функций, нам не нужных в данный момент, потому мы возьмем открытый редактор mapedit++. Берем здесь. Скачиваем, распаковываем. Перед работой нам необходимо его немного настроить. Внизу поста берем файл osm_510.txt и кладем его в папку с программой. Для чего это нужно? Это так называемая "раскраска" карты (взятая из TYP-файла OSM Московской области, про TYP речь пойдет отдельно на этапе сборки карты). По умолчанию mapedit++ знает не так много типов дорог, лесов и прочих точек. При добавлении этого файла мы существенно расширяем набор типов точек, линий и полигонов. Далее нам этот файл пригодится для того, чтобы наша новая карта в навигаторе отображалась точно также, как и в редакторе mapedit++. Но, пока мы просто создадим исходник.
Запускаем mapedit++. Сразу же идем в пункт Tools -> Options... Далее жмем вкладку View и кнопку Map Skins. Там у нас будет пусто. Сюда нужно добавить наш файл osm_510.txt. Жмем Add... Находим osm_510.txt в папке программы и добавляем. В результате должно получиться вот так:



На этом вся настройка закончена, можно приступать непосредственно к карте. Теперь откроем наш спутниковый снимок, полученный в предыдущем посте. Напомню, что тогда мы склеили спутниковые тайлы в один и сформировали файл геопривязки .map. Нажимаем File -> Open (или File -> Add... Разница этих функций в том, что при File -> Add... карты можно наложить друг на друга, открыв несколько штук. В случае File -> Open открывается только одна карта. Чтобы добавить поверх нее другую, соответственно, используем File -> Add...).
Выбираем наш .map файл. На этот раз я в качестве примера принес что-то поближе к тематике форума. У нас появится склеенный спутниковый тайл:



Отлично. Приближаем изображение (кнопки + и -), как нам удобно, и начинаем рисовать. Кому как удобнее, но я обычно начинаю с дорог. Нажимаем на треугольник рядом с "волшебной палочкой" (хз, как она называется, написано "Create Object") и во всплывающем меню жмем Polyline.



Жмем на волшебную палку еще раз и у нас появится курсор. Рисуем дороги линией. Для того, чтобы закончить линию, нажимаем ПКМ и выбираем в меню "End" (Либо просто нажимаем Enter). Когда нажмете End, появится меню, которое попросит указать тип линии. На скрине ниже - несколько участков Unpaved Road (она же - грунтовка). То, что вы здесь укажете, то и будет показывать навигатор.



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

Теперь обведем лес. Для этого нам надо нажать на всплывающее меню волшебной палки и выбрать тип "Polygon". Начинаем обводить лес:



После нескольких процедур такого рисования будет получаться гораздо быстрее. Закончив полигон, выскочит табличка с выбором типа полигона, аналогичная той, когда мы рисовали дорогу:



Выбираем, что более соответствует типу растительности, нажимаем Ok. Обратите внимание, что при закрытии окошка возле любого вновь созданного объекта мигает текстовое поле. Мы можем ввести туда любое название, которое будет отображаться на карте при наведении на него курсором. Если объект большой, то надпись будет написана рядом, в случае полигона - внутри него. Это может быть описание зданий, их нумерация, название озер и т. п. Далее рисуем здания. Здание рисуется полигоном, также обводится по контуру. Разумеется, тип полигона указываем как "Building".

Есть один хинт: когда у вас много однотипных объектов с одинаковыми обозначениями на карте (Code), при выборе типа объекта можно поставить галочку "Show only used types". Будут отображаться только те типы объектов, которые мы нарисовали на своей карте. Это облегчает поиск и установку типа вновь созданного объекта.
В результате долгого и упорного труда у нас должно получиться нечто вроде этого:



Но это еще не все. Это был уровень 0 (но программа еще не знает этого). Уровень 1 мы пока не рисуем. Нужно привести уровни в порядок, а если быть точнее, создать их. Нажимаем "File" -> "Map Properties" и переходим во вкладку "Levels". У нас там пусто, либо присутствует пара уровней. Кнопкой "Insert Before..." создаем там 6 уровней, с Level0 по Level5. Двойным щелчком, начиная с Level0 приводим их в соответствии с таблицей ниже:



Почему именно так? Такой тип видимости по уровням используют карты OSM, возможно и Garmin Дороги России. Нам нужно, чтобы наша карта корректно отображалась по уровням вместе с картами по соседству. Не забываем сохранять почаще наши труды. Формат сохранения - файл .MP.

Продолжение следует...
 

Вложения

Создаем исходник для карты. Продолжение.

Самая тяжелая часть работы сделана. Теперь у нас имеется готовый уровень 0. Здесь можно пойти двумя путями, в зависимости от нашей лени наших нужд. Путь первый. В карте, показанной выше, есть полигон с типом "Abandoned Area", занимающий почти всю площадь карты. Чтобы нам было видно карту на отдаленном масштабе (на Level 1 и выше), тыкаем по нему правой кнопкой, выбираем "Modify" и выбираем "Extend all elements up to level...". Вводим в появившееся окно цифру уровня, до которого мы хотим расширить полигон.



К примеру, мы расширили полигон "Abandoned area" до 3. Это значит, что он будет виден при приближении нашей карты на навигаторе с масштаба 12 км и до упора. Почему? Взглянем на таблицу уровней из прошлого поста. Level3 соответствует Mapsource Zoom с масштабом 8...12 км. Так как мы расширили этот полигон с нулевого уровня, соответственно он будет присутствовать на Level0 (до 1.2 км), на Level1 (1.2...3 км), Level2 (3...8 км) и Level3 (8...12 км). Подъездные дороги и лес я расширил только для Level1 (масштаб 1.2...3 км). Можете глянуть на скрин ниже - слева скрин карты для Level1, справа - для Level2 и выше.



И - помните главное правило из таблицы - The last level should be empty!

Можно пойти и более сложным путем - переключив уровни вручную, через "View" -> "Levels" -> "Level1" (Level2, Level3...) дорисовать что-то свое, явно указывающее на обозначение объекта. Но - не забывайте, на каком уровне вы работаете! Это может вызвать некорректное отображение объектов не там, где нужно.

Забыл одну важную вещь - по окончании работы нужно удалить растровый слой (тот, по которому мы обрисовывали объекты, файл .map). Тыкаем левой кнопкой на свободное место картинки спутникового снимка, выделяя ее, и нажимаем DEL. У нас же векторная карта! (Даже если мы забудем ее удалить, компилятор должен откинуть откинет ее как ненужную). Теперь снова сохраняем свои труды в формате .mp, это и есть наш исходник карты. Можем открыть его еще раз и полюбоваться проделанной работой.
 
Последнее редактирование:
4. Перед тем, как компилировать. Немного о формате карт Garmin.

Перед тем, как компилировать, хотелось бы немного рассказать о формате карт Garmin, дабы понять суть процесса. Карта (или сборник карт) имеет расширение .img. Это - файл-контейнер. Он может содержать в себе как другие карты формата .img, так и некоторые файлы (например, это может быть индексная информация, файл TYP (раскраска) и некоторые другие виды информации). Если же взять и распотрошить одиночную карту - получим субфайлы, которые и составляют карту (файлы TRE, LBL, RGN, NET, NOD и др.). Не будем сильно углубляться в структуру, но нам важно помнить следующие вещи:
Карта Garmin (одиночная) будет иметь название файла xxxxxxxx.img, где xxxxxxxx - 8 цифр. Цифры могут быть произвольными. Это так называемый номер карты (ID). Но есть и специальные имена файлов, которые навигатор понимает целенаправленно.
Первый и самый нужный нам файл - это gmapsupp.img. Это - сборник карт. Он содержит в себе кучу карт вида xxxxxxxx.img. Навигатор загружает его по умолчанию. Обычно, для заливки карты в прибор она добавляется именно в этот файл. Но приборы моделей поновее могут загружать новую карту формата xxxxxxxx.img, если мы просто положим ее рядом с файлом gmapsupp.img. Это относится к моделям серий eTrex 20/30(x) и новее. Старые же приборы понимают только файл gmapsupp.img. Тут дело эксперимента - будет ли карта отображаться в списке. Если нет - ее необходимо добавить в gmapsupp.img. Далее будем рассматривать только этот способ, как 100% рабочий.
Помимо этого есть еще другие имена файлов, которые понимают навигаторы, но не столь важные для наших целей. Быстро пройдемся по ним.
- gmapbmap.img - базовая карта мира. Содержит минимум информации, такой как страны, точки городов, главные автомагистрали. Обычно идет в памяти прибора.
- gmapprom.img - может содержаться в приборе как предустановленная карта страны.
- gmapsup2.img - то же, что и gmapsupp.img, поддерживается не всеми приборами.
- gmaptz.img - карта часовых поясов. Присутствует в самом приборе.
- gmapoem.img - предустановленная карта, которую невозможно отключить из меню прибора.

Вроде все основное мы перечислили. Сама карта вида xxxxxxxx.img (либо сборник из карт) имеет еще два параметра - FID (Family ID) и PID (Product ID). По замыслу официальных разработчиков карт Garmin, этим они называли серии своих выпускаемых карт. Но нам это понадобится для других целей, а именно - для того, чтобы разукрасить карту. Наша карта будет отображаться точно также, как в редакторе mapedit++. FID и PID для любой карты можно назначить свой.

Часто (особенно актуально для нашего случая) карты могут пересекаться своими границами, накладываясь друг на друга, либо располагаться одна внутри другой. Как в этом случае поступит навигатор? У каждой карты (сборника карт) есть параметр, названный DrawPriority. Это параметр, описывающий приоритет отрисовки карты. Для того, чтобы было понятнее, карта с меньшим значением DrawPriority отображается поверх карты с бОльшим. К примеру, если у нас основные карты в навигаторе стоят с DrawPriority=40, а наша новая карта будет иметь DrawPriority=39, она отрисуется поверх основной.
 
5. Компиляция карты в формат Garmin.

Когда наш исходник карты полностью готов и доведен до ума, с учетом ифнормации из первой главы, приступаем к компиляции. Компилятор принимает на вход наш исходник в формате .mp, на выходе получаем формат .img Garmin.
Среди рабочих компиляторов - выбор у нас совсем невелик. Есть пропиетарный уже выше упомянутый cgpsmapper, имеющий кучу ограничений и ставящий на вашу карту в углу черную метку - POI крупного города с названием в стиле "Created with cgpsmapper v... This map cannot be sold" огромным шрифтом. Дополнительно прописывает свое название в копирайт к карте, что часто мелькает на экране при загрузке карт навигатором. Причем делает это независимо от того, зарегистрирована программа или нет. Разумеется, такое положение дел нас не устраивает, и мы пойдем немного другим путем.
Из открытых, как выяснилось, компилятор mkgmap (конвертирует OSM в Garmin), ВНЕЗАПНО поддерживает и .mp в качестве входного формата. Но есть и ложка дегтя - он написан на Java со всеми вытекающими. Если наш исходник больше сотни Мб (мы дорисовали уже готовую карту), запасаемся ОЗУ - 4 Гб для его работы не хватит. В нашем же случае, когда мы нарисовали свою маленькую карту, этого компилятора хватит за глаза (выше указанную карту он собирает за 2 секунды). На всякий случай я опишу оба способа сборки карт.

Итак, способ 1. mkgmap. Берем отсюда.

Для сборки карты выполним команду:

java -jar mkgmap.jar --mapname=xxxxxxxx --code-page=1251 --transparent sourcefile.mp

Теперь разберем опции.

--mapname=xxxxxxxx - опция, которой мы задаем номер (ID) карты без .img в конце. Если не указать этот параметр, компилятор укажет ID по умолчанию - 63240001. Соответственно, на выходе получится 63240001.img.
--code-page=1251 - кодовая страница. Если не указать, названия всех объектов будут выведены транслитом.
--transparent - прозрачная карта. Если не указать этот параметр, наша карта не будет прозрачной - все, что окажется под ней, не будет отображаться.
sourcefile.mp - файл .mp нашей карты. Подставляем вместо него название нашего исходника. Для нормальной работы можно положить его в папку с mkgmap. Там же появится наша скомпилированная карта. Подробнее почитать про опции можно здесь, либо набрав команду java -jar mkgmap.jar --help (или --help <пункт> для более подробной помощи.).

Если наша карта достаточно большая по размеру, компилятор может упасть с ошибкой наподобие "java.lang.OutOfMemoryError: Java heap space...". Выделим ему побольше ОЗУ. Команда будет начинаться с:

java -Xmx1G -jar ... ...

Опция -Xmx1G - выделение java 1 Гб ОЗУ. Варианты могут быть: -Xmx512M (512 Мб), -Xmx2G, -Xmx3072M и т. д.

Если исходник все-таки большой, а компилятор съедает всю свободную память и падает - придется разрезать исходник на более мелкие части и собрать их по отдельности, а потом соединить в gmaptool, о ней далее.
В конечном итоге у нас получится файл xxxxxxxx.img. Но - и это еще не все. Нужно, чтобы он корректно отображался в навигаторе, как и у нас в редакторе mapedit++. Об этом чуть дальше, см. gmaptool.

Если вы все же выбрали cgpsmapper и не хотите возиться с командной строкой, можно все это слегка автоматизировать. В настоящее время оффициальный сайт cgpsmapper мертв, скачать можно только со сторонних ресурсов. Последняя версия - 0100d. Можно найти ломаную, но на свой страх и риск. Итак, скачиваем, устанавливаем. Теперь допилим настройки нашей карты под него. Открываем наш исходник в mapedit++. Сразу идем в меню "File" -> "Map properties". Во вкладке "Header" смотрим на две вещи:
Type Set - должно стоять "Garmin"
Codepage - 1251
Далее идем во вкладку cGPSmapper - смотрим и ставим прозрачность карты в пункте "Map is transparent". Там возможны три варианта в зависимости от наших нужд:
N - непрозрачная карта
Y - прозрачная карта без бэкграунда
S - прозрачная карта с прозрачным бэкграундом
Жмем Ok. Далее идем "File" -> "Export" -> "Garmin IMG / cgpsmapper"
В поле "Path to cGPSmapper" указываем путь до установленного ранее cgpsmapper.exe (по умолчанию ставится в C:\Program Files(x86)\cgpsmapper).
Далее жмем "Run...", наблюдая за процессом. Если карта большая, процесс может занимать час и более времени.

Вне зависимости от выбранного способа компиляции на выходе у вас появятся несколько типов файлов. Это:
xxxxxxxx.img - сама наша карта
xxxxxxxx.mdx и xxxxxxxx_mdr.img - индексы. Эти два файла необходимы для поиска объектов на карте. Если вы делаете карту, поддерживающую поиск объектов (если вы, к примеру, в свойствах вновь созданных зданий и POI прописали полные адреса), для работы поиска эти два файла необходимо положить рядом с нашей картой.
xxxxxxxx.tdb - файл для отображения нашей карты в программе Mapsource (здесь точнее сказать не могу, т. к. не пользуюсь им). Как можно понять, самое важное здесь - xxxxxxxx.img - наша вновь собранная карта.
Внимание - при сборке карты в cgpsmapper Free - поиск и роутинг работать не будут! Ищите либо ломаную версию, либо используйте mkgmap (что предпочтительнее, т. к. он открытый и не ставит "черных меток" на ваши труды).

Открытые карты Garmin (OSM) можно взять отсюда. Там же есть и исходники в формате .mp. Но - редактировать и компилировать под себя - не особо рекомендуется, примерно 50% вероятности, что любой компилятор падет с ошибкой. На остальные 50% приходится выбрасывание части "ненужных объектов" компилятором из карты. Дабы снизить такую вероятность, не перечерчивая ошибки на карте, через mapedit++ в исходнике делаем следующие вещи:
"Tools" -> "Remove object duplicates"
Затем "Tools" -> "Generalize" -> "Nodes of all Polylines and Polygons"
Потом "Tools" -> "Special" -> "Remove jitters in Polygons"
Вы удивитесь, но с точки зрения редактора ошибок на карте не просто много, а очень много. Но при компиляции в случае cgpsmapper можно еще добавить опцию -e для игнорирования ошибок, то есть команда будет начинаться с cgpsmapper -e.

Итак, наша карта готова. Последние шаги рассмотрим в следующей главе.
 
Последнее редактирование:
6. Последние шаги по созданию карты. Gmaptool.

После того, как мы скомпилировали карту, делаем финальные шаги. Чтобы она отображалась на экране навигатора так же, как и в mapedit++, надо ее "раскрасить". За раскраску карты отвечает файл .TYP. Помните, как в начале работы мы импортировали файл osm_510.txt в пункт "Map Skins..." нашего редактора mapedit++? Это и был тот файл .TYP, только разобранный в формат .txt (это было сделано в редакторе TYP-файлов.). Garmin же понимает только TYP-файлы. Чтобы довести нашу карту до нормального вида и добавить ее к вашим остальным картам, понадобится Gmaptool. Берем здесь. Далее нам понадобится TYP-файл для раскраски карты. Берем его из конца поста, распаковываем и ложим рядом с нашей картой.
Устанавливаем Gmaptool, запускаем и видим главный экран - вкладку "Files". Для того, чтобы "склеить" нашу карту с раскраской, левой кнопкой мыши закидываем в Gmaptool нашу карту и файл .TYP. Должно получиться следующее:



Обращаем внимание на строчку "FID=510 PID=1...". Да, каждый TYP-файл раскраски имеет свой FID и PID. Нам нужно присвоить эти значения нашей карте, чтобы навигатор смог соотнести раскраску нашей карте. Ему не важно имя TYP-файла, ему нужны значения FID и PID. По этим значениям он сам найдет нужный TYP и раскрасит карту. Итак, склеиваем. Нажимаем вкладку "Join", заполняем пустые поля.



В поле "Output file" указываем имя нашего склеенного набора. Его мы и добавим к остальным картам. Заполняем все необходимые поля (Mapset Name, FID, PID) и нажимаем "Join all". В результате у нас получится карта с раскраской, которую мы и добавим ко всем остальным картам, находящимися в навигаторе (файле gmapsupp.img.).

Внимание! Прежде, чем что-то делать со своей основной картой навигатора gmapsupp.img, делаем резервную копию! Так меньше вероятность, что мы что-нибудь случайно сломаем в основном наборе карт. Это будет некой "контрольной точкой восстановления".

Но прежде, чем это сделать, определим DrawPriority основной карты. Открываем Gmaptool, во вкладку "Files" закинем мышкой gmapsupp.img. В этой же вкладке нажмем кнопку "Info". Смотрим графу "Prio". На скрине ниже - DrawPriority для одной карты.



Если вы используете карты OSM, обычно их DrawPriority = 25 (но лучше перепроверить). Если мы рисуем карту внутри этого набора и хотим, чтобы она отображалась поверх, нам нужно поставить своей карте DrawPriority <= 24. В Gmaptool очищаем вкладку "Files", закидываем нашу карту. Убеждаемся, что она единственная в списке. Далее переходим во вкладку "Write", ставим галочку напротив "Set draw priority", в поле пишем число 24 и менее.



Нажимем "Write all". Готово.

Если у вас навигатор поновее (модели eTrex 20 и новее), можно попробовать положить нашу карту в папку аппарата, подключенного к компьютеру в режиме USB-накопителя. Подключаем наш аппарат к компьютеру, включаем кнопкой питания, убеждаемся, что аппарат обнаружился в режиме накопителя (либо включаем соответствующий пункт в меню навигатора на старых аппаратах, обычно Настройка -> Интерфейс -> Накопитель USB). Открываем X:\Garmin (где X - буква карты памяти нашего навигатора). Видим там файл gmapsupp.img. Копируем нашу вновь созданную карту рядом с этим файлом. Отключаем аппарат от компьютера, включаем, смотрим, появилась ли в списке карт новая. Если же аппарат достаточно старый, этот метод может не сработать, придется разобрать файл gmapsupp.img на отдельные карты, докинуть нашу карту туда и собрать gmapsupp.img обратно.

Если выше указанный способ не сработал (обычно на аппаратах серии eTrex Legend / Vista, про серию GPSMap не подскажу, но думаю, что в GPSMap старых серий может возникнуть та же проблема) и карта не появилась в списке, делаем следующее. Если у нас есть родная гарминовская / другая программа по заливке карт, используем ее (тут уже как вам удобнее). Если программы нет, делаем через Gmaptool. Чтобы добавить нашу вновь созданную карту ко всем остальным через Gmaptool, сначала разберем наши карты из навигатора - файл gmapsupp.img. Для этого заново откроем Gmaptool (либо на главной вкладке можно поудалять все файлы из списка). На главной вкладке "Files" закидываем мышкой свой набор карт, имеющийся в навигаторе - файл gmapsupp.img. Далее - переходим на вкладку "Split". В "Output Directory" выбираем папку, куда мы разберем наш контейнер. В пункте "Create" выбираем "Single maps". Далее нажимаем кнопку "Split all". Ждем.
В папке, которую мы указали для разборки, появится много карт - наш разобранный gmapsupp.img.
Скопируем в эту папку нашу новую карту. Очищаем вкладку "Files". Не забываем это делать после каждой операции в Gmaptool - можно добавить что-то еще в свой набор карт по случайности. Теперь во вкладку "Files" закидываем содержимое всей папки вместе с нашей новой картой. Затем перейдем во вкладку "Join". В "Output File" указываем папку и дописываем gmapsupp.img. Это будет сборник карт с нашей новой картой внутри.



Далее заполняем Mapset name - имя нашего набора карт. Может быть любым, отобразится в списке навигатора как основная карта. Нажимаем "Join all". Ждем завершения операции. В результате у нас должен появиться новый файл gmapsupp.img с новой картой внутри. Не забываем о резервной копии старого gmapsupp.img!
Копируем новый файл gmapsupp.img на карту памяти с заменой старого. Включаем навигатор, проверяем, все ли корректно отображается, не послетала ли "раскраска" со старых карт. После того, как убедимся, что все в порядке и наша новая карта отображается поверх, можем удалить старую резервную копию gmapsupp.img. Как результат - получится вот это:



В заключение скажу, что лучше дорисовать прозрачной картой свою, чем редактировать исходник основной. Вы больше потратите время на компиляцию основной карты, да и не факт, что это получится. Почему? К примеру, в Garmin считается, что расстояние между соседними нодами (точками полилиний, либо изгибами полигонов) должно быть не менее 3.6 метров. Если вы видели исходники OSM-карт, обратите внимание, как плавно обрисовываются повороты - а это огромное количество нод с малым расстоянием. Но компиляторы каким-то образом проглатывают это и собирают карту. Почему это плохо? Много нод - лишняя нагрузка на и без того слабенький процессор навигатора. И время на компиляцию карты увеличивается вместе с количеством требуемого ОЗУ. При сборке больших исходников оба компилятора забивают память под завязку (a mkgmap - падает при ее недостатке). Вот оттуда и растут ноги тормозов навигатора при отрисовке таких карт, перегруженных элементами.
 

Вложения

7. Работа над ошибками.

В части 3, пост #8 я написал следующее:
К примеру, мы расширили полигон "Abandoned area" до 3. Это значит, что он будет виден при приближении нашей карты на навигаторе с масштаба 12 км и до упора. Почему? Взглянем на таблицу уровней из прошлого поста. Level3 соответствует Mapsource Zoom с масштабом 8...12 км. Так как мы расширили этот полигон с нулевого уровня, соответственно он будет присутствовать на Level0 (до 1.2 км), на Level1 (1.2...3 км), Level2 (3...8 км) и Level3 (8...12 км)
Это утверждение справедливо для программы Mapsource, но не для навигатора. Для самого навигатора будет актуальным значения GPS zoom из таблицы. То есть сам навигатор включает Level0 при значениях зума 120м и менее. Level1 - 500м...120м. Level2 - 2км...500м, и так далее. Приношу свои извинения. Заметил, когда перечитывал n-й раз. Также на уровни карты в навигаторе влияет настраиваемый в меню параметр "Уровень детализации". Чем он выше, тем нулевой уровень отображается при большем зуме навигатора. А еще можно было описать, что такое проекция / датум, но мы сами обрисовкой объектов внесем болше погрешностей, чем ошибка при выборе датума. Мы же делаем, как проще и эффективнее. С остальным вроде все нормально. Если будут предложения / корректировки - пожалуйста, дополняйте.

Про нанесение горизонталей (рельефа) - написано тов. Arigato - видео в посте по ссылке.

Как вы можете видеть, это достаточно муторно непросто создать карту, хотя это так, скорее, поначалу. Если вы регулярно обновляете карты и дорисовываете что-то свое, доходит до автоматизма. Этот процесс можно еще немного упростить, не используя Gmaptool, но для этого ваша новая карта должна иметь FID и PID такой же, как в вашем наборе карт gmapsupp.img (cобственно, специально для этого я и выдернул TYP-файл из карты МО и разобрал его в .txt с расчетом на то, что эта карта будет присутствовать в вашем навигаторе, а с ней и TYP-файл).

1. Берем свой gmapsupp.img из навигатора, кладем его рядом с компилятором.
2. Берем наш исходник, кладем туда же.
3. Выполняем команду: java -jar mkgmap.jar --mapname=xxxxxxxx --code-page=1251 --transparent --family-id 510 --product-id 1 sourcefile.mp
4. Далее выполняем: java -jar mkgmap.jar --gmapsupp xxxxxxxx.img
5. ????????
6. Profit!


В результате этих манипуляций происходит следующее:
В пункте 3 мы компилируем карту, присваивая сразу ей FID=510, PID=1 (файла раскраски в нашей карте нет, используем уже существующую в наборе ваших карт OSM.). В пункте 4 мы дописываем наш gmapsupp.img своей картой, а так, как у нас в наборе уже есть карта МО с соответствующим TYP-файлом, навигатор подтянет его автоматом и разукрасит нашу новую карту. Остается только скопировать этот же gmapsupp.img в память навигатора с заменой. На этом - все. Как я уже говорил выше, можете поправить / дополнить этот мануал.
 
Последнее редактирование:
Сверху