Пример создания базы данных GPS-измерений

Материал из GIS-Lab
Перейти к: навигация, поиск
Эта страница является черновиком статьи.


Содержание

Задача

Дано: Имеется много gpx-файлов, полученные из MapSource (BaseCamp)

Получить: Собрать все данные (точки (waypoints) и трэки (tracklogs)) в одном месте. Отсеяв дубли, «ненужные» точки.

Ресурсы: MySQL Server 5.0.67-community-nt via TCP/IP; MySQL GUI 5.1.11; MySQL Connector/ODBC 5.1.12; Microsoft Office 2007

Решение

  1. Структура БД
Gpx полученные из MapSource, обладают рядом особенностей:
  • заполняются не все «поля»
  • собственное расширение (<extensions>)
  • дата и время для waypoints пишется как текст в элементы <cmt> и <desc>

Дамп БД:Файл:Gpx db 20130407 2315.zip


В данном случае меня интересовали: геометрия (lat, lon), имя (name), высота (ele), дата/время (cmt), символ(sym). Содержание <desc> дублирует <cmt>, с точки зрения MapSource: <cmt> - время, <desc> - комментарий к точке, <extensions> влияет только на отображение точки в MapSource. Символ <sym> записывается как string, лучше вынести в отдельную таблицу.



Трек имеет только имя и множество точек, тип которых – wptType, но с более аскетичным содержанием. Здесь надо заметить, что элемент <time> содержит время в Univeral Coordinated Time (UTC), в отличии от локального в <cmt>, следует выбрать единое время для БД и привести к нему все значения. Для удобства следует получить linestring, для отображения трэка, но желательно сохранить время для каждой точки трэка. Также удобно знать время трэка, по первой точке. Для трэков с одной точкой поле trk_line=null. Также надо учитывать, что трэк может содержать несколько сегментов (Track Segment), хотя MapSource кажется, так не делает, вместо этого создавая новый трэк. Создадим таблицы, для треков и точек треков, у последних получится два внешних ключа trk_id и nseg, хотя nseg получается «висячим» - так как никуда не указывает…


Функция для заполнения `trk_line`

Я это называю - "собирать бисер". В SFA нет функций для редактирования геометрии (в PostGIS и Oracle Spatila - есть). По хорошему надо использовать WKB - но как сделать это на SQL - я не знаю. Поэтому использую WKT и колдую с текстом (longText, по началу использовал text - как то не хватило...). У MySQL есть пара неприятных моментов связанных с геометрией: при попытке создать в хранимке определённую геометрию (например LINESTRING) - MySQL меняет функцию на создание просто геометрии (и внезапно получаем MULTIPOINT, хотя может это косяк моей версии), поэтому я использовал geomfromtext и в строке явно указывал тип геометрии. При объявлении "Declare p1, p2 point;" p1, p2 - это указатели, а значит при set p1=p2 мы получаем два указателя на один объект. Что бы скопировать точку приходится городить такое : Set p1 = geomfromtext(concat('Point(', X(CrP), ' ', Y(CrP), ')'));




  1. Импорт данных

Для разработки модуля импорта данных, я выбрал VBA, по двум причинам: наиболее удобный IDE из доступных у меня на рабочей машине; наличие опыта и наработок. Перед началом работы, необходимо подключить Microsoft XML v6.0 (работа с XML) и Microsoft ActiveX Data Objects 2.8 Library (подключение БД). Также я использовал WinAPI, а именно GetOpenFileNameA из comdlg32.dll. Изначально, было решено, разделить чтение и запись, что бы передать данные используются структуры: wpt_rec и trk_rec. В начале разработки, в отладочных целях, данные записывались на Лист в Excel'е - данный код приведён в листингах, но закомментирован. Некрасиво получилось то, что фильтрация исходных данных происходить в разных местах: для точек - при чтении XML'я (If cWPT.cmt <> "" Then 'У "ненужных" точек cWPT.cmt=""), для треков в начале записи в БД (If nTRK.s(0).p(0).time <> "" Then). Так же разделено преобразование даты/время, но здесь это оправданно - как было сказано выше, в точках и трэках время записано по разному.

Запуск импорта - test1.


Файл с макросами (xlsm):Файл:Imp gpx.zip




Использование

QGIS
AutoCAD Map 3D

Ссылки

gpx.xsd
MapSource
GpxExtensions

Персональные инструменты
Пространства имён

Варианты
Действия
Статьи
Спецпроекты
Инструменты