Личный 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, если изменить версию на используемую в скрипте, то ошибок не будет.
26 комментариев
Антон
Cпотыкается на этапе Импорте картографических данных в PostgreSQL (osm2pgsql —create —slim —cache 7000 —number-processes 4 —hstore —style openstreetmap-carto-2.41.0/openstreetmap-carto.style —multi-geometry russia.osm.pbf) выдаёт ошибку osm2pgsql version 0.94.0 (64 bit id space)
Using built-in tag processing pipeline
Using projection SRS 3857 (Spherical Mercator)
Osm2pgsql failed due to ERROR: Connection to database failed: FATAL: database «osm» does not exist
kanitelka
Делали все по порядку? Мне кажется следует проверить две вещи:
1. Под каким пользователем пытаетесь загрузить.
2. Существует ли данная база OSM.
Антон
Всё делал по порядку согласно инструкции. 1) делал под su — osm. и под основной тоже пробовал. 2) Существует, но ошибка пишет обратное.
kanitelka
Версия ubuntu какая установлена?
kanitelka
Попробовал на виртуальной машине загрузить, все проходит без ошибок.
Интересуют следующие вещи:
— какая версия Ubuntu используется
— характеристики сервера (память, количество ядер, объем жесткого диска)
— вывод команды ls (LS) под пользователем osm
Для ускорения процесса тестирования можно использовать не Россию, а другую страну которая меньше по размеру, к примеру Центральную Америку http://download.openstreetmap.fr/extracts/central-america.osm.pbf
Дмитрий
Всё правильно, ошибка и должна возникать, т.к. в инструкции выше мы создаем базу «gis», а пытаемся дальше загрузить данные в базу без указания имени, по умолчанию «osm».
На этапе osm2pgsql нужно дописать к команде название базы —database gis
Олег
VMWare, Debian buster
Ошибка при импорте (Ошибка сегментирования на 111060 k) — Сейчас скачал отдельно Сибирский федеральный округ для проверки.
Ваши мысли?
kanitelka
Олег, импортировали что именно? У меня весь мир так и не загрузился, грузил частями РФ. Самое просто это взять отдельный город и проверить на нем.
Олег
1.
Пытался импортировать карту России:
http://download.openstreetmap.fr/extracts/russia.osm.pbf
http://download.openstreetmap.fr/extracts/russia-latest.osm.pbf
На этапе парсинга (по крайней мере как я понял) вываливает такую ошибку:
Reading in file: russia-latest.osm.pbf
Using PBF parser.
Processing: Node(111110k 159.6k/s) Way(0k 0.00k/s) Relation(0 0.00/s)Ошибка сегментирования
Хотя остальные карты (в моем случае проверял на Сибирском федеральном округе, Центральном Федеральном округе, и кавказе) грузились, хоть и долго (карты брал с того же ресурса)
2. И вот таким макаром грузить весь мир???
3. Дальше пока не шел, решил проверить карты и у меня как раз закончился рабочий день =)
Сейчас попробую следующие шаги
Олег
git clone https://github.com/openstreetmap/mod_tile.gitcd mod_tile/
поправить на
git clone https://github.com/openstreetmap/mod_tile.git && cd mod_tile/
kanitelka
Олег коррективы внес! Спасибо.
По поводу полной РФ были проблемы, как вариант пробовать грузить областями.
Олег, а не пробовали использовать скрипт автоматической установки, который расположен на гитхабе, в конце статьи есть ссылка на него.
Евгений
Спасибо за материал. Вроде всё сделал по инструкции, ошибок не было, однако
The requested URL was not found on this server при попытке доступиться к server-ip/osm_tiles/0/0/0.png
kanitelka
А при простом обращении к Apache по адресу server-ip выдает что то?
Евгений
Да, выдаёт стартовую страницу apache. Папка osm_tiles должна находиться в sites-available?
kanitelka
Нет. Проверьте правильно ли сконфигурирован Apache. Может допустили ошибку.
Илья
В чем может быть проблема?
root@osm01:~/mod_tile/mod_tile# make
depbase=
echo src/daemon.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'
;\gcc -DHAVE_CONFIG_H -I. -I./includes -pthread -g -O2 -MT src/daemon.o -MD -MP -MF $depbase.Tpo -c -o src/daemon.o src/daemon.c &&\
mv -f $depbase.Tpo $depbase.Po
src/daemon.c:47:10: fatal error: iniparser/iniparser.h: No such file or directory
#include
^~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
Makefile:823: recipe for target ‘src/daemon.o’ failed
make: *** [src/daemon.o] Error 1
kanitelka
Версия ОС какая?
Максим
Та, которая указанна. Что делать то?
Семен
мне помогло apt install libiniparser-dev
Эльдар
У меня версия системы ubuntu 16.04 не устанавливается откуда вы устоновили ?
Turan
А как вы устоновили и меня версия системы Ubuntu server 16.04 не устононавливается говорит не найден пакет , как решили проблему
Elnur
Здраствуйте,Спасибо за гайд последний раз кто пробоват этот гайд рабочий ? Мне нужно поднять сервер карту мира ,этот гайд подойдет в моем случае
kanitelka
Он 2019 года, возможно заработает. Нужно проверять, но скорей всего 16 Ubuntu уже не потянет, я бы смотрел в сторону 20 версии.
Эльнур
С помошью этого мануала я могу скачать всю карту мира , например из сайта planet.osm.org
ELNUR
А есть рабочий гайд или этим способом сделать ?
kanitelka
Я бы попробовал, но гарантии нет. Смотрите дополнительно комментарии, там были дельные советы если не работает.
Когда я делал в 2019 году, у меня часть карт работала. Полностью мир не заработал!