Заказать обратный звонок
  • Телефоны интернет-магазина
    По России звонок бесплатный

    8 (800) 555-51-45
  • Москва

    (495) 668-09-39
  • Санкт-Петербург

    (812) 925-00-25
  • Доставка по всей России
  • Удобные способы оплаты
  • 8 лет на рынке
  • Свой склад

02.05.2006

Конвертирование карт для загрузки в 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 для каждого из слоев. Данные выгружены.

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

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, мы наконец-то увидели результаты своего труда.

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

   Или же увидели совсем не то что ожидали

источник: http://www.southural.ru
Комментариев нет

Написать комментарий