Установка и настройка генератора тайлов на основе 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

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

[UPD] Также можно найти прекрасный мануал здесь switch2osm.org/serving-tiles/manually-building-a-tile-server
Поделиться публикацией

Комментарии 13

    +1
    Выгрузки России и отдельных регионов лучше брать на гис-лабе (они собираются ежедневно).

    А в скриптах, скачиваемых с svn.osm.org, есть polytiles.py, который поддерживает командную строку и умеет много чего полезного.
      +1
      +1
      Ух в 2009м году помню неделю потратил, чтоб всё поднять и развернуть
        0
        Ага, а на самом деле буквально часа два)
        0
        С генерацией тайлов вроде всё ясно, а как быть с поиском?
          0
          Искать внутри OSM файла объект и координаты через потоки.
          0
          Искать внутри OSM файла объект и координаты через потоки.
            0
            Следую инструкции и обнаружил ошибку, поправьте пожалуйста вот это:

            «Скачиваем файл правильного формата.

            $ wget „trac.openstreetmap.org/browser/applications/utils/export/osm2pgsql/default.style“»

            Это ссылка на html страницу, а на на стиль.
              0
              Спасибо, что заметили!

              wget http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/default.style
                0
                Отличная статья кстати! Делали все на Debian и использовали Mapnik 2.0 и все завелось!
              0
              Если не заметить сразу то скачаешь страницу со всеми вытекающими последствиями.
                0
                Спасибо, доходчиво и понятно

                мои 5 копеек:
                собирал на ubuntu 13.04 — стали вылезать какие-то поломанные зависимости (postgis хочет libgdal1h, а mapnik — libgdal1) в итоге postgis поставил из пакетоы, а собрал мапник из исходников — заработало

                и можно в generate_tiles.py не хардкодить пути, а задавать их через переменные окружения — MAPNIK_MAP_FILE и MAPNIK_TILE_DIR

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

                Самое читаемое