Личный OpenStreetMap (OSM)
Последний раз наткнулся на такое сообщение: «В diaspora* wiki для подминов написано, что запуск собственного сервера diaspora* требует технических умений и времени.» Эта цитата с хабра лучше всего опишет данный мануал по установке и настройке OpenStreetMap.
Если решили установить свой OpenStreetMap, значит вам это нужно либо по работе, либо по личной цели, иных причин использовать свою карту в принципе и нет. Но раз потребность возникла, значит придется пройти трудный путь. Идею пройти данный путь подкинул azbukait, думаю без него этот мануал не появился бы на свет.
Для начала нам нужен сервер, в качестве операционной системы будем использовать Ubuntu 16.04, железная часть будет следующая:
- Core i3
- 8 Gb
- SSD 256 Gb
По большей части (95%) операций будет выполняться под пользователем root.
Обновление.
Проверим обновление для системы и при необходимости произведем обновление.
|
1 |
sudo apt update && apt upgrade -y |
PostgreSQL и PostGIS.
Мы будем использовать PostgreSQL для хранения картографических данных. PostGIS — это геопространственное расширение для PostgreSQL.
|
1 |
sudo apt install postgresql postgresql-contrib postgis postgresql-9.5-postgis-2.2 -y |
Пользователь postgres будет создан в ОС в процессе установки. Это суперпользователь для сервера баз данных PostgreSQL. По умолчанию у этого пользователя нет пароля и нет необходимости его устанавливать, так как для переключения на пользователя postgres можно использовать sudo:
|
1 |
sudo -u postgres -i |
Теперь создаем пользователя базы данных PostgreSQL — osm.
|
1 |
createuser osm |
Далее создаем базу данных с именем gis и одновременно с эти делаем osm владельцем базы данных. -E UTF8 определяет схему кодировки символов, которая будет использоваться в базе данных.
|
1 |
createdb -E UTF8 -O osm gis |
Создаем расширение hstore и postgis в базе данных gis.
|
1 2 |
psql -c "CREATE EXTENSION hstore;" -d gis psql -c "CREATE EXTENSION postgis;" -d gis |
После выходим из пользователя postgres.
|
1 |
exit |
Пользователь OSM.
Создаем пользователя osm в операционной системе, чтобы сервер мог работать от имени пользователя osm.
|
1 |
sudo adduser osm |
Попросит ввести личные данные и пароль для нового пользователя.
Стили и картографические данные.
Скачиваем таблицу стилей и картографические данные. Это необходимо делать под пользователем osm.
|
1 2 3 4 |
su - osm wget https://github.com/gravitystorm/openstreetmap-carto/archive/v2.41.0.tar.gz tar xvf v2.41.0.tar.gz wget -c http://download.openstreetmap.fr/extracts/russia.osm.pbf |
Ключ -с используется для продолжения закачки при обрыве связи.
|
1 |
exit |
Увеличиваем Swapfile.
Импорт картографических данных занимает много оперативной памяти. Если памяти мало, можно добавить файл подкачки. Делим память на 2 и получаем 4. После перезагрузки файл подкачки вернется в значение по умолчанию.
|
1 |
sudo fallocate -l 4G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile |
Настраиваем SSH.
Процесс импорта может занять некоторое время. Настроим поддержку активности SSH, чтобы не потерять подключение SSH.
|
1 |
echo -e "ServerAliveInterval 60">>/etc/ssh/ssh_config |
Импорт картографических данных в PostgreSQL.
|
1 2 3 |
sudo apt install osm2pgsql -y su - osm osm2pgsql --create --slim --cache 7000 --number-processes 4 --hstore --style openstreetmap-carto-2.41.0/openstreetmap-carto.style --multi-geometry russia.osm.pbf |
- —create — очищает базу и добавляет новые данные;
- —append — не очищает базу и добавляет новые данные;
- —slim — указывает osm2pgsql создавать “тонкие” таблицы для хранения данных при импорте, а не пытаться хранить все в памяти. —slim также необходим, если мы хотим обновить данные;
- —cache — больший размер кэша приводит к более быстрой скорости импорта, но нужно иметь достаточно оперативной памяти для использования кэша;
- —number-processes — количество ядер используемых у процессора;
- —hstore — это хранилище ключей и значений, поддерживающее произвольные ключи и значения;
- —style — путь к файлу стиля, который сообщает osm2pgsql, какие столбцы создавать;
- —multi-geometry — указывает osm2pgsql не разбивать мультиполигоны на отдельные полигоны. Это повышает гибкость и устраняет некоторые артефакты визуализации, но немного медленнее.
При загрузке потребуется некоторое время, чтобы построить индексы, поэтому может показаться, что в конце ничего не происходит. Проверить, что происходит в базе данных можно с помощью команды — pg_top -d (sudo apt install pgtop).
Понять, что импорт завершен, можно увидев следующее сообщение:
Импорт завершен.
Osm2pgsql took 15496s overall
Импорт занимает достаточное время, к примеру Россия занимает до 8 часов! После импорта, выходим из пользователя OSM.
|
1 |
exit |
Установка модуля mod_tile.
mod_tile — это модуль Apache, необходимый для обслуживания плиток карт.
|
1 2 3 4 5 6 7 |
sudo apt install git autoconf libtool libmapnik-dev apache2-dev -y git clone https://github.com/openstreetmap/mod_tile.git && cd mod_tile/ ./autogen.sh ./configure make sudo make install sudo make install-mod_tile |
Создание таблицы стилей Mapnik.
|
1 |
sudo apt install curl unzip gdal-bin mapnik-utils node-carto -y |
Шрифты необходимые для стилей.
sudo apt-get install fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted ttf-unifont -y
|
1 2 3 4 5 |
su - osm cd openstreetmap-carto-2.41.0/ ./get-shapefiles.sh carto project.mml > style.xml exit |
Настройка renderd
Вносим изменения в конфигурационный файл:
|
1 |
sudo nano /usr/local/etc/renderd.conf |
В секцию [default] вносим следующие изменения:
|
1 2 |
XML=/home/osm/openstreetmap-carto-2.41.0/style.xml HOST=localhost |
В секцию [mapnik] вносим следующие изменения:
|
1 |
plugins_dir=/usr/lib/mapnik/3.0/input/ |
Сохраняем файл.
Теперь необходимо поправить настройки запуска renderd, скопировав пример.
|
1 2 3 |
cd ~ sudo cp mod_tile/debian/renderd.init /etc/init.d/renderd sudo chmod a+x /etc/init.d/renderd |
Внесем изменения в скрипт запуска:
|
1 2 3 4 5 |
sudo nano /etc/init.d/renderd DAEMON=/usr/local/bin/$NAME DAEMON_ARGS="-c /usr/local/etc/renderd.conf" RUNASUSER=osm |
Создаем файл и делаем владельцем этого файла пользователя — osm.
|
1 2 |
sudo mkdir -p /var/lib/mod_tile sudo chown osm:osm /var/lib/mod_tile |
Запускаем службу визуализации
|
1 2 3 4 |
sudo systemctl daemon-reload sudo systemctl start renderd /lib/systemd/systemd-sysv-install enable renderd sudo systemctl enable renderd |
Настройка Apache
Установка Apache web server
|
1 |
sudo apt install apache2 -y |
Создаем файл загрузки модуля.
|
1 |
echo -e "LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so">>/etc/apache2/mods-available/mod_tile.load |
Создаем символьную ссылку
|
1 |
sudo ln -s /etc/apache2/mods-available/mod_tile.load /etc/apache2/mods-enabled/ |
Редактируем файл виртуальных хостов.
|
1 |
sudo nano /etc/apache2/sites-enabled/000-default.conf |
Вставляем в раздел <VirtualHost *:80> следующие строки:
|
1 2 3 4 5 6 |
LoadTileConfigFile /usr/local/etc/renderd.conf ModTileRenderdSocketName /var/run/renderd/renderd.sock # Timeout before giving up for a tile to be rendered ModTileRequestTimeout 0 # Timeout before giving up for a tile to be rendered that is otherwise missing ModTileMissingRequestTimeout 30 |
Сохраняем файл и перезапускаем Apache
|
1 |
sudo systemctl restart apache2 |
Проверка работы карты.
Открываем браузер и переходим по адресу:
server-ip/osm_tiles/0/0/0.png
Если открывается карта, то все настроено верно.
Отображение карты.
Для отображения карты OpenStretMap можно использовать два варианта — OpenLayer and Leaflet. В своем примере буду использовать Leaflet.
|
1 2 3 |
cd /var/www/html/ sudo wget http://cdn.leafletjs.com/leaflet/v1.4.0/leaflet.zip sudo unzip leaflet.zip |
Делаем на всякий случай резервную копию файла index.
|
1 |
cp /var/www/html/index.html /var/www/html/index2.html |
Удаляем старый файл index.
|
1 |
rm /var/www/html/index.html |
Создаем свою страничку с картой.
|
1 |
sudo nano /var/www/html/index.html |
В качестве примера используем Leaflet, страну Россия, город Москва.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<html> <head> <title>My first osm</title> <link rel="stylesheet" type="text/css" href="leaflet.css"/> <script type="text/javascript" src="leaflet.js"></script> <style> #map{width:100%;height:100%} </style> </head> <body> <div id="map"></div> <script> var map = L.map('map').setView([53.555,9.899],5); L.tileLayer('http://server-ip/osm_tiles/{z}/{x}/{y}.png',{maxZoom:18}).addTo(map); </script> </body> </html> |
Строчку server-ip заменяем на адрес своего сервера. Теперь открыв адрес своего сервера в браузере можно увидеть карту:
В итоге получаем свой собственный сервер карт. Для чего он нужен? Ну тут уже каждый сам решает, как я в принципе упоминал выше. Многие скажут зачем, когда можно использовать Яндекс или Гугл, но количество запросов к карте ограниченно в бесплатной версии.
Так же можно использовать готовый скрипт с github, но как показала практика последнего использования, в нем есть ошибка. По крайней мере в версии для Ubuntu 16 она точно есть, остальные не проверял.
Osm2pqsql failed due to ERROR: Couldn’t open style file ‘/usr/local/share/maps/style/openstreetmap-carto-3.0.x/openstreetmap-carto.style’: No such file directory
Ошибка заключается в определении версии openstreetmap carto, если изменить версию на используемую в скрипте, то ошибок не будет.



