GIS-LAB

Географические информационные системы и дистанционное зондирование

Рендеринг карт с помощью Mapnik

Описание начала работы с Mapnik и опыт использования в проекте "Космоснимки"

Обсудить в форуме Комментариев — 3

Введение

Mapnik - открытая библиотека для рендеринга растровых карт из векторных данных. Она была разработана для проекта OpenStreetMap нашим соотечественником Артемом Павленко, и сегодня используется и другими ресурсами, среди которых стоит отметить EveryBlock и российские Космоснимки. Основная заявленная цель Mapnik - получение красивых карт. Данная статья кратко описывает возможности Mapnik и начало работы с ним.

Общая информация

  • лицензия: LGPL
  • платформы: UNIX, Windows
  • языки: C++, Python
  • форматы входных данных: ESRI Shapefile, PostGIS, PNG, TIFF
  • выходные форматы: JPEG, PNG
  • поддержка кодировок: Unicode и любые другие
  • поддержка шрифтов: TrueType
  • поддерживаемые графические элементы:
    • точка
    • линия с заливкой, текстурой
    • полигон с заливкой, текстурой, экструзией (псевдо-3D)
    • надпись к точке, линии, полигону
    • щиток (картинка+надпись, например, для обозначения трасс)
    • векторный указатель (например, стрелка вдоль улицы)

Установка под Windows

  • Скачайте и установите Python 2.5.
  • Скачайте и установите PIL для Python 2.5.
  • Скачайте и разархивируйте win32 binaries с сайта Mapnik в папку по выбору - далее [mapnik].
  • Отредактируйте файл [mapnik]\site-packages\mapnik\paths.py: в первой строчке вместо указанного пути пропишите mapniklibpath = [mapnik]/lib/mapnik
  • Добавьте путь к папке [mapnik]\lib к системной переменной PATH.
  • Добавьте путь к папке [mapnik]\site-packages к системной переменной PYTHONPATH.

Проверьте, все ли сделано правильно. В командной консоли, выполните:

python
from mapnik import *

Если появились сообщения об ошибках, проверьте пути выше и ознакомьтесь с TroubleShooting.

Установка под UNIX

С подробной инструкцией на английском языке можно ознакомиться на сайте Mapnik.

Начало работы

Чтобы использовать Mapnik, необходимо написать скрипт на Python, вызывающий нужные его функции (пример такого скрипта из проекта OpenStreetMap). Стили можно задавать прямо в Python-коде или в отдельном XML-файле (пример).

Опыт работы с Mapnik на сайте Космоснимки

На сайте КосмоснимкиMapnik используется для отрисовки карты России масштаба 500.000, а также детальной карты Москвы.

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

Еще одна подготовительная процедура для визуальной оценки полученного результата: до того как запускать карту на тайлинг, для примера отрисовывался какой-либо фрагмент карты. Этот способ заменял собой визуальное редактирование в векторном редакторе.

Далее несколько наблюдений из опыта применения Mapnik для данного проекта, потенциально полезных для тех, кто решит пройти испытания Mapnik самостоятельно.

  1. Самое простое: полилинии с внешней границей (outline) мы отрисовывали двумя линиями разного цвета и толщины - одна поверх другой.
  2. Для того, чтобы разместить пунсон, картинку в точке с подписью, использовался сдвиг текста по оси y. Оператор allow_overlap="true" разрешает картинкам перекрываться - тоже нужно, когда пунсонов много.
  3. Наиболее сложная из задач - размещение на карте надписей. Когда их много, они начинали налезать друг на друга, либо пропадать: когда, скажем, улица попадалась особенно изгибистая, ее название искореживалось поворотами и становилось нечитаемым. Как на этих примерах:
    mapnik

    mapnik
    В итоге, выяснилось, что есть оператор "max_char_angle_delta", который позволяет установить ограничение на изгиб надписи и в ином случае она просто не показывается.
  4. С min_distance, который по идее должен задавать расстояние между повторяющимися надписями, нам разобраться до конца не удалось. Судя по всему, этот оператор работает только для исключения "лишних" повторяющихся надписей.
  5. Со шрифтами и форматированием текста у Mapnik по умолчанию все не слишком разнообразно. Opacity, прозрачность, для текста пока не работает. Когда мы начинали работать с картой поддерживалась только кодировка UTF-8, поэтому, таблицы в какой-либо кириллической кодировке приходилось предварительно перекодировать. В последней версии стало возможным задавать кодировку в самой программе - encoding="UTF-8". Дополнительные шрифты записывались в папку ../mapnik/lib/fonts/ и регистрировались в программе следующим образом:

    FontEngine.instance().register_font("c:/mapnik_20080205/lib/mapnik/fonts/PTR76__C.PFB")
  6. К сожалению, возможность задавать padding (отступ от внутренней границы) обнаружить не удалось. Из-за этого возникает проблема, когда надо совместить границы двух карты - надписи обрезаются.

А вот какая карта у нас в итоге получилась:

mapnik

Mapnik и MapServer

Mapnik конкурирует с UMN MapServer в части отрисовки качественных растровых карт из векторных данных. Следующие два примера показывают разницу между Mapnik и MapServer последних версий:

http://openstreetmap.org/?lat=42.29979&lon=-71.05548&zoom=16&layers=B0FT (Mapnik) http://boston.freemap.in/?lat=894547.08189&lon=236111.07751&zoom=7&layers=B (MapServer)

По отрисовке линий, полигонов и шрифтов возможности двух программ очень близки: обе используют AGG и FreeType с anti-aliasing. Но есть много различий в размещении надписей, и тренированный взгляд найдет достаточно проблем в обоих примерах. В целом Mapnik явно разрабатывался под новомодную стилистику Google Maps, и пока проигрывает по настраиваемости и документации более старорежимному на вид MapServer. Это добавляет разработчикам вариантов при выборе пакета для рендеринга. Christopher Schmidt, создатель OpenLayers, сначала перевел свой проект Boston Free Map с Mapserver на Mapnik, а потом обратно.

В заключение

В целом, можно сказать, что мы не слишком страдали от отсутствия графической оболочки под Mapnik, гораздо больше мучений нам доставил поиск Mapnik'овских возможностей, в отсутствие документации, а так же ряд нереализованных или "реализованных не полностью" возможностей, которые мы тщетно пытались найти, и которых не хватило для более качественного, на наш взгляд, рендеринга.

Тем не менее, Mapnik это свободное ПО, действительно позволяющее добиваться красивой отрисовки карт, лучшей, чем в более функциональных и дорогущих редакторах, типа ArcMap.

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

Обсудить в форуме Комментариев — 3

Последнее обновление: September 09 2021

Дата создания: 27.07.2008
Автор(ы): Георгий Потапов, Владимир Слепнёв