Мы уже немного касались истории и причинах появления Польского формата в предыдущей лекции. Сейчас нам предстоит поближе познакомиться с внутренним устройством этого формата, содержащего всё необходимое для описания картографических данных. Программа GPSMapEdit хоть и использует собственный компилятор для преобразования данных в формат RUS, но сохраняет всю исходную информацию именно в этом формате. До сих пор не существует точных данных о всех, используемых программой GPSMapEdit, командах. Поэтому примем аксиомой что всё, что будет сказано по поводу синтаксиса и состава команд для cGPSMapper, будет действительно и для GPSMapEdit. Все данные о командах получены из файла справки для компилятора cGPSMapper. ВНИМАНИЕ! Приведён сокращённый вариант описания для общего понимания структуры формата.
PFM (Polski Format Mapy -- Польский формат описания картографических данных), так же известный как просто "Польский формат", являющийся исходным языком для компилятора cGPSMapper. Создание карт для загрузки в навигаторы GPS и КПК с установленной программой ГИСРусса можно сравнить с программированием - Вы пишете программу (то есть карту) на языке программирования (то есть в "Польском формате") и затем компилируете её для получения конечного файла с помощью cGPSmapper или GPSMapEdit. Вместо ручного программирования можно использовать специальную программу для полуавтоматического создания исходного кода в "Польском формате" - GPSMapEdit.
Исходный файл (файл карты) в "Польском формате" это обычный текстовый файл с расширением .mp. Соответственно он может быть быть открыт и изменён с помощью любого текстового редактора (в предыдущих версиях использовалось расширение .txt, которое иногда ещё встречается в ранних публикациях по этой теме).
Соглашения.
Строки, напечатанные Mоноширинным шрифтом должны быть вставлены буквально, исключая переменные данные. Переменные данные в нижнем регистре указанны после знака равенства (=) во многих случаях: они должны быть заменены соответствующими значениями, как описано в описании (или являются очевидными).Обычный формат текста, как в данном случае, является описанием и не должен вставляться в исходных код.
Специальный символ для переменных данных # заменяет числовое значение, например Data# будет выглядеть как Data0, Data1 и т.п.
Специальная последовательность символов ... обозначенная в отдельной строке, имеет интуитивное значение. Этот оператор в новой строке означает что данные, приведённые выше могут быть повторены 0 или больше раз различными (обычно последовательными) значениями переменных данных #. Если данной последовательности символов предшествует пара имён с символом для переменных данных #, вся пара должна быть повторена.
Имена, написанные в оранжевом цвете (например Name=) являются обязательными в данном разделе. Имена, написанные в оливковом цвете (например Label=) являются дополнительными.
Общий синтаксис файла "Польского формата".
Существуют следующие разделы:
- Раздел [IMG ID]- относится к разделу заголовка карты.
- Разделы объектов:
- Разделы [POI], [POLYLINE] и [POLYGON] - определяют соответственно такие объекты, как точки POI (точки особого интереса), точки пользователя, линии и полигоны вместе с данными описания объекта, если они присутствуют в теле раздела.
Раздел заголовка карты является обязательным и должен ставиться первым в исходном файле карты. Все прочие разделы являются необязательными. Разделы объектов должны стоять после раздела заголовка карты. Они могут располагаться в любом порядке и могут быть повторены столько раз, сколько требуется для описания всех объектов.
Каждый раздел начинается с обозначения типа, например тип [POI], и заканчивается командой [END]. Порядок расположения данных в теле раздела, то есть между началом раздела и командой [END], является произвольным.
Раздел заголовка карты.
[IMG ID]
ID=nnnnnnnn -- должен содержать 8 цифр (десятичный формат) и быть уникальным для каждой карты.
Name=map_name -- имя карты для просмотра информации о карте.
LBLcoding=x -- (по умолчанию: LBLcoding=6)
- LBLcoding=6 -- компрессия для имён.
- LBLcoding=9 -- восьмибитовое кодирование.
- LBLcoding=10 -- Unicode.
Сodepage=xx -- (default: Codepage=0)
Если xx<>0, восьмибитовое кодирование с определением кодовой страницы.
Datum=xxx -- (по умолчанию: Datum=W84) определяет датум данных описания объектов.
Datum=W84 -- Датум WGS-84
Elevation=x -- (по умолчанию: Elevation=f)
Elevation=m -- высота в метрах
Elevation=f -- высота в футах
TreSize=n -- максимально допустимый размер региона. Высокое значение может уменьшить скорость отображения карты, низкое значение увеличивает размер файла карты. Предпочтительные значения для n:
Топографические карты: 1000-2000
Город (много улиц): 2000-5000
Государство: 6000-10000
RgnLimit=n -- максимальное число элементов в одном регионе
предпочтительное значение: 1024
Levels=n -- количество слоёв в карте (не менее 1, не более 10)
Внимание: Последний слой всегда должен быть пустым.
Level#=g -- размер сетки для отображения слоёв # (слой 0 должен быть подробнее чем 1)
Внимание: значение каждого слоя (Level0, Level1, Level2 и т.д.) должно быть определено.
Для выбора оптимального размера сетки используйте данные таблицы, которая определяет видимость каждого слоя в зависимости от значения масштаба:
g=24 -- 120 м и ближе
g=23 -- 200 м - 300 м
g=22 -- 500 м
g=21 -- 800 м - 1.2 км
g=20 -- 2 км
g=19 -- 3 км
g=18 -- 5 км - 8 км
g=17 -- 12 км
g=16 -- 20 км - 30 км
[END] -- конец раздела заголовка карты
Раздел объектов
[POI] - этот раздел определяет объекты типа точки POI (Point Of Interest)
Type=тип_объекта
перечень доступных объектов можно посмотреть в меню свойств при создании объекта.
Label=имя_объекта
Levels=n - объект должен присутствовать на всех слоях, начиная с нижнего и заканчивая n включительно.
Data#=(lat1,lon1) -- данные о координатах объекта для слоя #
...
например: Data0=(52.12345,21.98765)
координаты указываются в градусах и в датуме, указанном в заголовке карты (или по умолчанию)
Origin#=(lat1,lon1) -- это старая команда, полностью совпадающая с Data#.
...
[END]
[POLYLINE] - этот раздел определяет объекты типа линия (линейные объекты, например улица, ручей и т.п.)
Type=тип_объекта
Label=имя_объекта
Levels=n
Data#=(lat1,lon1),(lat2,lon2),... -- множество координатных пар составляет узлы из которых составлен объект.
...
[END]
[POLYGON] -- этот раздел определяет объекты типа полигон (площадные объекты, например озеро, лес и т.п.)
Type=тип_объекта
Label=имя_объекта
Levels=n
Data#=(lat1,lon1),(lat2,lon2),...
...
[END]
Вот как вкратце выглядит структура файла Польского формата. Теперь давайте посмотрим всё это на конкретном примере. Допустим у нас на карте присутствуют по одному объекту каждого типа. На карте к КПК и в программе GPSMapEdit это будет выглядеть следующим образом:
Как можно видеть на нашей карте присутствуют три объекта - полигон "Кустарник", линия "Ручей" и точка "Мост". Описание этой информации в Польском формате будет выглядеть следующим образом (комментарии в исходном коде отсутствуют):
[IMG ID] - начало описания раздела заголовка карты.
ID=10011001 - уникальный номер карты (10011001).
Name=Пример - имя карты (Пример).
TypeSet=Russa - указатель целевого формата карты (RUS).
Preprocess=F - предварительная обработка (Full -максимальная).
CodePage=1251 - кодовая станица (кириллица).
LblCoding=9 - кодирование символов (восьмибитовое).
Datum=W84 - Датум (WGS-84)
Elevation=m - единицы высоты (метры)
TreSize=511 - размер блока (511).
TreMargin=0.00000 - выход границы за область карты (нет).
RgnLimit=127 - ограничение по количеству элементов в объекте (127).
POIIndex=N - индексация (выключено). В GPSMapEdit не доступно.
Levels=2 - число слоёв (2).
Level0=21 - масштаб первого слоя (800м - 1.2км).
Level1=20 - масштаб второго слоя (2км). Пустой.
Zoom0=0 - Масштаб первого слоя для MapSource.
Zoom1=1 - Масштаб второго слоя для MapSource.
[END-IMG ID] - конец раздела заголовка карты.
[POI] - начало раздела описания объекта типа "Точка".
Type=0x6401 - определение типа точки.
Label=Мост - имя точки.
Data0=(64.31912,39.73051) - координаты точки.
[END] - конец раздела точки.
[POLYLINE] - начало раздела описания объекта типа "Линия".
Type=0x18 - определение типа линии.
Label=Ручей - имя линии.
Data0=(64.33148,39.73154),(64.32667,39.72845),(64.31912,39.73051),(64.31671,39.72793) - координаты линии. Каждая пара определяет положение узла линии. Всего 4 узла.
[END] - конец раздела линии.
[POLYGON] - начало раздела описания объекта типа "Полигон".
Type=0x4f - определение типа полигона.
Label=Кустарник - имя полигона.
Data0=(64.31774,39.72141), (64.31861,39.72536), (64.32083,39.72776), (64.32273,39.72828), (64.32530,39.72776), (64.32718,39.72759), (64.32891,39.72793), (64.33045,39.72896), (64.33234,39.72879), (64.33371,39.72656), (64.33388,39.72158), (64.33285,39.71695), (64.32839,39.71403), (64.32358,39.71386), (64.31929,39.71386), (64.31774,39.71626), (64.31740,39.71935) - координаты полигона. Каждая пара определяет положение узла полигона. Всего 17 узлов.
[END] - конец раздела полигона.
Таким образом для трёх объектов нам нужно создать 36 строк кода. Чтобы этого избежать мы и будем использовать программу GPSMapEdit.
Итак, будем считать, что мы имеем представление о структуре описания объектов в Польском формате. И пришла пора переходить к практике.