Создание тайлового сервера на основе данных OpenStreetMap и mod tile

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Эта страница является черновиком статьи.


Рассматривается процесс создания собственного тайлового сервера на основе данных OpenStreetMap в операционной системе CentOS 6.

Введение

На сегодняшний день в подавляющем большинство картографических веб-приложений в качестве одной из подложек используется слой на базе тайлов OpenStreetMap. Такая популярность данной подложки обусловлена во-первых политикой предоставления тайлов, позволяющей свободно использовать тайлы OpenStreetMap в своих приложениях, а во-вторых - простотой их подключения в современных веб-клиентах, таких как Leaflet и OpenLayers.

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

Стек программных продуктов тайлового сервера openstreetmap.org

Существуют различные инструменты создания тайловых серверов со своими плюсами и минусами, мы же рассмотрим данный процесс в разрезе стека технологий, применяемых для создания тайлов на сервере openstreetmap.org. Данный стек состоит из 5 компонентов: mod_tile, renderd, Mapnik, osm2pgsql и PostgreSQL/PostGIS. mod_tile - это модуль веб-сервера Apache, который отдаёт кэшированные тайлы и определяет нуждаются ли те или иные тайлы в отрисовке (в зависимости от того есть ли они в кэше и не истек ли срок их актуальности). renderd представляет собой систему управления очередью запросов на рендеринг, предназначенную для оптимизации нагрузки такими запросами. Mapnik - рендерер, используемый renderd. osm2pgsql - инструмент загрузки исходных данных OpenStreetMap в базу данных PostgreSQL/PostGIS.

Данный стек технологий работает только в UNIX-подобных операционных системах и не работает в Windows, так как использует для связи mod_tile и renderd доменные сокеты Unix.

Если в качестве операционной системы вы планируете использовать Debian или Ubuntu, то вам лучше обратиться к инструкции по развертыванию тайлового сервера для данных операционных систем из пакетов. На том же ресурсе имеется инструкция как развернуть тайловый сервер на Ubuntu (Debian) из исходных кодов. В случае же если ваша операционная система отличается от вышеназванных, то полностью следовать описанным в них шагам не получится, так как некоторые из них довольно Debian-специфичны. Вот тут, возможно, и пригодится вам данная статья.

Установка программного обеспечения

В качестве базового дистрибутива мы будем рассматривать операционную систему CentOS 6 x86_64. Так как большинство из необходимого ПО (mod_tile, renderd, Mapnik, osm2pgsql) для данной операционной системы отсутствуют (либо устарели), а ставить из исходных кодов не очень хорошо, то предварительно соберем их в RPM-пакеты. Для их удобной установки нами был организован тестовый репозиторий. Как его подключить и работать с ним будет рассмотрено далее.

Подключение необходимых репозиториев

Подключаем репозиторий EPEL 6:

yum localinstall http://fedora-mirror01.rbc.ru/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Подключаем репозиторий с PostgreSQL:

yum localinstall http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-centos93-9.3-1.noarch.rpm

В файле конфигурации стандартного репозитория, раположенного по адресу /etc/yum.repos.d/CentOS-Base.repo в секции [base] и [updates] добавьте строку:

exclude=postgresql*

Подключаем репозиторий enetres, содержащий свежую версию библиотеку Boost C++ 1.55, используемую при сборке Mapnik. Для подключения данного репозитория скопируйте файл в директорию /etc/yum.repos.d/.

Подключаем репозиторий nextgis: скопируйте файл в директорию /etc/yum.repos.d/.

Установка PostgreSQL/PostGIS

Устанавливаем PostgreSQL:

yum install postgresql93-server
service postgresql-9.3 initdb
service postgresql-9.3 start
chkconfig postgresql-9.3 on

Устанавливаем PostGIS:

yum install postgis2_93

Установка mod_tile, renderd, Mapnik, osm2pgsql

Устанавливаем основные инструменты:

yum install apache2-mod_tile renderd mapnik mapnik-python osm2pgsql

Создание базы данных и загрузка данных

Создаём суперпользователя от имени которого будет вестись работа с базой данных(назовём его dr, а базу данных gis):

su - postgres -c "createuser dr -s -P -e"
su - postgres -c "createdb -E UTF8 -O dr gis"

Загружаем функции PostGIS:

su - postgres -c "psql -d gis -c 'CREATE EXTENSION postgis;'"
su - postgres -c "psql -d gis -c 'ALTER TABLE geometry_columns OWNER TO dr;'"
su - postgres -c "psql -d gis -c 'ALTER TABLE spatial_ref_sys OWNER TO dr;'"

Загружаем данные в базу. Будем загружать данные на территорию СНГ:

mkdir ~/src
cd ~/src
wget http://data.gis-lab.info/osm_dump/dump/latest/local.osm.pbf
osm2pgsql -U dr -W --slim -C 1500 --number-processes 4 -d gis --drop local.osm.pbf

При использовании osm2pgsql мы указали объём выделяемой оперативной памяти 1.5 Гб (-C 1500), включили slim-режим (--slim, подробности о режимах загрузки данных можно найти в документации) и активировали загрузку в 4 процесса (--number-processes 4). Кроме того, так как мы не планируем diff-обновления наших данных, то используя ключ --drop, мы автоматически удаляем создаваемые при загрузке данных slim-таблицы, что значительно уменьшает размер нашей базы данных. Загрузка данных будет продолжаться несколько часов, сколько конкретно - зависит от аппаратной част и настроек программного обеспечения, более подробную информацию можно получить в данной презентации.


Настройка стилей Mapnik

В качестве стилей тайлов будем использовать стандартный стиль OpenStreetMap. Скачиваем файлы с описанием стиля:

cd ~/src
svn co http://svn.openstreetmap.org/applications/rendering/mapnik mapnik-style

Стандартный файл стилей Mapnik подразумевает, что для создания тайлов, содержащих береговые линии и территории, занимаемые океанами, на мелких масштабах используются отдельные файлы, а не данные из базы, поскольку так гораздо быстрее. Загружаем эти файлы (порядка 400 Мб):

cd ~/src/mapnik-style
./get-coastlines.sh /usr/local/share

При выполнении данной команды вы получите сообщение об ошибке следующего вида:

bunzip2 is not installed in /bin/bunzip2, it is needed by this script

Чтобы узнать, куда у вас в системе установлен bunzip2, выполните команду:

which bunzip2

После чего откройте файл get-coastlines.sh и отредактируйте следующую строку:

BUNZIP2=/bin/bunzip2

В нашем случае она будет выглядеть так:

BUNZIP2=/usr/bin/bunzip2

После этого снова запускайте этот файл. Должен начаться процесс загрузки данных:

./get-coastlines.sh /usr/local/share

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

cd ~/src/mapnik-style/inc
cp fontset-settings.xml.inc.template fontset-settings.xml.inc
cp datasource-settings.xml.inc.template datasource-settings.xml.inc
cp settings.xml.inc.template settings.xml.inc

Открываем файл settings.xml.inc и приводим его к следующему виду:

<!--
Settings for symbols, the spatial reference of your postgis tables, coastline shapefiles directory, and their prefix names.
-->

<!-- use 'symbols' unless you have moved the symbols directory -->
<!ENTITY symbols "symbols">

<!-- use the '&srs900913;' entity if you have called osm2pgsql without special flags (or with -m); use '&srs4326;' if you have used -l -->
<!ENTITY osm2pgsql_projection "&srs900913;">

<!-- used for 'node in way' ST_DWithin spatial operations -->
<!-- Use 0.1 (meters) when your database is in 900913     -->
<!-- Use 0.000001 (degrees) when your database is in 4326 -->
<!ENTITY dwithin_900913 "0.1">
<!ENTITY dwithin_4326 "0.00001">
<!ENTITY dwithin_node_way "&dwithin_900913;">

<!-- use 'world_boundaries', which is the usual naming for the local folder the coastline shapefiles are unzipped into -->
<!ENTITY world_boundaries "/usr/local/share/world_boundaries">

<!-- use 'planet_osm' unless you have customized your database table prefix using the osm2pgsql 'prefix' flag -->
<!ENTITY prefix "planet_osm">

Открываем файл datasource-settings.xml.inc и приводим его к следующему виду (указав собственный пароль и охват, соответствующий загруженным в базу данным):

<!--
Settings for your postgres setup.

Note: feel free to leave password, host, port, or use blank
-->

<Parameter name="type">postgis</Parameter>
<Parameter name="password">Ijdg83wk</Parameter>
<!-- <Parameter name="host">%(host)s</Parameter> -->
<!-- <Parameter name="port">%(port)s</Parameter> -->
<Parameter name="user">dr</Parameter>
<Parameter name="dbname">gis</Parameter>
<!-- this should be 'false' if you are manually providing the 'extent' -->
<Parameter name="estimate_extent">false</Parameter>
<!-- manually provided extent in epsg 900913 for whole globe -->
<!-- providing this speeds up Mapnik database queries -->
<Parameter name="extent">-20037508.33,4183149.83,20037508.34,17014106.