- PVSM.RU - https://www.pvsm.ru -

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

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

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

Не считая необходимых зависимостей, в общем случае нам понадобятся

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

Установка PostgreSQL

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

$ sudo apt-cache show postgresql

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

$ sudo apt-get install postgresql

В противном случае, скачиваем пакет с официального сайта www.postgresql.org/download/linux/ [2] и устанавливаем его. Далее нам надо настроить нашу базу данных. По умолчанию её пользователь — это 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 "https://trac.openstreetmap.org/browser/applications/utils/export/osm2pgsql/default.style"

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

$ sudo cp "./default.style" "/usr/share/osm2pgsql/default.style"

Установка скриптов от OpenStreetMap для генерации тайлов

Репозитарий OpenStreetMap svn.openstreetmap.org [3] содержит немало скриптов и утилит по картографической тематике. Нам понадобится одно из приложений, написанное на 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 [4]
Можно, конечно, скачать весь файл 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

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

Автор: IBobko


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/postgresql/8453

Ссылки в тексте:

[1] mapnik: http://mapnik.org/

[2] www.postgresql.org/download/linux/: http://www.postgresql.org/download/linux/

[3] svn.openstreetmap.org: http://svn.openstreetmap.org

[4] wiki.openstreetmap.org/wiki/Planet.osm: http://wiki.openstreetmap.org/wiki/Planet.osm