Тайл-сервер является основным инструментом для генерации и предоставления тайлов пользователям в мире OpenStreetMap. Это набор программ и библиотек, позволяющий эффективно обрабатывать географические данные и создавать картографические тайлы, представляющие собой небольшие изображения карты для отображения на веб-сайтах или мобильных приложениях. Важно понимать, что существует несколько различных конфигураций тайл-серверов, каждая из которых имеет свои плюсы и минусы.
Руководство по запуску стандартного тайл-сервера, аналогичного тому, используемому на серверах OpenStreetMap.org, может быть полезным для тех, кто только начинает знакомиться с этой областью. Обычно такие инструкции включают в себя установку необходимого программного обеспечения, настройку базы данных геоданных, настройку веб-сервера и самого тайл-сервера, а также запуск и тестирование процесса генерации тайлов.
В результате выполнения всех необходимых шагов по установке и настройке тайл-сервера, пользователь сможет получить доступ к генерируемым тайлам через веб-приложения или мобильные устройства. Это отличное решение для тех, кто хочет создать собственный проект на основе картографических данных OpenStreetMap и обеспечить пользователям доступ к персонализированным картам.
В данном руководстве установка программного обеспечения производиться на оборудование следующей конфигурации:
Конфигурация вашего оборудавания будет соответственно отличаться, но это так-же будет работать, заняв больше времени при установке и рендере карт на устройстве с минимальными параметрами:
Все ниже написанное относиться к Ubuntu Server 20.04 (Focal Fossa) и протестировано в августе 2024 года.
Примечание: В этом руководстве многое загружается с альтернативных, а не с официальных зеркал, по причине скорости загрузки и неизменности файлов в репозитории для данного руководства.
Tile Server OSM представляет собой набор программ и библиотек, которые работают вместе для создания тайлового (плиточного) сервера. Он состоит из 5 основных компонентов:
Postgresql/postgis - базы данных. Mod_tile — это модуль http сервера apache, который обслуживает кэшированные тайлы и решает, какие тайлы нуждаются в повторном рендеринге — либо потому, что они еще не кэшированы, либо потому, что они устарели. Mapnik — это программная библиотека, которая осуществляет реальный рендеринг с использованием открытого рендеринга.
Предполагается, что вы запускаете все от пользователя без регистрации root через «sudo». Имя пользователя без root, повторяемое по умолчанию, — «eva». Если вы указываете иного пользователя, то вам необходимо будет заменить во всех командах на свое имя и добавить его в группу пользователей, которые могут использовать sudo для получения root-прав. Из вашей обычной учетной записи пользователя без регистрации root.
Общая последовательнось действий:
sudo apt --yes update; sudo apt --yes upgrade -y
sudo apt --yes install screen libboost-all-dev git tar unzip wget bzip2 build-essential autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node munin protobuf-c-compiler libfreetype6-dev libtiff5-dev libicu-dev libgdal-dev libcairo2-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont lua5.1 liblua5.1-0-dev
sudo apt --yes install postgresql postgresql-contrib postgis postgresql-12-postgis-3 postgresql-12-postgis-3-scripts
sudo service postgresql restart
pg_isready
sudo -u postgres -i
createuser eva
createdb -E UTF8 -O eva gis
psql
\c gis
CREATE EXTENSION postgis; CREATE EXTENSION hstore; ALTER TABLE geometry_columns OWNER TO eva; ALTER TABLE spatial_ref_sys OWNER TO eva;
(ответ CREATE EXTENSION)
(ответ CREATE EXTENSION)
(ответ ALTER TABLE)
(ответ ALTER TABLE)
\q
exit
sudo useradd -m eva
sudo passwd eva
sudo apt --yes install autoconf apache2-dev libtool libxml2-dev libbz2-dev libgeos-dev libgeos++-dev libproj-dev gdal-bin libmapnik-dev mapnik-utils python3-mapnik python3-psycopg2 python3-yaml
python3
import mapnik
quit()
mkdir ~/src cd ~/src
Примечание: В этом руководстве mod_tile загружается с альтернативных, а не с официальных зеркал (https://github.com/SomeoneElseOSM/mod_tile.git), по причине неизменности файлов в репозитории для данного руководства.
git clone -b switch2osm https://git.wwoss.ru/root/mod_tile.git
cd mod_tile
./autogen.sh
./configure
make
sudo make install
sudo make install-mod_tile
sudo ldconfig
cd ~/src
Примечание: В этом руководстве openstreetmap-carto загружается с альтернативных, а не с официальных зеркал (https://github.com/gravitystorm/openstreetmap-carto), по причине неизменности файлов openstreetmap-carto в репозитории для данного руководства.
git clone https://git.wwoss.ru/root/openstreetmap-carto.git
cd openstreetmap-carto
sudo apt --yes install npm
sudo npm install -g carto
carto -v
carto project.mml > mapnik.xml
Примечание: все предупреждения
Warning: style/admin.mss:22:18 Styles do not match layer selector #admin-low-zoom.
Warning: style/admin.mss:18:6 Styles do not match layer selector #admin-low-zoom.
Игнорируем
mkdir ~/data cd ~/data
Примечание: В этом руководстве файлы «.osm.pbf» загружается с альтернативных, а не с официальных зеркал (https://download.geofabrik.de/), по причине скорости загрузки с данного репозитория для данного руководства.
Последовательность: Сейчас мы загрузим 3 небольшие карты (georgia, moldova и azerbaijan), произведем их слияние (для понимания и наглядного примера слияния) и с ними продолжим установку и настройку сервера. Так-же загрузим небольшую карту (andorra) для примера дозагрузки карт в базу и конечно карты Europe (28.9 GB) и Asia (13.1 GB). Europe и Asia поставим на слияние и загрузим в базу в конце статьи, на уже подготовленный нами и проверенный (рабочий) сервер.
wget https://wwoss.ru/openstreetmap/europe/europe-sub-region/georgia-latest.osm.pbf wget https://wwoss.ru/openstreetmap/europe/europe-sub-region/moldova-latest.osm.pbf wget https://wwoss.ru/openstreetmap/asia/asia-sub-region/azerbaijan-latest.osm.pbf wget https://wwoss.ru/openstreetmap/europe/europe-sub-region/andorra-latest.osm.pbf wget https://wwoss.ru/openstreetmap/europe/europe-latest.osm.pbf wget https://wwoss.ru/openstreetmap/asia/asia-latest.osm.pbf
sudo apt install osmctools
cd ~/data osmconvert georgia-latest.osm.pbf --out-o5m | osmconvert - moldova-latest.osm.pbf -o=new-latest.osm.pbf
osmconvert azerbaijan-latest.osm.pbf --out-o5m | osmconvert - new-latest.osm.pbf -o=new.osm.pbf
cd ~/data osm2pgsql -d gis --create --slim -G --hstore --tag-transform-script ~/src/openstreetmap-carto/openstreetmap-carto.lua -C 64000 --number-processes 8 -S ~/src/openstreetmap-carto/openstreetmap-carto.style ~/data/new.osm.pbf
Дополнение: Откроем второе окно программы Putty и поставим слияник карт Europe и Asia, чтобы к концу статьи у нас уже был объедененный файл «eurasia.osm.pbf»
cd ~/data osmconvert europe-latest.osm.pbf --out-o5m | osmconvert - asia-latest.osm.pbf -o=eurasia.osm.pbf
Внимание!: Этот шаг выполняеся только в случае необходимости дозагрузки в готовую базу данных дополнительных файлов, в нашем случае сейчас пропустим этот подраздел, перейдем в радел "Создание индексов" и вернемся сюда в конце статьи при уже настроенном сервере. (этот шаг указан в этом разделе т.к команды эдинтичные с разницей в способе загрузки (--create/--append)).
cd ~/data osm2pgsql -d gis --append --slim -G --hstore --tag-transform-script ~/src/openstreetmap-carto/openstreetmap-carto.lua -C 64000 --number-processes 8 -S ~/src/openstreetmap-carto/openstreetmap-carto.style ~/data/andorra-latest.osm.pbf
Командные опции:
должна завершится чем-то вроде «Osm2pgsql в целом занял 312 секунд».
cd ~/src/openstreetmap-carto/
scripts/get-external-data.py
cd ~/src/openstreetmap-carto/
scripts/get-external-data.py
cd ~/src/openstreetmap-carto/
scripts/get-fonts.sh
sudo nano /usr/local/etc/renderd.conf
sudo mkdir /var/lib/mod_tile
sudo chown eva /var/lib/mod_tile
sudo mkdir /var/run/renderd
sudo chown eva /var/run/renderd
sudo nano /etc/apache2/conf-available/mod_tile.conf
LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so
sudo a2enconf mod_tile
systemctl start apache2
systemctl reload apache2
sudo nano /etc/apache2/sites-available/000-default.conf
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
service apache2 reload
sudo -u 'eva' renderd -f -c /usr/local/etc/renderd.conf
systemctl stop renderd
cd ~/data osm2pgsql -d gis --append --slim -G --hstore --tag-transform-script ~/src/openstreetmap-carto/openstreetmap-carto.lua -C 64000 --number-processes 8 -S ~/src/openstreetmap-carto/openstreetmap-carto.style ~/data/andorra-latest.osm.pbf
sudo -u 'eva' renderd -f -c /usr/local/etc/renderd.conf
Примечание:Иногда рендер идет с командой, т.е. без sudo -u 'eva'
renderd -f -c /usr/local/etc/renderd.conf
systemctl stop renderd
nano ~/src/mod_tile/debian/renderd.init
sudo cp ~/src/mod_tile/debian/renderd.init /etc/init.d/renderd
sudo chmod u+x /etc/init.d/renderd
sudo cp ~/src/mod_tile/debian/renderd.service /lib/systemd/system/
sudo /etc/init.d/renderd start
sudo systemctl enable renderd
cd ~/data ls -n
sudo rm andorra-latest.osm.pbf sudo rm asia-latest.osm.pbf sudo rm azerbaijan-latest.osm.pbf sudo rm europe-latest.osm.pbf sudo rm georgia-latest.osm.pbf sudo rm moldova-latest.osm.pbf sudo rm new-latest.osm.pbf sudo rm new.osm.pbf
ls -n
cd ~/data osm2pgsql -d gis --create --slim -G --hstore --tag-transform-script ~/src/openstreetmap-carto/openstreetmap-carto.lua -C 64000 --number-processes 8 -S ~/src/openstreetmap-carto/openstreetmap-carto.style ~/data/eurasia.osm.pbf
sudo -u eva render_list -a -n 16 --map=ajt --tile-dir=/var/lib/mod_tile/ajt --min-zoom=0 --max-zoom=10 --force
Использование: render_list [ОПЦИЯ] ... -a, --all визуализировать все плитки в заданном диапазоне масштабирования вместо чтения из STDIN -f, --force отображать плитки, даже если они кажутся текущими -m, --map=MAP отображает тайлы на этой карте (по умолчанию «по умолчанию») -l, --max-load=ЗАГРУЗИТЬ спящий режим, если нагрузка настолько высока (по умолчанию 16) -s, --socket=SOCKET имя доменного сокета unix для связи с renderd -n, --num-threads=N количество параллельных потоков запросов (по умолчанию 1) -t, --tile-dir Каталог тайлового кэша (по умолчанию «/var/lib/mod_tile») -z, --min-zoom=Ввод фильтра ZOOM для рендеринга только тех фрагментов, которые больше или равны этому уровню масштабирования (по умолчанию – 0) -Z, --max-zoom=Ввод фильтра ZOOM для рендеринга только плиток, меньших или равных этому уровню масштабирования (по умолчанию — 20) Если вы используете --all, вы можете ограничить диапазон плиток, добавив следующие параметры: -x, --min-x=X минимальная координата X плитки -X, --max-x=X максимальная координата X тайла -y, --min-y=Y минимальная координата Y тайла -Y, --max-y=Y максимальная координата тайла Y Без --all отправить список тайлов для рендеринга из STDIN в формате: Х Y Я например 0 0 1 0 1 1 1 0 1 1 1 1 Вышеупомянутое приведет к отображению всех 4 плиток при масштабировании 1.