Изображение

Векторизация и загрузка карт в GPS

Привязка карт, наложение старых ан современны и прочее.
Аватара пользователя
КартоЮг
Администратор
Администратор
Сообщения: 5787
Зарегистрирован: 02 май 2013, 22:39:49

#1

Раз попалась мне в руки Garmin eTrex Vista, раз мы идем с ней в поход в район Прибайкалья и раз у нее целых 24 мегабайта памяти, то возникает желание загрузить в приемник карту тех мест, куда мы пойдем, и желательно физическую. Но, как и следовало ожидать, таких карт в природе не существует, а существует только растровая двухкилометровка из альбома Прибайкалье. Вывод неутешительный, будем пытаться векторизовать карту самостоятельно, лишний experience никогда не помешает. Наш маршрут проходит полностью по листу с номером 72 альбома Прибайкалье или по листу 19 альбома Хамар-Дабан, что одно и тоже, значит, его я и буду пытаться погрузить в GPS.
Изображение

В этой статейке я опишу, как я векторизовал карту, и что в результате получилось. Не претендую на открытие Америки, тем более на то, что нашел наиболее простой и лучший способ векторизации карт для Garmin, но главное - он работает. И так начнем. Буду предполагать, что читатель - полный чайник во всей этой тематике, то есть ровно на том этапе, с которого я начал.

1. Система координат и привязка карты

Оказывается, в приемнике Гармин основная система координат - WGS84, то есть импорт и экспорт всех точек и карт происходит в этой системе координат. А карта, которую я векторизую, дана в системе Пулково - 1942. Отсюда начинается первая пачка мучений. Чтобы во всем разобраться и убедиться, что нет ошибок, сначала надо попытаться привязать карту в OziExplorer. Я пользуюсь OZI версией 3.95.3, которую можно скачать на родном сайте http://www.oziexplorer.com

Устанавливаем в любое удобное место, запускаем и пытаемся привязать карту.
Возможны три варианта:
1. На карте есть градусная сетка. Самый простой вариант, разберетесь сами.
2. На карте есть километровая сетка, но нет градусной. Это как раз мой случай.
3. На карте нет ни той ни другой сетки. Печальный случай, в этой статье не рассматривается.

Моя карта имеет километровую сетку, но не имеет градусной. Что бы ее правильно привязать, надо знать в какой она находится зоне, знать центральный меридиан этой зоны и координаты хотя бы одной точки карты. Узнал, что центральный меридиан для этой зоны 105 градусов, что для узла сетки в левом верхнем углу рядом с мягким знаком от слова "Гань" координаты (468, 5704).
Запускаем Ози, заходим File/Load and calibrate map, выбираем картинку и видим такой диалог:
Изображение
В Map Datum выбираем Пулково 1942, в Map Projection выбираем Transverse Mercator, при этом выскакивает окно с настройками проекции:
Изображение

Давайте в вкратце разберемся, что это за цифры. 105 - это центральный меридиан нашей зоны. Ставим E потому что это восточная часть полушария. Scale Factor по всей видимости некое масштабирование, почему оно равно 1, не знаю. А вот 500000 - это смещение вдоль оси X. Оно означает, что в точке лежащей на центральном меридиане ваша координата по X будет равна 500000, а не ноль. Нужно это для того, чтобы по всей зоне координата X была положительная (если бы на центральном меридиане был ноль, то соответственно по одну сторону координаты будут положительные, по другую отрицательные). Сей замечательный факт еще в дальнейшем сыграет свою роль.
Теперь открываем закладку Point 1, кликаем курсором мышки в узел сетки на нашей карте, для которого мы знаем вертикальное и горизонтальное смещение
Изображение
и прописываем известные координаты (в метрах):
Изображение

Что бы привязать карту, Ози нужно как минимум 3 точки, для пущей верности надо ввести 4 по углам карты. Для этого надо вычислить их координаты с помощью километровой сетки (между линиями по 4 км). Не забудем, что при движении направо, координата X увеличивается, а при движении вниз координата Y уменьшается. Потом нажимаем Save и сохраняем файл в озиевском формате *.map.
Первый тест, который должна пройти ваша привязка - координатные линии, проведенные Ози и их растровые собратья должны максимально совпадать. Для этого включим отображение сетки в Ози: Map/Grod line setup:
Изображение

Еще зайдем в настройки Ози: File/Configuration и на закладке Maps выберем User Grid:
Изображение

Теперь любуемся на наше произведение, если сетки практически совпадают, то почти наверняка все сделано правильно. Для пущей верности можно попросить у местных координаты каких-нить примечательных точек в формате Long/Lat, вбить их в Ози и посмотреть куда лягут. Если попали куда надо, можно спать спокойно.

Если все сделано правильно, значит мы застрахованы от ошибок при позиционировании карты, когда будем ее векторизовывать.
2. Форматы и программы
1. Программа, в которой больше всего работаешь и собственно векторизуешь карту это R2V. В ней происходит привязка карты к нужным координатам, полуавтоматическая и ручная прорисовка нужных деталей по слоям и экспорт в файлы ArcView *.shp
2. Программа ArcView нужна для того, чтобы открыть файл shp генеренный из R2V и пересохранить в этом же формате. При этом исправляется какой-то глюк в файле, который оставляет после себя R2V, и файл уже можно грузить в MapEdit. Сразу импортировать в MapEdit полученный из R2V файл SHP не получается, потому что отображается только первый элемент, который вы рисовали, а остальные исчезают. Этот глюк удалось обойти только с промежуточным звеном ArcView.
3. MapEdit импортирует shp-файлы, при этом преобразует координаты в систему WGS84. Там же вы выбираете, как будут отрисовываться ваши объекты в приемнике. Карта сохраняется в польском текстовом формате.
4. Программа cgpsmapper.exe импортирует файл в польском текстовом формате и сохраняет его в формате IMG.
5. Программа SendMap посылает ваш img в приемник.
Такой неблизкий путь надо пройти, чтобы увидеть правильнопривязанную карту в вашем Garmin-е.
2.1 Программа R2V и привязка к системе координат
Где ее достать в сети, не знаю. Поищите, может найдете. :)
Запускаете, заходите File/Open image or project, выбираете вашу картинку, смотрите, любуетесь. Все это вам предстоит прорисовать практически руками. :)
Для начала надо привязать карту, поэтому жимаем сюда:Изображение и выставляем те же 4 точки, которые выставляли в Ози:
Изображение
Сохраняем точки привязки File/Save control points и получаем файл. Он вам не раз еще пригодится.

Теперь совет, что б не повторять моих ошибок, заведите много слоев с помощью кнопки Изображение:
Изображение
и в каждом слое рисуйте объекты определенного типа. Если вы временно не редактируете слой, то закройте его с помощью кнопки Lock/Unlock. Если слой мешается, его можно сделать Off. Чтоб слой было видней на карте, можно выбрать подходящий цвет.

Не буду описывать подробности работы с R2V. К нему прилагается замечательный 30 minutes tutorial, читайте и въезжайте.
Возможности R2V мне очень понравились, аккуратная безглючная программа позволяет достаточно быстро просто руками прорисовать все главные горизонтали (у меня на это ушло часа 4 для карты Хамар-Дабана, чего говорить о Южном Урале, где горизонталей гораздо меньше). А что касается рек, то их можно векторизовать практически в автоматическом режиме, если перед этим поколдовать в Photoshop-е чтоб кроме рек на карте ничего не осталось. К сожалению, горизонтали так вычленить не удалось отчасти, потому что исходный растр был не очень хорошего качества, отчасти потому что их слишком много и они слишком часто и сам-то не всегда разберешься, какая горизонталь куда идет.
Один совет. Если вы, как и я решили ручками обвести все основные горизонтали, делайте это сразу аккуратно, а то потом будете долго и упорно поправлять передвигая узловые точки туда, где им следует быть.
Я в R2V обвел все основные горизонтали, часть не основных в том районе, куда мы собираемся идти, все реки, все дороги, поставил станции и мосты. По идее можно всем объектам дать название, оно будет отображаться в приемнике, когда наведете на него курсор, но мне было лень.
В R2V можно прорисовать и экспортировать точечные и линейные объекты (точечные - это, например, станции, а линейные - реки). Для этого они, разумеется, должны быть в разных слоях. А вот площадные объекты, такие как озера, экспортировать не удалось, хотя MapEdit понимает такие шейпы и умеет их импортировать. Я нашел такой выход. Прорисовал форму озер в R2V, открыл их в ArcView, Создал там новую тему и поверх первой повторил только уже как полигоны (они даже автоматически закрашиваются). Первую тему просто забыл, а вторую (которую создал в ArcView) экспортнул в SHP и потом уже грузанул в MapEdit. Тогда озера выглядят на карте озерами.
Вот как выглядят мои художества в R2V, если отключить показ карты. Желтые - это вспомогательные горизонтали, остальное это основные горизонтали и реки. В левом верхнем углу часть ЛЭП-ы.
Изображение
Вот как это выглядит поверх карты:
Изображение

После того, как вы достаточно нарисовались, можно экспортировать результаты своего труда в файлы SHP. Это надо делать отдельно по каждому слою, для этого надо отключить все слои кроме одного и нажать File/Export Vector... Выбрать тип SHP, и в возникшем диалоге ввести так:
Изображение
Если вы экспортируете точечный слой (содержащий точечные объекты) выберите Points.

Кроме того, в R2V не забывайте сохранять проект. Если что, в проект можно добавить шейп, пользуясь меню File/Import geo-coded vector, где надо указать точно те настройки, которые вы выставляли, когда экспортировали SHP.

2.2 ArcView, пересохранение SHP и прорисовка площадных объектов.
Как уже говорилось, в MapEdit не получается загрузить полученные шейпы по какой-то странной причине. Если попытаться, вы там увидите только первую линию или только первую точку. Может есть другой способ побороть этот глюк, но я использовал ArcView версии 3.2. Программа весьма ревниво охраняется Ersi, и просто так из сети скачать ее вам не удастся. Идите на Горбушку. :)
1. Создайте новый проект. Создайте новый вид. Зайдите Вид/Добавить тему (у меня русифицированная версия), программа предложит выбрать шейп:
Изображение

Вы увидите нечто подобное:
Изображение
Значит, все получилось. Заходим Тема/Преобразовать в шейп-файл и пересохраняем в другой шейп.

Если вы хотите прорисовать озера, как я уже говорил выше, создайте новую тему при этом выберите
Изображение
и рисуйте на здоровье. Потом так же сохраняете.

2.3 MapEdit, преобразование системы координат и сбор всех слоев вместе.
MapEdit - еще одна милая программа, с которой нам предстоит работать. Она легко доступна через интернет. Устанавливаем, запускаем, выбираем File/Import/ERSI Shape *.shp. Можно выбрать за раз все ваши шейпы, сколько их там, и программа по очереди для каждой запустит мастера в зависимости от типа импортируемого шейпа. Импорт состоит из нескольких этапов:
1. Выбираем символ, каким будут отображаться объекты вашего шейпа. Если это точечные объекты, будут предложены точечные символы, если это линии, будет предложен перечень линейных объектов, если это, например, озера, будут предложены площадные объекты:
Изображение

2. Выбираем подписи объектов. Я обычно ничего не выбираю, чтоб потом не любоваться на нолики.
Изображение

3. Выбираем систему координат, в которой представлен наш шейп:
Изображение
Тут начинаются пре-вра-ще-ния. Как я смог догадаться, ума не приложу, наверное жена у меня - ничего себе. :) Товарищ MapEdit почему-то предлагает работать с системой координат Pulkovo 1942 года отлично от OziExplorer. А именно тут указывается не смещение относительно центрального меридиана и не центральный меридиан, а меридиан, от которого начинается отсчет, ну или что-то типа того. Способ задания преобразования указанный на скриншоте оказался успешным, хоть я не до конца понимаю внутреннее содержание фокуса. Кто знает разгадку, поделитесь с общественностью.

4. В последнем окне диалога надо выбрать некий уровень, о котором читайте ниже, и нажать ОК.
Изображение
Потом переходите к следующему шейпу.

По мере загрузке шейпов, они будут у вас отображаться на карте и вы можете любоваться своими художествами, по крайней мере мой конечный результат меня очень обрадовал:
Изображение
Теперь об уровнях. Зайдите File/Map properties. Там на закладке Levels мы видим:
Изображение
Все шейпы вы загружали в уровень 0, это означает, что они будут отображаться при масштабе карты крупнее чем 1.2 км, то есть если в приемнике вы захотите уменьшить масштаб, все ваши художества пропадут, и вам придется наблюдать карту только с масштабом 500 метров и крупнее. MapEdit нам предлагал загружать шейпы только в один уровень с номером 0, хотя на самом деле в пустой карте их по умолчанию два. Дело в том, что в последний уровень нам объекты добавлять не предлагают. Поэтому на самом деле надо было сначала добавить еще уровень 1.2 - 3 км (а можно и еще несколько), и при загрузке шейпов выбрать все эти уровни, и карта у вас будет показываться при более мелких масштабах.

Но тут такая странная вещь, перед тем, как не загрузишь хоть один шейп, никак не удается добавлять новые уровни. Так что сначала загружаем любой не самый важный шейп, потом добавляем нужное кол-во уровней, потом загружаем оставшиеся шейпы в добавленые уровни. Такая вот бодяга. Кроме того, в списке уровней следите, чтобы строго соблюдалась последовательность по возрастающей, иначе не удастся экспортировать карту в формат IMG. Успешным оказался такой способ задания зумовых уровней:
Изображение

Все наши старания сохраняем в польском текстовом формате и радуемся, потому что мучений осталось совсем не много.
2.4 cGPSMapper, из польского текстового формата в IMG.
Программка cGPSMapper тоже лихо распространяется через интернет, скачиваем, разворачиваем архив куда нравится.
Параметры ей можно передавать через командную строку, а можно сделать еще проще. В MapEdit нажимаем File/Export/cGPSMapper, выбираем путь к программе, нажимаем ок и ждем, пока она конвертирует. Потом рядом с cGPSMapper видим появившийся файл img.
2.4 SendMap, IMG -> Garmin.
Sendmap свободно распространяется в интернете.
Корпиуем IMG в папку с SendMаp, в командной строке пишем:
SendMap COM2 -s57600 00000000.IMG
Смысл этих параметров наверное ясен. Первое - это компорт к которому подключен у вас Гармин, второе - это скорость порта (можно поставить меньше), третье это имя загружаемого файла.
Смотрим, что получилось в Гармине. Собственно, что вы нарисовали, то у вас и получилось. :) Если результат радует, идем пить чай.
Не стесняйтесь делиться своими картами с другими, чтоб люди не делали дважды одну и ту же работу. :) Автор: Безруков Андрей



Вернуться в «Работа с картами»