Вы здесь

Конвертирование карт для загрузки в GPS

Аватар пользователя Макеев Григорий

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

Итак, имеется векторная карта Уфы в формате "ГИС Альбея", от 98 года, демонстрационная версия. Следует различать собственно сам софт "ГИС Альбея" и конкретную базу данных, с которой он работает. Загрузив программу мы смотрим на отображаемые на карте объекты: улицы, дома, леса, реки, и понимаем, что как можно больше из всего этого богатства хочется выгрузить.

Задача, которую предстоит решить, состоит из двух больших частей. Во-первых, необходимо исходную базу данных преобразовать в один из форматов так называемой накатанной цепочки преобразований. Другими словами, необходимо неизвестную базу данных привести к тому формату, из которого мы уже умеем получать карту для GPS (или умеет кто-то другой, у кого можно спросить). Во-вторых, необходимо, чтобы данные, приведенные к нужному формату, были корректны для GPS, - важнее всего добиться, чтобы координаты объектов, выгруженных из неизвестной базы, были корректны и в известной системе координат.

Разбирая софт "ГИС Альбея" от 98 года, я нашел там работать только выгрузку в DXF-формат (autocad-овский) и в MIF-формат (MapInfo-шный формат обмена). Первый меня не устраивал, а во второй формат данные программа, увы, отказалась выгружать. Но, к счастью, я выяснил, что софт от 98 года получил развитие в рамках уже другого имени, а именно "ГИС ИНГЕО-4". Порадовавшись заодно полезным изменениям в пользовательском интерфейсе я выяснил, что этот софт, во-первых, может выгружать в формат MIF, а во-вторых, подхватывает базу данных старого формата "ГИС Альбея" (что не удивительно).

Подергав курсором по отображаемой в "ГИС ИНГЕО-4" карте и посмотрев на отображаемые координаты стало ясно, что выгружать объекты в тех координатах, в которых они хранятся, смысла мало. Это была какая-то локальная декартова система координат, которую как-то нужно преобразовывать в систему координат, понятную дальнейшим программам технологической цепочки. А раз софт позволяет при экспорте данных в MIF заодно применять преобразования, то я решил это сделать именно на данном этапе.

 

1. Преобразование координат и экспорт.

 

Так как в то время я привык смотреть в GPS координаты в формате WGS-84, именно в этот формат я и преобразовывал карту, но в этот раз мы будем работать в Пулково-1942. Для начала необходимо было принять несколько допущений. Во-первых, предположить, что координаты карты в "ГИС ИНГЕО-4" есть прямоугольные декартовы. Во-вторых, предположить, что исходная карта ИНГЕО является смещенной и растянутой, но не повернутой относительно координат Пулково-1942.

Исходя из этих предположений и школьного минимума линейной алгебры можно записать, как новые координаты (Пулково-1942) вычисляются из базы ИНГЕО:

nx = xx * sx + dx
ny = yy * sy + dy, (1)

где xx,yy - координаты точки в базе ИНГЕО, sx,dx - соответственно, растяжение и смещение по оси x, а sy,dy - растяжение и смещение по оси y. Как видно, я предполагаю, что сначала к точкам ИНГЕО нужно применить растяжение, а потом смещение, чтобы получить Пулково-1942.

Нас интересуют параметры растяжения и смещения. Чтобы их вычислить, необходимо иметь хотя бы две точки на карте, для которых мы знаем и старые и новые координаты. Вообще говоря, точек нужно как минимум две, можно больше, но не обязательно чем больше тем лучше. Как будет качество привязки карты к местности зависеть от количества точек? Дело в том, что задавая две точки, и вычисляя по ним параметры преобразования, мы добиваемся того, что эти две точки будут однозначно совпадать на местности и карте, - то есть в них привязка будет абсолютно точной. Погрешность привязки точек, отстоящих недалеко от двух точек привязки, будет невелика, но она будет возрастать при удалении от них. Если привязывать карту по многим точкам, то вообще говоря невозможно будет найти параметры преобразования, абсолютно привязывающие все эти точки, зато карта в целом, возможно, будет привязана лучше.

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

Меня больше всего интересовало, чтобы карта была привязана хорошо в близком мне районе, поэтому одну точку я выбрал рядом с собой, а другую где-нибудь подальше. Каким образом выбирались точки? Важно, чтобы я мог, во-первых, подойти на местности как можно ближе к этой точке, и во-вторых, легко и точно мог указать точку на карте в ИНГЕО. Лучше всего для этого подходят пересечения больших улиц, хотя по понятным причинам, сложно выйти в саму точку пересечения их осей J.

Итак, точка рядом с пересечением ул.Бикбая и ул. Жукова имеет координаты на местности (nx1=439395, ny1=6072078), а в карте (xx1=3208.34, yy1=5030.94); а точка рядом с пересечением пр. Октября (все в Уфе) и ул. 50 лет СССР - (nx2=433902, ny2=6068556) на местности, и (xx2=-397.74, yy2=-427.93) в карте.

Заметим с самого начала, что в Пулково первая координата задает смещение по горизонтали, а вторая по вертикали, а в ИНТЕГРО, как и в WGS84, наоборот. Поэтому чтобы вычислить параметры преобразований корректно, необходимо поменять местами координаты в карте. Тогда первая точка на карте будет иметь координаты (xx1=5030.94, yy1=3208.34), а вторая (xx2=-427.93, yy2=-397.74);

Подставив координаты двух точек в (1) получаем систему уравнений, из которых находятся параметры преобразований следующим образом:

sx = (nx1-nx2)/(xx1-xx2)
dx = (nx2*xx1-nx1*xx2)/(xx1-xx2)
sy = (ny1-ny2)/(yy1-yy2)
dy = (ny2*yy1-ny1*yy2)/(yy1-yy2), (2)

 

подставляя куда наши координаты получаем:

sx = 1.0062522097064
dx = 434332.6055081
sy = 0.976683822876919
dy = 6068944.46622371

Теперь можно переходить к выгрузке объектов из ИНГЕО. Выбираю там Сервис-Экспорт-MID/MIF. Выбираю слои, которые хочу экспортировать (например, только улицы), указываю, куда экспортировать, и на следующем окне задаю параметры трансформации координат. Задаю первое преобразование: "увеличение-сжатие", 1.0062522097064 по X и 0.976683822876919 по Y. Затем задаю два последовательных преобразования, приводящих к тому, что X и Y поменяются местами (отражение относительно прямой y=x): второе преобразование: "поворот" на 90 градусов, третье преобразование: "увеличение-сжатие" на -1 по X и 1 по Y. Цель этой пары преобразований объясню чуть позже. И последнее преобразование: "смещение", 10434332.6055081 по X и 6068944.46622371 по Y. Цифры 10 я приписал к изначальному смещению по X, равному 434332.6055081, для того, чтобы формально привести используемые координаты к виду Пулково-1942, где, как известно, к смещению по Х приписывается слева номер зоны, которая для Башкирии есть 10 (центральный меридиан - 57). Нажимаю OK и в выбранной директории сохраняются файлы MID и MIF для каждого из слоев. Данные выгружены.

 

Диалог трансформаций

2. Импорт данных в известный формат.

Все выгруженные слои лежат в файлах MID и MIF. Для начала переименую их в короткие, говорящие названия, если это еще не так. Дальше самым подходящим вариантом было бы загрузить карту в программу GPSMapEdit, однако незарегистрированная версия, которая у меня была, отказалась грузить MIF-файл, сначала сказав, что не хватает возможностей демо-версии, а потом ругнувшись на неизвестный формат файла. Поэтому пришлось воспользоваться программой MifShape.exe из комплекта ArcView3.2, для перевода MIF-MID-файлов в формат SHP. Сам ArcView, по всей видимости, иметь не обязательно - достаточно самого исполняемого файла конвертера. После некоторых итераций процесса доведения карты я понял, что лучше всего будет создать bat-файл, который запускает перекачку в SHP и внести в него строчки типа

mifshape.exe point streets streets_pt
mifshape.exe text streets streets_t
mifshape.exe line streets streets_l
mifshape.exe poly streets streets_p

(при условии, что экспортированные файлы streets.mif и streets.mid лежат в том же каталоге, что и конвертер mifshape). Программа создавала по три файла для каждого типа данных, которые будут скачаны из MIF-формата: для точек, для текста, для линий, и для замкнутых полигонов. Некоторые из создаваемых файлов имели явно незначимый размер (около 100 байтов) - это означало, что объектов данного типа в данном слое нет (как, например, нет полигонов и точек в слое улиц) - такие тройки файлов я сразу удалял. Так же, к сожалению, не удалось добиться выгрузки каких-либо текстовых данных - они выгружались с совершенно левыми координатами.

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

 

3. Подготовка карты для GPS.

 

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

Запускаем программу GPSMapEdit, выбираем File-Import-ESRI_shape, и выбираем все файлы, которые собираемся импортировать. Для каждого файла программа сначала запросит как отображать объекты данного файла в GPS (то ли это дороги, то ли ручьи, то ли еще что), затем предложит выбрать источник для подписей к объектам, затем запросит используемую систему координат. Благодаря тому, что мы приписали номер зоны к координате Х, мы можем смело выбирать "Russian SK-42" и соглашаться с тем, что центральный меридиан будет автоматически выбран по префиксу. В следующем окне можно выбрать, в какие слои нужно загружать карту (о слоях как-нибудь потом), и нажав там на Finish, мы наконец-то увидели результаты своего труда.

Исходная и конечная система координат

Или же увидели совсем не то что ожидали. К сожалению, предсказать, какого рода проблемы могут возникнуть, очень сложно. У меня почему-то карта оказалась перевернутой зеркально относительно прямой y=x, будто где-то поменялись лишний раз координаты X и Y. Появляющиеся проблемы придется решать творчески. Я, например, как раз для решения такой проблемы с зеркальным отражением, и ввел на первом этапе при выгрузке карты два лишних преобразования, меняющие X на Y. Наверняка на этом этапе придется вернуться в самое начало и выгружать данные из базы заново, изменяя параметры преобразования координат.

После того, как все слои загружены и карта получилась в более или менее приличном виде, необходимо проверить, насколько хорошо она привязалась. Как минимум для этого нужно проверить какие координаты отображает программа GPSMapEdit для точек, по которым вычислялось преобразование - они должны совпадать с реальной местностью. Как правило, наличествует некоторая погрешность привязки, и на этом этапе ее можно исправить. Для этого удобно загрузить как можно больше точек и треков, и попытаться увидеть, есть ли некоторая общая тенденция в их ошибке. Например, если они все оказались сдвинуты в одну сторону, то с помощью инструмента Transform можно попытаться внести коррекцию в карту. В GPSMapEdit этот инструмент может выполнять просто сдвиг, задаваемый одной точкой (путем указания ее старой и новой позиций); аффинное преобразование, задаваемое тремя точками и квадратичное преобразование, задаваемое шестью точками. Лучше всего попытаться исправить ситуацию с помощью простого сдвига, а если это не получилось, тогда уже пытаться применять аффинное преобразование, предварительно сохранив карту в безопасное место, из-за некоторой непредсказуемости поведения объектов карты при таком сложном преобразовании.

Сдвиг карты для совпадения с треком

Исправленная карта

4. Загрузка карты в GPS.

После того как карта получается привязанной с удовлетворительной точностью, все остальное выполняется как с любой другой картой. А именно, настраиваются свойства карты (ее ID и NAME, обязательно CODEPAGE - 1251, если вы хотите, чтобы русский текст отображался корректно), затем карта сохраняется в польском формате MP, и из той же программы GPSMapEdit вызывается (File-Export-Garmin_IMG_cgpsmapper) программа cgpsmapper, которая готовит файл IMG, непосредственно заливаемый в GPS с помощью программы SendMap или ее визуального расширения img2gps.

 

Напоследок - несколько ссылок:
ufa_wo_houses.img, Карта Уфы без домов в формате IMG - 0,4мб. Заливайте в GPS, пользуйтесь на здоровье, и вспоминайте добром тех, кто эту карту вводил в ГИС.
ufa_wo_houses.rar, Карта Уфы без домов в польском формате MP (заархивировано) - 1,6мб. Перепривязка карты приветствуется. Буду рад если вы сделаете эту карту более точной и поделитесь с остальными.
Не знаю, стоит ли выкладывать карту Уфы с домами. Весит она 1,5мб в IMG, а толку от нее не особо много, там только контура домов, но не номера и не этажность (выгрузить не смог). Я некоторое время покатался по карте с домами ради интереса, а потом удалил, и теперь катаюсь по карте без домов - она и меньше места занимает, и быстрее отрисовывается прибором

 

Группа: 

Комментарии

Для того чтобы конвертировать текст необходимо чтобы форма отображения в ИнГео была текстовая. Mid/Mif - разбивыает каждый стиль оботражения на новый слой в MapInfo и отбельный объект. Так если в ИнГео будет несколько форм отображения объекта, например для улиц - площадной объект, место расположения надписи, форма отображения надписи для масштабов 1:500и 1:1000, то в mid/mife получится 1 объект площадной, 2 линия местоположение надписи для масштаба 1:500, 3 местоположение надписи для масштаба 1:1000. Кроме того отмечу, что надпись в ИнГео может формироваться из информации расположенной в нескольких полях семантической таблицы, MapInfo ожет отображать только надпись из обного поля таблицы, что подразумевает необходимость переноса текста различных полей в один. В принципе это возможно посредством редактирования информации в mid/mif-вском файле. Данную задачу возможно решить с использованием SQL -серавера, под которым работает ИнГео.
С Уважением ПК
Попробовал таким путём перегнать карту Челябинска. Возникли кое-какие вопросы:

1. Из некоторых слоёв получаются пустые карты, хотя сама ГИС "ИнГео" показывает их содержимое.

2. Где взять mifshape.exe? Пробовал конвертировать mif в shp при помощи ogr2ogr — теряется 1 вершина в каждом многоугольнике: например, большинство домов становяться треугольными.
Привет, Гриша! Это Павел Востриков. Мы встречались на Камчатке. Я пытаюсь запустить ГПС в П-42, используя рекомендации по ссылке: http://ne-grusti.narod.ru/Glossary/projections.html#zone
И все вроде получается, но когда надо ввести центральный меридиан, который у нас Е75, у меня стоит жестко W95. Ну 95 я могу изменить, а запад на восток никак. Буквы ГПС вообще не предлагает в этом контексте. У Андрея четко работает, то есть Е75 и координаты в П42 отображаются. А у меня W и не отображаются координаты в П42. Что делать? У меня ГПС60 гармин как у Андрея, только без карт.
Спасибо за статью. Мне она очень помогла разобраться со своим навигатором
Могу уступить карту для GPS по Ханты-Мансийскому району (ХМАО-Югры) - карту рисовал сам на основе растров М 1:100 000 (в 1 см - 1 км, километровка).
На карте есть:
1. Гидрография - реки, озёра и ручьи
2. Лес - лес и редколесье
3. Техноген - дороги, просеки, тропы, населённые пункты
Объекты подписаны - для навигаторов поддерживающих кирилицу - подписи на русском, для прочих - на латинском (пример: протока Горная будет обозначена как pr.Gornaya).
Пишите: kalgin_serg сабака майл тчк ру...
"какая-то локальная декартова система координат", которая неизвестна автору статьи - это система координат, которой пользуются геодезисты и изыскатели в Уфе. Вот такая карта, с такой системой координат для меня и представляет интерес. В связи с этим просьба, не мог бы кто-нибудь выложить здесь или по e-mail эту карту в MIF формате, но без всяких преобразований координат. У меня есть только демка ГИС ИНГЕО, в которой стоит ограничение экспорт.
Заранее благодарю
У меня где-то валяется только MIF уже с преобразованием.
Я очень скучаю по Алма-Ате, я люблю свой родной город-где я родилась....
Я люблю людей, которые делятся своми знаниями.Осваиваю интернет и работу с картами, очень захватывает это занятие. Автору большое спасибо.