Mapnik что это
Перейти к содержимому

Mapnik что это

  • автор:

Mapnik что это

[Mapnik](http://mapnik.org/) — это открытая библиотека для рендеринга растровых карт. Она была разработана специально для проекта [OpenStreetMap](http://www.openstreetmap.org/) нашим соотечественником Артемом Павленко, и сегодня используется в том числе и другими ресурсами. Основная заявленная цель Mapnik — получение красивых карт. Mapnik предоставляет Python API, что делает возможным вызов функций Mapnik (написанного на C++) из Python. Реализовано это в виде так называемых байндингов — специальных обёрток, позволяющих использовать возможности библиотек, написанных на одном языке программирования в приложениях, написанных с использованием другого (для Mapnik существуют байндинги для таких языков программирования как JavaScript, Ruby и Java). Установка Mapnik —————- Для установки Mapnik выполним следующую команду: sudo apt install libmapnik3.0 mapnik-utils Чтобы убедиться в том, что Mapnik установился успешно, выполните команду: python -c «import mapnik» Если в ответ на эту команду не последует никаких сообщение об ошибках, значит Mapnik установился корректно. Работа с Mapnik из Python ————————- Mapnik поддерживает 2 способа конфигурирования — с помощью команд Python и с помощью специального *.xml файла. Рассмотрим первый вариант. Создадим файл `test.py` следующего содержания: import mapnik m = mapnik.Map(1024, 768) m.srs = ‘+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs’ m.background = mapnik.Color(‘steelblue’) s = mapnik.Style() r = mapnik.Rule() polygon_symbolizer = mapnik.PolygonSymbolizer() polygon_symbolizer.fill = mapnik.Color(‘rgb(206,154,156)’) r.symbols.append(polygon_symbolizer) line_symbolizer = mapnik.LineSymbolizer() line_symbolizer.stroke = mapnik.Color(‘rgb(106, 106, 106)’) r.symbols.append(line_symbolizer) s.rules.append(r) m.append_style(‘My Style’,s) layer = mapnik.Layer(‘Buildings’) layer.datasource = mapnik.PostGIS(host=’10.22.0.9′,user=’pguser’,password=’topsecret’,dbname=’dbvega’,table=’building_polygon’,geometry_field=’webmercator’) layer.styles.append(‘My Style’) layer.srs = ‘+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs’ m.layers.append(layer) extent = mapnik.Box2d(3371223.3058836325071752,8390678.2413386497646570,3374529.0786556685343385,8391677.5805971417576075) m.zoom_to_box(extent) mapnik.render_to_file(m,’world.png’, ‘png’) print «rendered image to ‘world.png'» После чего выполним его: python test.py В результате в той же директории появится файл `world.png`, содержащий следующее изображение: ![][03-mapnik-01] В данном пример Mapnik подключился к PostGIS, запросил необходимый охват данных и отрисовал их соответствующим стилем, определенным всё в том же файле `test.py`. Выгрузка конфига в *.xml ———————— Познакомимся со вторым способом хранения настроек Mapnik. Запустите выполнение скрипта `test.py` следующим образом: python -i test.py После того как скрипт отработает — появится строка приглашения Python, введите команду: mapnik.save_map(m, ‘mapnik-config.xml’) В результате чего в файле `mapnik-config.xml` будут сохранены настройки Mapnik: My Style

И снова выполните команду: python test.py В результате чего должно быть получено следующее изображение (псевдо 3D): ![][03-mapnik-02] Подключение Mapnik в Mapproxy —————————— Аналогично тому, как осуществляется прямой вызов рендерера MapServer, происходит работа и с Mapnik. Одна особенность — Mapnik должен быть установлен в то же виртуальное окружение, что и MapProxy. Заметим, что это — не тривиальная задача. Наиболее простой способ проверить как работает MapProxy с Mapnik — установить MapProxy в систему, в этом случае он будет видеть Mapnik и проблем не должно возникнуть. Пример описания источника данных `mapnik`: my_mapnik_source: type: mapnik mapfile: /path/to/mapnik.xml [03-mapnik-01]: ../img/03-mapnik-01.png [03-mapnik-02]: ../img/03-mapnik-02.png

Установка и настройка генератора тайлов на основе OSM данных в Ubuntu или Debian

OpenStreetMap

Совсем недавно возникла задача создания программного обеспечения по генерации картографических тайлов. В качестве основы выбор пал на mapnik (альтернатив ему немного). Как оказалось, здесь на пути поджидало множество сложностей, непредвиденных ошибок, а более менее внятной документации по настройке всего «под ключ» найти не удалось. Повозившись какое-то время, мне удалось собрать множество граблей, которые могут возникнуть ну и довести дело до победного конца. Об этом и статья.

Установка производилась в Ubuntu и Debian. Скажу сразу, что лучше конечно использовать последние версии программных продуктов, которых иногда нет в репозитариях. Их можно скачать, при желании, вручную с официальных сайтов.

  • PostgreSQL >= 8.4
  • PostGIS >= 1.5 < 2
  • Python 2.x
  • Mapnik >= 2
  • Osm2pgsql
  • Некоторые знания по работе с bash, Python и PostgreSQL
Установка PostgreSQL

Сперва проверем какая версия PostgreSQL у нас в репозитариях:

$ apt-cache show postgresql

Если версия 8.4 и более, то устанавливаем пакет.

$ sudo apt-get install postgresql

В противном случае, скачиваем пакет с официального сайта www.postgresql.org/download/linux и устанавливаем его. Далее нам надо настроить нашу базу данных. По умолчанию её пользователь — это postgres и авторизоваться можно только от него средствами самой OC. Однако мы поступим несколько по-другому, сперва откроем файл pg_hba.conf. Узнать его расположение можно утилитой locate

$ sudo updatedb $ sudo locate pg_hba.conf

Если у вас эта утилита не установлена, то ставим

$ sudo apt-get install findutils locate

и повторяем команды выше. У меня например этот файл расположен по адресу /etc/postgresql/8.4/main/pg_hba.conf. Открываем его и редактируем.

$ sudo vi "/etc/postgresql/8.4/main/pg_hba.conf"
$ locate all all ident # Авторизация средствами ОС
$ locate all all password # Авторизация по паролю

Сохраняем файл и перезапускаем PostgreSQL.

$ sudo "/etc/init.d/postgresql-8.4 restart"

Теперь мы можем создать любого пользователя базы и заходить от него под обычным паролем без всякого шифрования (нам не критична супер безопасность). А также нам потребуется новая база данных для наших OSM данных.
Заходим в консоль управления PostgreSQL.

$ su postgres $ psql postgres=# CREATE ROLE osm WITH SUPERUSER PASSWORD ‘my_password’ LOGIN; CREATE ROLE postgres=# CREATE DATABASE osm; CREATE DATABASE postgres=# \q

Пользователь и база данных созданы.
Проверить работоспособность нового пользователя можно командой

$ psql -U osm -d osm -W

Если после ввода пароля Вы попадете в консоль PostgreSQL, то все прошло успешно.

Установка PostGIS

Нам потребуется PostGIS. В моем репозитарии была версия 1.4. Так как, после её установки мне почему-то не удалось найти файл postgis.sql, я снес эту версию и скачал с официального сайта версию 1.5. Поэтому в статье, мы поступим также.

$ wget "http://postgis.refractions.net/download/postgis-1.5.4.tar.gz"

Распаковываем архив, собираем и устанавливаем.

$ tar xvfz "./postgis-1.5.4.tar.gz" $ cd "./postgis-1.5.4" $ sudo ./configure $ sudo make install

В случае отсутствия необходимых библиотек, устанавливаем их.
Далее устанавливаем специальный язык в базу osm.

$ createlang plpgsql osm -U osm -W

Теперь необходимо в базу osm выполнить два SQL скрипта: postgis.sql и 900913.sql.
При помощи утилиты locate находим их расположение и выполняем их.

$ psql -U osm -d osm -W -f "/usr/share/postgresql/8.4/contrib/postgis-1.5/postgis.sql" $ psql -U osm -d osm -W -f "/usr/share/osm2pgsql/900913.sql"

Обратите внимание, как показала практика данную команду необходимо выполнить именно от пользователя с привилегиями суперпользователя PostgreSQL. Если у вас возникли проблемы и ошибки плана ERROR: type «geometry» does not exist, то попробуйте перед выполнением sql файла выполнить:

$ sudo ldconfig

и повторите команду запуска sql файлов.
Все! С настройкой PostgreSQL мы закончили. Переходим к установке Mapnik.

Установка Mapnik
$ sudo add-apt-repository ppa:mapnik/nightly-trunk $ sudo apt-get update $ sudo apt-get install libmapnik mapnik-utils python-mapnik

Если система выдаст, что “add-apt-repository: command not found”, то

$ sudo apt-get install python-software-properties

И повторите три команды выше. Mapnik установлен. Я не стал писать о необходимости установки Python, так как в большинстве случаев он всегда уже стоит. Проверяем работу mapnik.

$ python >>> import mapnik

Если ошибок никаких не возникло, то все прошло успешно. Теперь перейдем к установке osm2pgsql

Установка Osm2pgsql
$ sudo apt-get install osm2pgsql

Остался один важный штрих. Дело в том, что файл default.style, поставляемый osm2pgsql для экспорта osm данных в базу данных, по какой-то причине не соответствует последнему формату OSM. (Может быть кто знает почему?). Скачиваем файл правильного формата.

$ wget "http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/default.style"

Далее заменяем, тот что шел по умолчанию с osm2pgsql

$ sudo cp "./default.style" "/usr/share/osm2pgsql/default.style"
Установка скриптов от OpenStreetMap для генерации тайлов

Репозитарий OpenStreetMap svn.openstreetmap.org содержит немало скриптов и утилит по картографической тематике. Нам понадобится одно из приложений, написанное на python, которое уже содержит все необходимые нам скрипты по работе с mapnik. Чтобы его скачать требуется установить Subversion.

$ sudo apt-get install subversion

Теперь смело можно загрузить OSM Application. Создайте папку для его расположения. например, у меня это /home/osm/mapnik и выполните checkout.

$ mkdir "/home/osm/mapnik" $ svn co "http://svn.openstreetmap.org/applications/rendering/mapnik" "/home/osm/mapnik"

Теперь запускаем скрипт находящийся в приложении.

$ bash /home/osm/mapnik/get-coastlines.sh

Он скачает нам необходимые файлы с шейпами мира.
Теперь необходимо создать XML файл стилей. Делается это следующей командой:

$ python /home/osm/mapnik/generate_xml.py osm.xml my_osm.xml --dbname osm --user osm --password my_password --accept-none

Будет создан файл my_osm.xml с данными для подключения к PostgreSQL.

Проба пера

Вот и настал момент, когда можно качать любой OSM файл и генерировать на его основе тайлы. Файлы OSM можно скачать с сайтов представленных на веб-странице wiki.openstreetmap.org/wiki/Planet.osm
Можно, конечно, скачать весь файл Planet.osm, но нужно ли оно вам? В распакованном виде он весит более 250 Гб.

Предположим мы хотим сгенерировать тайлы Москвы на 17 масштабе.
Качаем необходимый OSM файл.

$ wget "http://download.bbbike.org/osm/bbbike/Moscow/Moscow.osm.gz"

Теперь мы можем его экспортировать в базу данных.

$ sudo osm2pgsql -U osm -d osm Moscow.osm.gz

Все! Осталось лишь запустить скрипт по генерации тайлов. Но перед этим, нам нужно его слегка отредактировать, дабы указать нужный масштаб и координаты каких тайлов мы хотим получить. Открываем файл /home/osm/mapnik/generate_tiles.py. Устанавливаем переменную mapfile, чтобы она указывала на наш my_osm.xml.

mapfile = "/home/osm/mapnik/my_osm.xml"

Далее переопределите переменную, которая указывает куда Вы желаете складывать тайлы.

tile_dir = "/home/osm/mapnik/all_tiles"

Файл Moscow.osm который мы скачали имеет координаты векторных данных

xMin = 37.32000 yMin = 55.57000 xMax = 37.88000 yMax = 55.92000 

Находим в скрипте такие строки

bbox = (-180.0,-90.0, 180.0,90.0) render_tiles(bbox, mapfile, tile_dir, 0, 5, "World") 

И перед ними (дабы не затирать существующий код) пишем:

bbox = (37.32000, 55.57000, 37.88000, 55.92000) render_tiles(bbox, mapfile, tile_dir, 17, 17, "Moscow") exit() 

Желательно написать exit(), дабы скрипт после генерации тайлов Москвы не преступил к генерации всего мира.
4 и 5 параметры функции render_tiles задают масштаб с какого по какой мы будем генерировать тайлы. В данном случае мы выбрали только 17 масштаб.

Сохраняем и запускаем.

$ python /home/osm/mapnik/generate_tiles.py

Пойдет процесс генерации тайлов.

Как это работает: архитектура тайлового бэкенда карт «Спутника»

Мы, команда карт «Спутника», разрабатываем карты на основе данных «OpenStreetMap». В этой заметке мы расскажем об архитектуре нашего решения для рендеринга тайлов.

Бэкенд карт написан на языке Go с использованием библиотеки Mapnik, поэтому мы дали ему название Gopnik. Исходники Gopnik доступны на Github.

Архитектура сервиса openstreetmap.org содержит множество компонентов.

Пренебрегая деталями, можно выделить три основных части: базу данных PostgreSQL, API для загрузки и редактирования данных и система рендеринга карт.

Для того, чтобы создать свою карту на основе данных OSM, потребуется поддерживать свою копию базы данных и систему рендеринга.

Коснемся некоторых общих вопросов создания on-line карт. На текущий момент существует несколько технологий отображения: от варианта, когда сервер отдает клиенту готовую картинку, до варианта визуализации загруженных данных на стороне клиента. Наибольшей популярностью на данный момент пользуются тайловые карты. Тайл — небольшое квадратное изображение с участком карты. Клиент загружает тайлы с сервера и затем склеивает их в единое изображение.

Эта технология проста в реализации, минимально загружает клиентскую сторону. Конечно, не лишена она и недостатков, но как мне кажется, использование такой технологии будет оправдано на протяжении еще долгого времени.

В мире OpenStreetMap стек тайловых карт держится на трех китах:

базе данных (чаще всего PostgreSQL);
библиотеке рендеринга (обычно Mapnik);
клиентская javascript-библиотека (в большинстве случаев — Leaflet).

Чтобы соединить эти технологии воедино, потребуется еще ряд вещей: дополнить, по необходимости, данные, добавить иконки, описать стиль рисования, настроить генерацию и кэширование тайлов.

Разрабатывая свой стиль мы хотели добиться одновременно полноты данных и легкости восприятия. Платой за красоту стала техническая сложность. Стиль оказался примерно вдвое более сложным и тяжеловесным, нежели стиль openstreetmap.org.

Как следствие, обновление тайлов занимает продолжительное время (около 5 дней), необходимо кэшировать значительное количество данных (примерно 2Тб). Все это сильно осложняет жизнь.

Чаще всего стек рендеринга строится на основе HTTP-сервера Apache c плагином mod_tile и бекендом, непосредственно занимающимся генерацией тайлов: Tirex или Renderd.

Эта схема проверена временем, именно так и работала первая версия maps.sputinik.ru. Однако нельзя сказать, что она нас полностью устраивала. Первое, с чем мы столкнулись — проблематичность использования облачных хранилищ для тайлового кэша. mod_tile разрабатывался с оглядкой на файловую систему, а сторадж с eventual consistency использовать и вовсе невозможно без серьезной доработки. Кроме того, схема балансировки renderd имеет определенные недочеты, использовать ее в среде нескольких дата-центров затруднительно. Да и штатные утилиты особым удобством не отличаются.

Мы провели эксперимент: набросали прототип системы, которая делает ровно то, что мы от нее хотели. Прототип прижился и получил дальнейшее развитие. По своей сути система, во многом, повторяет архитектуру mod_tile, с некоторыми расширениями и дополнениями. Она написана на языке Go с использованием библиотеки Mapnik, за что и получила свое название — Gopnik.

Gopnik легко масштабируется по произвольному количеству узлов, может использовать различные системы хранения данных, поддерживает расширение при помощи плагинов.

Gopnik состоит из двух компонент: dispatcher и render. Dispatcher принимает запросы от пользователя, проверяет наличие тайлов в кэше, в случае необходимости выбирает подходящий узел в кластере по хэш-функции координат и ставит ему задачу на генерацию тайлов. Render обеспечивает непосредственно рендеринг.

Отдельное внимание уделено проблеме взаимодействия с хранилищем. Загвоздка в том, что пользователи запрашивают тайлы по одному. Сервер же, для экономии ресурсов и для уменьшения проблем со стыковкой отдельных картинок генерирует сразу большую область карты (обычно 8×8 тайлов + дополнительный буфер), которая затем нарезается на куски. Такую область называют метатайлом. Gopnik группирует запросы от пользователя по метатайлам, при первом запросе к несохраненному в кэше метатайлу, начинается рендеринг. Все запросы, поступившие позднее, присоединяются к ожиданию. По завершении рендеринга возвращаются тайлы для всех ожидающих запросов и начинается фоновое сохранения в кэш. Кроме того, некоторое (настраиваемое) время результаты рендеринга хранятся в локальном кэше узла на случай, если клиент запросит другие тайлы из только что сгенерированного метатайла, так же локальный кэш может держать данные до полного сохранения их в сторадж, если последний поддерживает подтверждение сохранения.

Однако на лету можно генерировать лишь те части карты, где количество данных ограничено. В остальных случаях приходится подготавливать тайлы заранее. Для этого в Gopnik’е существует специальный набор утилит.

При помощи утилиты importer подготавливается план генерации. Prerender координирует процесс. Кластер узлов prerender slave непосредственно выполняет рендеринг.

Система является распределенной, устойчивой к сетевым сбоям и отказу slave-узлов. Единой точкой отказа является координатор, однако, благодаря логам рендеринга, процесс может быть продолжен с места сбоя. Такое решение позволяет избежать сложных полностью распределенных систем, при этом обеспечить должный уровень отказоустойчивости.

RU : Mapnik

Mapnik — это программа с открытым исходным кодом для отрисовки основного Slippy Map слоя для OSM. Он поддерживает различные форматы геопространственных данных и предоставляет гибкие варианты стилей для создания различных типов карт, например «cycle map» и «noname». Также, это имя, данное основному слою, что вводит некоторых в заблуждение.

Mapnik написан на C++ и может быть написан с использованием языков привязки, таких как JavaScript (Node.js), Python, Ruby и Java. Использует библиотеку AGG и дает возможность сглаживать объекты на карте с большой точностью. Может читать данные в формате компании ESRI, PostGIS, точечные рисунки TIFF, файлы .osm, а также поддерживает любые GDAL или OGR форматы, файлы CSV и многое другое.

Официальный сайт — mapnik.org, а новые пользователи могут получить больше информации об использовании на The Mapnik Wiki и присоединиться к irc-каналу.

Обратите внимание, что Mapnik — это набор инструментов для визуализации карт и его не следует путать с какими-либо обычными таблицами стилей карт, которые могут использовать Mapnik в качестве основы. Одна из них, OpenStreetMap Carto, используется в качестве основной карты на веб‑сайте OSM.

  • 1 Терминология
  • 2 Ошибки и предложения по отрисовке
  • 3 Обзор
    • 3.1 Файлы карты
    • 3.2 Стили Mapnik
      • 3.2.1 Источники информации
      • 3.3.1 Planet.osm
      • 3.3.2 Границы мира
      • 4.1 Несколько проблем, которые могут возникнуть
        • 4.1.1 Неверная проекция
        • 4.1.2 Cannot open data file
        • 4.1.3 Переполнение памяти
        • 4.1.4 Неверная проекция в pgSQL
        • 4.1.5 Locked out
        • 4.1.6 Доступ запрещён
        • 4.1.7 Authentication failed
        • 4.1.8 Unknown element
        • 5.1 Дополнительно: Поддержка запасного шрифта CJK
        • 5.2 Отображение тайлов
        • 5.3 Устранение ошибок тайлов
        • 5.4 Сокращение дискового пространства
        • 5.5 Конвертация стилей для версий > 2.0.0
        • 5.6 Настройка рендеринга
          • 5.6.1 Контуры
          • 5.6.2 Стили
          • 5.6.3 Региональное отображением имен
          • 5.6.4 Настройка default.style

          Терминология

          Долгое время термин Mapnik использовался как для библиотеки, отображающей геопространственные данные как в виде изображений, так и для стиля карты, написанного на языке стилей Mapnik XML, который используется для визуализации основной карты на www.openstreetmap.org (стиль иногда называют OSM Mapnik). С декабря 2012 года карта на сайте www.openstreetmap.org отображается с использованием порта CartoCSS этого стиля под названием OpenStreetMap Carto . Помните об этой путанице в именах, если вы читаете старые руководства в этой вики или обсуждения в списке рассылки или на форуме.

          Используйте Mapnik, если вы ссылаетесь на движок рендеринга, используйте правильное имя стиля карты, если вы ссылаетесь на правила стилей.

          Ошибки и предложения по отрисовке

          Отчёты и ошибки, предложения и запросы по неотображаемым на карте объектам отправляйте в trac с указанием компонента «Mapnik». Пожалуйста, перед новым запросом проверяйте уже оставленные заявки.

          Обзор

          Пример стандартного стиля OpenStreetMap, в котором используется движок Mapnik

          Mapnik может выводить изображения карт в различные графические форматы — PNG, JPEG, SVG и PDF. Основное использование Mapnik OpenStreetMap включает рендеринг многих миллионов тайлов карты (tile) размером 256 на 256 точек, которые отображаются в интерфейсе подвижной карты (Slippy Map) на JavaScript.

          Создание тайлов происходит на тайл-сервере (tile.openstreetmap.org). Slippy Map подгружает плитки по адресам вида http://tile.openstreetmap.org/7/63/42.png. Получается так:

          42.png

          Файлы карты

          Карты Mapnik настраиваются с использованием собственного формата XML (иногда называемого Mapnik XML).

          Файл карты содержит:

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

          Стили Mapnik

          Mapnik позволяет настраивать все картографические элементы карты — данные, значки, шрифты, цвета, узоры и даже некоторые эффекты, такие как псевдо-трехмерные здания и тени. Всё это контролируется путём определения источников данных и правил стилей, чаще всего на языке XML, характерном для Mapnik.

          Правила стиля Mapnik, используемые для стандартного слоя в OSM, имеют открытый исходный код и могут использоваться в качестве основы для пользовательской визуализации данных OSM. Также доступны другие стили, например, стиль гуманитарной карты.

          Существует ряд внешних инструментов, которые могут помочь в создании стилей Mapnik. Они предлагают языки стилей, которые более компактны и легче читаются и пишутся, чем встроенный в Mapnik язык XML. TileMill и Kosmtik — это среды разработки, использующие CartoCSS в качестве обработчика стилей (для преобразования CSS-подобного CartoCSS в стиль Mapnix XML), MagnaCarto также использует язык CartoCSS, но поставляется с собственным конвертером, который также может создавать файлы карт MapServer.

          Устаревшие инструменты для этих целей, разработка которых была прекращена, — это Quantumnik, плагин QGIS, Spreadnik и Cascadenik.

          Список стилей можно найти GitHub Wiki, а также в списке стилей CartoCSS.

          Источники информации
          • PostGIS: наиболее используемый подход для отрисовки данных OSM посредством Mapnik. Данные OSM преобразуются в формат доступный Mapnik с помощью Osmosis, osm2pgsql или Imposm, который загружает полученные данные в базу PostGIS. Встроенные в базу данных функции GIS и языка запросов SQL дают более широкие возможности отрисовки, недоступные для файлов OSM XML. Этот подход может использоваться для более сложных визуализаций и является основным источником данных, используемым стандартным слоем OpenStreetMap.
          • Shapefiles: помимо прочего, обычно требуются еще так называемые шейпфайлы (shapefiles) — они нужны для отрисовки некоторых дополнительных слоёв. Помимо PostGIS, стандартный стиль OpenStreetMap использует несколько шейп-файлов для визуализации карты. К примеру, береговая линия отрисовывается с помощью шейпфайлов, которые создают Coastline Error Checker из линий natural = coastline. Смотрите Coastline#Rendering_in_Standard_tile_layer_on_openstreetmap.org
          • OGR: Mapnik может читать из векторных источников, поддерживающих библиотеку GDAL/OGR.
          • GeoTIFF: Mapnik может отрисовывать точечные изображения GeoTIFF. В основном они используются для карт рельефа. Ограничение Mapnik состоит в том, что он не может изменять проекцию точечных изображений (преобразовывать их в желаемую проекцию без загрузки их в Mapnik). Файлы Hillshade GeoTIFF можно создавать с помощью таких инструментов, как GDAL, на основе цифровых данных о местности, таких как SRTM.
          • Растровые (точечные) изображения: подобно GeoTIFF, Mapnik также может отрисовывать точечные изображения (растровые картинки, Raster images), которые не содержат геоинформации. Ограничивающее эти картинки окно следует описать отдельными параметрами.

          Наборы данных

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

          Planet.osm

          Planet.osm — это снимок базы данных OpenStreetMap. Смотрите Planet.osm

          $ wget https://planet.openstreetmap.org/planet-latest.osm.bz2

          Примечание: если вы хотите отрендерить небольшой участок для быстрой проверки, то можете импортировать какой-нибудь файл .osm и вам не потребуется рендерить всю планету. Рекомендуется так поступать, если вы желаете просто проверить, работает ли рендеринг перед загрузкой 13+ Гб и импорта всей планеты. Вы можете получить подходящий файл .osm, скачав и сохранив область в JOSM или используя небольшие выгрузки планеты на Planet.osm#Country_and_area_extracts.

          Границы мира

          Mapnik использует внешние данные shapefile для береговых линий на низких уровнях приближения. Смотрите Coastline#Main_Mapnik_Layer

          wget http://tile.openstreetmap.org/world_boundaries-spherical.tgz # (50 Мб) wget http://tile.openstreetmap.org/processed_p.tar.bz2 # (357 Мб) wget http://tile.openstreetmap.org/shoreline_300.tar.bz2 # (46 Мб)

          После скачивания и проверки скриптов Mapnik (смотрите подробности ниже), создайте директорию mapnik/world_boundaries и распакуйте архивы, только переместите файлы из субдерикторий, так как обработка будет производиться в директории world_boundaries.

          С июня 2010 дополнительно требуются ещё два файла:

          wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/10m-populated-places.zip # (1.5 MB) wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/110m-admin-0-boundary-lines.zip # (38 KB)

          PostgreSQL / PostGIS

          Mapnik может использовать PostgreSQL/PostGIS в качестве базы пространственных данных. Для инструкций по установке и конфигурированию PostgreSQL/PostGIS для использования с Mapnik смотрите Mapnik/PostGIS.

          Если вы работаете с osm2pgsql версии старше 0.80 и планируете использовать диффы, то вам нужно активировать модуль intarray contrib. Не активируйте его, если у вас osm2pgsql 0.80 или новее:

          psql gis < /usr/share/postgresql/8.3/contrib/_int.sql

          osm2pgsql

          osm2pgsql это конвертер и загрузчик данных Openstreetmap в PostgreSQL.

          Для инструкций по установке смотрите osm2pgsql. До того, как вы начнёте впервые использовать osm2pgsql со сферической проекцией Меркатора (смотрите ниже), вам нужно инициализировать конфигурационные данные для данной проекции. Сделайте это, выполнив .sql идущий с osm2pgsql:

          [Синтаксис в Windows] $ psql -d gis -f c:\osm2pgsql\900913.sql
          [Синтаксис в Linux] $ wget http://trac.openstreetmap.org/browser/applications/utils/export/osm2pgsql/900913.sql?format=raw -O 900913.sql $ psql -d gis -f ./900913.sql

          Note не требуется делать это, если вы используете PostGIS 1.4 или выше, поскольку SRID уже включен в исходную таблицу spatial_ref_sys.

          Вам также следует убедиться, что схема базы данных osm2pgsql синхронизирована with the one Mapnik acts on. Если это не так, вы увидите забавные вещи, совсем не те, что ожидали.

          Схема описана в файле default.style для osm2pgsql и в osm.xml (resp. osm-template.xml) для Mapnik. Очень вероятно, что default.style в вашем пакете osm2pgsql устарел, если он не собран из svn. Так что, загружая из svn всяке OSM добро для Mapnik (смотрите ниже) вы также должны обновить default.style.

          Установка Mapnik

          Для установки Mapnik следуйте инструкциям, изложенным здесь: Mapnik/Installation.

          Загрузка данных

          Просто вызовите osm2pgsql (от имени пользователя, который будет запускать mapnik):

          $ osm2pgsql -m -d gis planet-latest.osm.bz2

          Этот процесс требует значительный объём свободной памяти (приблизительно, не менее 512 Мб). Если память переполнится, программа может обрушиться с какими-нибудь непредсказуемыми последствиями (к примеру, сообщения об ошибках запишутся в файл .osm). Убедитесь, что у вас достаточно свободной оперативной памяти и пространства для свопа перед запуском osm2pgsql.

          Опция "-m" разрешает использование сферической проекции Меркатора, что рекомендуется. Данный выбор идёт по умолчанию с версии 0.55, SVN r8320. Некоторые более старые инструменты могут до сих пор ожидать данные, импортированные в других проекциях, таких как "latlong" или несферический Меркатор. Опции командной строки позволяют выбрать эту и иные проекции.

          Последний код osm2pgsql также поддерживает простое задание границ при импорте, что ускоряет работу, если вы желаете рендерить лишь малую часть планеты. Например, если вы хотите импортировать Лондон из UK выгрузки планеты:-

          $ osm2pgsql --bbox -0.5,51.25,0.5,51.75 -m -d gis uk-080213.osm.bz2

          Несколько проблем, которые могут возникнуть

          Неверная проекция

          Если все тайлы вашей карты исчезают в промежутке 10–20 км в направлении Север/Юг, значит вы забыли добавить опцию "-m" при импорте через osm2pgsql. Начиная с osm2pgsql версии 0.55, сферический Меркатор является проекцией по умолчанию.

          Cannot open data file

          Если вы пытаетесь загрузить сжатый gzip файл планеты размером более 2 Гб, вы можете увидеть ошибку открытия файла. Это происходит из-за ошибки некоторых версий zlib, которым не удаётся обработать флаг O_LARGEFILE в open(). Костылём является использование внешнего процесса gzip, который не выдаёт такую ошибку. Указание имени файла "-" заставит osm2pgsql читать данные из STDIN.

          gzip -dc planet-080213.osm.gz | osm2pgsql -m -
          Переполнение памяти

          Если ваша загрузка падает с ошибкой, похожей на

          Using projection SRS 900913 (Spherical Mercator) Setting up table: planet_osm_point Setting up table: planet_osm_line Setting up table: planet_osm_polygon Setting up table: planet_osm_roads Mid: Ram, scale=100 Reading in file: - Entity: line 1: parser error : Extra content at the end of the document ^ - : failed to parse Error occurred, cleaning up

          вам вероятно нужно запускать osmpg2sql в режиме slim, который записывает промежуточные объекты на диск, вместо того, чтобы хранить их в RAM. Чтобы сделать это, запустите osm2pgsql с опцией s:

          osm2pgsql -m -s -d gis planet-080213.osm.gz
          Неверная проекция в pgSQL

          Вы можете получить вот такую ошибку сразу после запуска:

          Using projection SRS 900913 (Spherical Mercator) Setting up table: planet_osm_point SELECT AddGeometryColumn('planet_osm_point', 'way', 900913, 'POINT', 2 ); failed: ERROR: AddGeometryColumns() - invalid SRID CONTEXT: SQL statement "SELECT AddGeometryColumn('','', $1 , $2 , $3 , $4 , $5 )" PL/pgSQL function "addgeometrycolumn" line 4 at SQL statement

          Это означает, что проекция не была инициализирована и вам нужно выполнить 900913.sql в папке osm2pgsql. Чтобы сделать это:

          wget http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/900913.sql && psql -f 900913.sql gis

          Чтобы всё заработало после этого, перезапустим демон базы данных:

          sudo /etc/init.d/postgresql restart
          Locked out

          После нескольких часов, импорт может выйти с ошибкой вроде:-

          ANALYZE planet_osm_line; failed: ERROR: deadlock detected DETAIL: Process 28511 waits for AccessExclusiveLock on relation 1064115 of database 18309; blocked by process 12776. Process 12776 waits for ShareLock on transaction 572766655; blocked by process 28511. Error occurred, cleaning up

          Такое бывает в некоторых версиях PostgreSQL, и происходит, когда идёт попытка выполнить auto-vacuum во время ANALYZE. Решением является запрет auto-vacuum в базе данных. Поскольку данные не обновляются после импорта, от процесса vacuum никакого толку. Установите в файле postgresql.conf опцию:

          autovacuum = off

          Затем перезапустите сервер базы данных

          sudo /etc/init.d/postgresql-8.1 restart

          Note: В Debian/Ubuntu вам также надо поправить /etc/cron.d/postgresql-common закомментировав две задачи pg_maintenance (добавьте '#' перед ними), которые всё равно будут вызывать vacuum в регулярном порядке:-

          # Run VACUUM ANALYSE on all databases every 5 hours if pg_autovacuum is not # running # 2 0,5,10,15,20 * * 1-6 root if [ -x /usr/sbin/pg_maintenance ]; then /usr/sbin/pg_maintenance --analyze >/dev/null; fi # On Sunday you may wish to run a VACUUM FULL ANALYSE as well # If you do not run a 24/7 site, you may want to uncomment the next line # so as to do a regular VACUUM FULL. If you need 24/7 connectivity, save # VACUUM FULL for when you think you really need it. # 10 3 * * Sun root if [ -x /usr/sbin/pg_maintenance ]; then /usr/sbin/pg_maintenance --full --analyze >/dev/null; fi

          Не забывайте возвращать их, если вы делаете что-то ещё в postgres, или производительность медленно падает.

          Доступ запрещён
          Using projection SRS 900913 (Spherical Mercator) Setting up table: planet_osm_point SELECT AddGeometryColumn('planet_osm_point', 'way', 900913, 'POINT', 2 ); failed: ERREUR: droit refusé pour la relation geometry_columns CONTEXT: instruction SQL « DELETE FROM geometry_columns WHERE f_table_catalog = '' AND f_table_schema = 'public' AND f_table_name = 'planet_osm_point' AND f_geometry_column = 'way' » PL/pgSQL function "addgeometrycolumn" line 94 at EXECUTE statement instruction SQL « SELECT AddGeometryColumn('','', $1 , $2 , $3 , $4 , $5 ) » PL/pgSQL function "addgeometrycolumn" line 4 at SQL statement Error occurred, cleaning up

          Пользователь не имеет прав для модификации базы данных gis. Запускайте osm2pgsql от пользователя, которого вы создали для установки postgresql.

          Authentication failed

          Если вы не можете подключиться к postgres командой psql (такое случается, к примеру, с Ubuntu 9.10 и postgres 8.3):

          $ psql -W gis username psql: FATAL: Ident authentication failed for user "username"

          Даже если вы установили пароль для этого пользователя:

          $ sudo -u postgres -s -H postgres@aoeu$ psql Welcome to psql 8.3.5, the PostgreSQL interactive terminal. ALTER ROLE username PASSWORD 'mypassword';

          Вы можете дописать следующие строки в ваш pg_hba.conf (лежит, например, в /etc/postgresql/8.3/main):

          local all all trust host all all 127.0.0.1/32 trust host all all ::1/128 trust

          Так вы сможете использовать аутентификацию из localhost.

          Note that you may have to comment out any existing lines beginning with local all or host all. I had to comment out the following section on Ubuntu 8.10:

          # "local" is for Unix domain socket connections only #local all all ident sameuser # IPv4 local connections: #host all all 127.0.0.1/32 md5 # IPv6 local connections: #host all all ::1/128 md5
          Unknown element

          Если вы получили ошибку

          Unknown Element name : changeset

          значит вам нужно обновить ваш osm2pgsql до последней версии.

          Отображение карты с помощью Mapnik

          Распакуйте данные lowzoom и береговой линии, которые вы скачали ранее, последние два zip файла требуются с июня 2010:

          cd ~/mapnik tar xzf world_boundaries-spherical.tgz tar xjf processed_p.tar.bz2 -C world_boundaries tar xjf shoreline_300.tar.bz2 -C world_boundaries unzip 10m-populated-places.zip -d world_boundaries unzip 110m-admin-0-boundary-lines.zip -d world_boundaries

          Команды выше должны переместить все шейпфайлы в директорию world_boundaries.

          Если вы не сделали это раньше, экспортируйте материалы для Mapnik из репозитория OSM subversion:

          svn export http://svn.openstreetmap.org/applications/rendering/mapnik cd mapnik

          Файл osm.xml будет собран из основного osm.xml и файлов XML include из директории inc/. Директория inc/ содержит 3 файла .template, которые передаются скрипту generate_xml.py:

          ./generate_xml.py -h

          Проверьте, устраивают ли вас значения по умолчанию. Вы можете указать значения, отличные от умолчаний. В качестве образца:

          ./generate_xml.py --host localhost --user `whoami` --dbname gis --symbols ./symbols/ --world_boundaries ./world_boundaries/ --port 5432 --password 'something' 

          Данная команда берёт файлы .template из inc/ и создаёт non-template версии этих файлов, с вашими настройками. Если вы не можете или не желаете запускать скрипт, вы можете сделать это вручную. Обновление таблицы стилей теперь выполняется просто запуском 'svn update'. SVN не будет трогать сгенерированные файлы настроек. Если в файлы .template добавится новая опция, вам потребуется лишь запустить скрипт generate_xml.py ещё раз.

          После того, как вы создали таблицу стилей, вы можете указать mapnik на файл osm.xml. The osm.xml file draws in the files in the inc/ directory, through the use of XML entities. Вам не нужно создавать отдельную копию таблицы стилей.

          Вы можете указать, какая область должна быть отрисована, установив границы и уровень зума в generate_(tiles|image).py

          Дополнительно: Поддержка запасного шрифта CJK

          В данный момент включает в себя шрифт с поддержкой символов CJK (Chinese, Japanese, Korean, (Китайский, Японский, Корейский) et. al. or more generally East Asia). Чтобы добавить поддержку, вам надо открыть файл inc/fontset-settings.xml.inc и раскомментировать строки, содержащие "unifont Medium".

          Older mapnik versions did not have unifont included. There you need to: Более старые версии mapnik не включают в себя unifont. В этом случае:

          1. Скачайте GNU Unifont Glyphs
          2. Распакуйте и положите файл ttf в директорию /usr/local/lib/mapnik/fonts (или эквивалентный путь) с остальными шрифтами Mapnik.

          Отображение тайлов

          Теперь можете вызвать

          MAPNIK_MAP_FILE="osm.xml" MAPNIK_TILE_DIR="tiles/" ./generate_tiles.py

          generate_tiles.py генерирует тайлы, которые могут раздаваться подходящим сервером.
          Загляните внутрь файла, и вы увидите, какая часть планеты и на каком зуме будет рендериться по умолчанию. Ищите bbox и min,max zoom. Если вы хотите выбрать другую область, сходите на openstreetmap.org и щёлкните вкладку "Экспорт"; затем "Выделить другую область". Обведите желаемую область, и четыре текстовых поля покажут, какие значения вам надо указать в порядке [left,bottom,right,top].
          Если у вас многоядерная машина, для ускорения генерации тайлов вы можете разделить область, например, на четыре части и запустить несколько процессов одновременно.
          Дополнительно можно ускорить процесс, уменьшив влияние узких мест ввода/вывода дисковой подсистемы (iowait time). Узкие места можно найти с помощью iofile.d; в Mac OS X в этом поможет Spotlight, and Postgress statistics collector as parallel disk i/o consumers.

          ./generate_image.py

          generate_image.py генерирует цельное изображение для указанных границ. По сути, он берёт тайлы и соединяет их в одну большую картинку. Это пригодится людям, которые хотят просто отрисовать ограниченную область, и избежать возни с тайлами.

          Устранение ошибок тайлов

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

          1. Если на сгенерированных тайлах видно береговую линию, но не хватает улиц, названий улиц, городов и прочих сущностей, пожалуйста проверьте, может ли пользователь базы данных выполнить вход. Скрипты и Mapnik могут тихо смириться с проблемой и рисовать одни берега, без остальных данных. Другая причина может быть в том, что Mapnik собран без поддержки PostGIS.
          2. Версии двух последних скриптов в svn предназначены для работы с Mapnik 0.5, и вы можете получить ошибки, если попытаетесь использовать их с более старой версией. Эти скрипты могут вызывать программу 'convert'.
          3. Если вместо азиатских надписей квадратики, значит вы не разрешили шрифт unifont в таблице стилей. Отредактируйте inc/fontset-settings.xml.inc и раскомментируйте строки, содержащие unifont. Шрифт unifont идёт вместе с mapnik, начиная с версии 0.7.0. Чтобы убедиться, что unifont корректно установлен в правильные папки, вы можете выполнить в командной строке: ls `python -c "import mapnik;print mapnik.fontscollectionpath"` . Также можно затем проверить доступные font face names: > python -c "from mapnik import FontEngine as e;print '\n'.join(e.instance().face_names())"
          4. Если вы используете файловую систему ext4 (предлагается по умолчанию в таких дистрибутивах, как openSUSE 11.2 и Ubuntu 9.10) и генерируете много тайлов, может так случиться, что скрипт упадёт, потому что не сможет больше создавать новые файлы тайлов. Это проблема файловой системы. Удалите столько файлов, сколько сможете, выполните принудительную проверку файловой системы и/или перейдите на более стабильную файловую систему.
          5. Эта ошибка может быть на некоторых unix дистрибутивах:
          untimeError: PSQL error: FATAL: Ident authentication failed for user "username" (encountered during parsing of layer 'leisure')

          На большинстве инсталляций Unix postgres ставится в дефолтной конфигурации для работы с использованием аутентификации 'ident same user'. Для её использования, уберите следующие параметры из конфига: user, port, host, password. Удалите все параметры из команд, например:

          ./generate_xml.py --accept-none --dbname gis --symbols ./symbols/ --world_boundaries ./world_boundaries/

          Тогда mapnik подключится описанным способом, как если бы вы запустили "psql gis" в командной строке (без указания host, username или password).

          Сокращение дискового пространства

          Если вы рендерите всю планету (то есть, bbox = (-180.0, -90.0, 180.0, 90.0)), есть пара вещей, которые могут существенно сократить занимаемое дисковое пространство.

          1. Убедитесь, что бы имеете ровно столько тайлов, соколько вам нужно.
            1. К примеру, максимальное значение x и y для 10 зума равно 1023. Значит, последним тайлом должен быть TILEDIR/10/1023/1023.png.
            2. However, you may have tiles rendered with x and y values beyond that. (I had y values up around 1300)
            3. Delete those first for each zoom level.
          2. На более высоких уровнях зума (8 и далее), многие тайлы дублируются (например пустые океаны и озёра, пространства суши без объектов).
            1. В операционных системах, которые это поддерживают, вы можете создать символические ссылки на наборы тайлов чистой воды и чистой суши.
            2. Но, если Ваша ОС поддерживает, лучше использовать жесткие ссылки , это даст значительно большую экономию места на современных HDD, где размер сектора составляет 4КБ, при размере тайла заливки в 103Б.

          Примеры результатов (мои (athlon02)):

          1. На 9 зуме, было занято 3.8 Гб (if memory serves). Сейчас 1.4 Гб.
          2. На 10 зуме, было занято 12-13 Гб на начало. Сейчас 4.58 Гб.
          3. Ваши значения могут отличаться.

          Конвертация стилей для версий > 2.0.0

          При апгрейде до версии 2.0.0 меняются некоторые спецификации таблицы стилей. Все изменения можно увидеть здесь.
          Стало быть, 'старые' стили тоже надо обновлять.

          С mapnik2 уже идет скрипт (называется 'upgrade_map_xml.py'), который выполняет конвертацию.

          Лежит в этой директории:

          ../$mapnik_home_directory/utils/upgrade_map_xml/
          ./upgrade_map_xml.py ../$mapnik_scripts/old_style.xml ../$mapnik_scripts/new_style.xml

          Или замените старый файл на месте:

          ./upgrade_map_xml.py ../$mapnik_scripts/old_style.xml --in-place

          Настройка рендеринга

          У вас есть работающая стандартная таблица стилей, и вы можете начать настраивать свою карту.

          Контуры

          Есть возможность добавить контуры на вашу карту, как это сделано в cyclemap. Контуры основаны на общедоступных данных SRTM (Shuttle Radar Topograhy Mission) NASA. Также можно добавить отображение рельефа и раскраску высот, если такие данные есть в карте.

          Стили

          Таблица стилей это XML документ, контролирующий большинство аспектов рендеринга объектов, такие как цвет и ширина линий, изображающих различные типы дорог. Aормат не отличается компактностью и простотой восприятия, но зато он мощный и гибкий. В подвижной карте мы используем версию osm.xml, похожую на файл из SVN: applications/rendering/mapnik/osm.xml. Смотрите Mapnik Example для примера более простой таблицы стилей.

          Синтаксис таблицы стилей описан здесь: XMLConfigReference. MinScaleDenominator и MaxScaleDenominator указывают минимальный и максимальный масштабы, на которых должны рендериться определённые символы/объекты.

          Вы можете поиграть с со стилями mapnik онлайн здесь: http://dev.openstreetmap.nl/~panman/styledit/ Ссылка не работает.

          Посмотрите Cascadenik и Spreadnik, если вы планируете разрабатывать комплексные таблицы стилей.
          Для WYSIWYG разработки стилей вы можете использовать QGIS с аддоном mapnik style.

          Региональное отображением имен

          Для рендеринга имён name:* вместо стандартных тегов name там, где они присутствуют, вы можете либо предварительно обработать данные, либо впоследствии изменить базу данных postgis.

          Настройка default.style

          Если вы правите default.style, например, чтобы добавить в базу велосипедные дорожки или транспортные сети, имейте в виду, что osm2pgsql не использует default.style в рабочей директории, вместо этого он ищет /usr/share/osm2pgsql/default.style.

          Можете использовать параметр --style для указания вашего собственного файла default.style. Выполните osm2pgsql -h для дополнительной информации.

          Смотрите также

          • Инструкция на немецком: DE:Ajoessen/Mapnik
          • Mapnik используется фреймворком рендеринга TileMill.
          • Renderd, Tirex в качестве тайл-сервера Mapnik
          • Mapnik2Geotools конвертирует стиль для Geoserver
          • Теневая карта рельефа с использованием mapnik
          • switch2osm.org — руководство как настроить тайловый сервер с помощью Mapnik
          • Синхронизировать базу данных PostgreSQL с изменениями, внесёнными на сервере OpenStreetMap: Minutely Mapnik
          • Nik4 — это скрипт экспорта мапников в изображения
          • Gopnik — тайловый сервер и рендер для скользкой карты на основе библиотеки mapnik
          • Артём Павленко — Секреты Мапника (видео на английском языке с SotM US 2013)
          • RU:LGPL
          • RU:Windows software
          • RU:MacOS software
          • RU:Linux software
          • RU:Cross-platform software
          • RU:C++
          • RU:Python
          • RU:Mapnik

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *