Язык: RU EN
На главную...

Рендер векторных карт Mapsoft2 (2020-02-15)

В данный момент поддержка векторных карт в mapsoft находится в состоянии разработки. Еще не все сделано, возможны любые изменения.

Для получения изображение карты можно использовать команду командной строки:

$ ms2render <vmap2_file> -c <render_config> <options>

Конфигурационный файл передается через параметр -c, --config. По умолчанию используется файл render.cfg в той же директории, что и карта.

Кроме того, изображение карты можно смотреть в программе ms2view, передав директорию с картой через параметр командной строки --vmap и название конфигурационного файла через параметр --vmap_config (это сейчас не работает!).

Формат конфигурационного файла и порядок рисования карты

Рисование карты выполняется в виде последовательности "шагов" (drawing steps). Каждый шаг описан в конфигурационном файле и содержит набор свойств (feature). Также, конфигурационный файл может содержать команды, не являющиеся шагами рисования. Пример конфигурационного файла: data/render.cfg Формат описания шагов рисования:


    (point|line|area|text):<tnum> <feature> <options> ...
    + <feature> <options> ...
    + <feature> <options> ...
    ...
    (map|brd) <feature> <options> ...
    + <feature> <options> ...
    + <feature> <options> ...
    ...

Шаги point, line, area, text описывают рисование линейного, точечного, площадного или текстового объекта с номером типа <tnum>. Шаг map описывает рисование на всей площади карты (можно нарисовать одноцветную подложку, но можно делать и более хитрые вещи), Шаг brd описывает рисование границы и закрашивание области вне ее.

Свойства (features):

В одном шаге рисования могут присутствовать несколько свойств. На каждом шаге рисование происходит в следующем порядке:

Если хочется использовать другой порядок (например, сперва контур, потом заливку, потом паттерн) - придется сделать несколько последовательных шагов рисования.

Дополнительные команды, которые могут встречаться в конфигурационном файле:

TODO - чего пока не хватает

Возможность отключать в интерфейсы свойства move_to, rotate_to, а, может, и любые свойства.

Более разверyтый интерфейс команды ms2mapdr render: параметры для задания привязки и масштаба линий, исключения заданных групп шагов рисования и т.п.

"Расталкивание" линейных объектов. Например, рисовать дорогу на неком минимальном расстоянии от реки, чтобы линии не наползали.


Наклон объектов и подписей

Объекты имеют параметр "наклон" (angle). Наклон применяется только к тексту, растровым картинкам или картинкам, нарисованным с помощью свойств lines и circles, но не к координатам объекта. Наклон может отсутствовать, в этом случае картинка объекта ориентируется на верх карты. Если наклон задан, то он отсчитывается от географического севера, по часовой стрелке.

Свойство рисования rotate_to ориентирует картинку объекта по указанной линии, игнорируя его собственный наклон.

Свойство рисования rotate добавляет к наклону (собственному или возникшему из-за использования rotate_to) фиксированный угол (в градусах, по часовой стрелке).

В формате VMAP параметр наклон объектов и текста определялся весьма странно: angle = atan2(dlat, dlon), где отрезок с координатами (dlat, dlon) определяет направление объекта в географических координатах. Поскольку координаты имеют разных масштаб по lat и lon, эта величина сильно отличается от настоящего угла поворота. При экспорте/импорте объектов из vmap наклоны объектов пересчитываются. Надо ли делать так при работе с MP (куда такие наклоны тоже попадали) - непонятно. Можно, наверное, сделать специальный параметр в конфигурационных файлах для импорта/экспорта...

# Примеры объектов с наклонами. Из трех точечных и трех текстовых # объектов левые не имеют собственного наклона, они ориентированы на верх # карты; центральные имеют наклон 0, они ориентированы на север. правые # имеют собственный наклон 20 градусов. # площадной и линейный объекты area:1 stroke 0xFF00FF00 1 + fill 0xFFAAFFAA line:1 stroke 0xFF0000FF 1 # точка:1 -- картинка и точка поверх point:1 img ohotn.png 0.4 point:1 stroke 0xFFFF0000 3 # шаг5: текст text:1 font 10 "DejaVu Sans:Bold:semicondensed:rgba=none" + write 0xFF0000FF + stroke 0xFFFFFFFF 4

# Тут используется свойство rotate_to. Все точечные # объекты ориентируются по линии. # площадной и линейный объекты area:1 stroke 0xFF00FF00 1 + fill 0xFFAAFFAA line:1 stroke 0xFF0000FF 1 # точка:1 -- картинка point:1 img ohotn.png 0.4 + rotate_to 30 line:1 point:1 stroke 0xFFFF0000 3 + rotate_to 30 line:1 # шаг5: текст text:1 font 10 "DejaVu Sans:Bold:semicondensed:rgba=none" + write 0xFF0000FF + stroke 0xFFFFFFFF 4

# То же, но с картинками, нарисованными с помощью # свойства lines вместо растровой картинки. # площадной и линейный объекты area:1 stroke 0xFF00FF00 1 + fill 0xFFAAFFAA line:1 stroke 0xFF0000FF 1 # точка:1 -- картинка # ось x направлена вправо, ось y - вниз point:1 stroke 0xFF000000 2 + lines [[0,0],[0,10],[6,8],[0,6]] point:1 stroke 0xFFFF0000 3 # шаг5: текст text:1 font 10 "DejaVu Sans:Bold:semicondensed:rgba=none" + write 0xFF0000FF + stroke 0xFFFFFFFF 4

# площадной и линейный объекты area:1 stroke 0xFF00FF00 1 + fill 0xFFAAFFAA line:1 stroke 0xFF0000FF 1 # точка:1 -- картинка point:1 stroke 0xFF000000 2 + lines [[0,0],[0,10],[6,8],[0,6]] + rotate_to 30 line:1 point:1 stroke 0xFFFF0000 3 + rotate_to 30 line:1 # шаг5: текст text:1 font 10 "DejaVu Sans:Bold:semicondensed:rgba=none" + write 0xFF0000FF + stroke 0xFFFFFFFF 4

# Точки дополнительно повернуты на фиксированный # угол 10 градусов # площадной и линейный объекты area:1 stroke 0xFF00FF00 1 + fill 0xFFAAFFAA line:1 stroke 0xFF0000FF 1 # точка:1 -- картинка point:1 stroke 0xFF000000 2 + lines [[0,0],[0,10],[6,8],[0,6]] + rotate 10 point:1 stroke 0xFFFF0000 3 + rotate 10 # шаг5: текст text:1 font 10 "DejaVu Sans:Bold:semicondensed:rgba=none" + write 0xFF0000FF + stroke 0xFFFFFFFF 4 + rotate 10


Привязка, граница, разрешение карты

Привязка карты может быть установлена через конфигурационный файл (команда set_ref), из файла или по номенклатурному листу. При этом также устанавливается граница (которую потом можно нарисовать командой brd). Также, границу можно изменить командой set_brd, из файла с треком (трек может быть многосегментным).

Такая, установленная через конфигурационный файл привязка не обязательно будет использована для рисования карты: при отрисовке используется свой механизм преобразований в разные системы координат и ничто не мешает нарисовать карту в любой другой системе. Например, при рисовании карты через ms2render используется связка функций geo_mkref (задание привязки с помощью набора параметров) и write_geoimg - рисование картинки в соответствии с привязкой. По умолчанию используется собственная привязка карты, но ее можно поменять с помощью параметров --mkref. Отдельно можно поменять добавить "внешнюю" границу с помощью переметров --border_wgs или --border_file. Можно использовать параметр --tmap, чтобы сгенерировать набор плиток (они, разумеется, рисуются в своей собственной системе координат).

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

Размер шрифтов при таком подходе вычисляется так (возможно, надо это как-то поменять): Сперва задается "естественная привязка". Например, можно сказать, что это номенклатурный лист с масштабом 1:100000 и разрешением 200dpi. Это задает размер точки растра на местности, в данном случае это 12.7m. Текст рендерится в стандартном разрешении Cairo, 96dpi (то есть, шрифт 10pt будет иметь размер 10/72 * 96 * 12.7m = 169 м на местности). При рисовании карты в других масштабах и проекциях размер шрифта (и ширина линий) перемаштабируется, чтобы все размеры (на местности) оставались теми же.

Один из возможных рецептов: инкрементальное создание набора плиток из листов карты. Каждый лист имеет свою привязку и границу (например, это номенклатурные листы). При рисовании должна быть включена обрезка объектов по границе карты (см. команду clip_border). Программе map_render даются параметры --tmap - делать набор плиток, --add - дорисовывать листы на старые плитки, если они имеются, --border_file/--border_wgs - дополнительно обрезать все по внешней границе.