OSRM (Open Source Routing Machine) — это высокоскоростной движок для прокладки маршрутов по дорожным сетям OpenStreetMap (OSM). В предыдущих руководствах мы рассмотрели, как настроить собственный сервер тайлов OpenStreetMap и добавить функцию поиска адресов с помощью Nominatim. В этом руководстве мы расскажем, как интегрировать на вашу карту OpenStreetMap навигационные возможности с использованием OSRM, который поддерживает маршруты для автомобилей, велосипедистов и пешеходов.

Содержание статьи
Требования на начальном этапе
Чтобы воспользоваться данным руководством, необходимо иметь установленный и функционирующий сервер тайлов OSM. Если его у вас нет, выполните инструкции ниже для установки собственного сервера тайлов OSM.
- Как настроить сервер тайлов OpenStreetMap на Ubuntu 22.04
Вам также потребуется доступ к геокодировочному сервису, например, Nominatim, для поиска местоположений по адресам.
- Установка и конфигурация сервера для геокодирования OSM Nominatim на Ubuntu 22.04
После выполнения всех требований, приступайте к настройке сервера OSRM, следуя инструкциям ниже.
Компиляция OSRM из исходных файлов
Установите необходимые пакеты.
sudo apt update sudo apt install build-essential git cmake pkg-config doxygen libboost-all-dev libtbb-dev lua5.2 liblua5.2-dev libluabind-dev libstxxl-dev libstxxl1v5 libxml2 libxml2-dev libosmpbf-dev libbz2-dev libzip-dev libprotobuf-dev
Создайте учетную запись osrm. (Пароль для этого пользователя можно не задавать.)
sudo useradd - d /srv/osrm - s /bin/bash - m osrm
Предоставьте права вашему пользовательскому аккаунту. Замените username на своё реальное имя пользователя в Linux.
sudo apt install acl sudo setfacl - R - m u:username:rwx /srv/osrm/
Перейдите в папку /srv/osrm/.
cd /srv/osrm/
Загрузите исходный код OSRM с его репозитория на GitHub.
git clone https://github.com/Project-OSRM/osrm-backend. git
Создайте папку для компиляции.
mkdir build
Зайдите в этот каталог и настройте окружение для сборки.
cd build cmake /srv/osrm/osrm-backend/
Соберите исходный код. (Если появятся предупреждения TBB: устарело, не обращайте на них внимания.)
make

Загрузите и установите бинарные файлы.
sudo make install
Будут установлены такие бинарные файлы.
- /usr/local/bin/osrm-extract:
- /usr/local/bin/osrm-partition:
- /usr/local/bin/osrm-customize:
- /usr/local/bin/osrm-contract:
- /usr/local/bin/osrm-datastore:
- /usr/local/bin/osrm-routed:
Инсталляция GNU Screen
На следующем этапе потребуется получить дорожные сети из OpenStreetMap, что может занять продолжительное время. Поскольку ваш компьютер может потерять подключение к Интернету, рекомендуется воспользоваться утилитой GNU Screen для поддержания активной сессии. Для этого установите screen на сервере с Ubuntu 22.04:
sudo apt install screen
После этого выполните команду screen:
screen
При первом запуске отобразится вводный текст, и вам нужно будет просто нажать Enter для завершения. После этого можно будет использовать команды в обычном режиме.
Создание данных для маршрутизации в OSRM
Сейчас необходимо загрузить данные OpenStreetMap и подготовить их для маршрутизации. Для этого выполните следующую команду, чтобы скачать карту всего мира (56 ГБ) в формате PBF (ProtoBufBinary).
wget - c http://planet.openstreetmap.org/pbf/planet-latest.osm.pbf - P /srv/osrm/osrm-backend
Если требуется карта конкретной страны, штата, провинции или города, посетите сайт http://download.geofabrik.de. Например, чтобы загрузить данные карты Великобритании (1,7 ГБ), воспользуйтесь следующей командой.
wget - c http://download.geofabrik.de/europe/britain-and-ireland-latest.osm.pbf - P /srv/osrm/osrm-backend
BBBike. org предлагает возможность получать данные для более чем 200 городов и регионов мира в разных форматах.
Убедитесь, что вы находитесь в папке /srv/osrm/osrm-backend/.
cd /srv/osrm/osrm-backend/
Получите граф на основе данных OpenStreetMap.
osrm-extract britain-and-ireland-latest.osm.pbf --threads=10
Профиль car.lua будет использоваться по умолчанию.
Теперь, скорее всего, нет необходимости выполнять дополнительные действия на вашем сервере. Поскольку вы используете Screen, нажмите Ctrl+A, затем отпустите эти клавиши и нажмите D, чтобы отсоединиться от текущей сессии. Вы получите сообщение, похожее на следующее.
[detached from 32113.pts-1.focal]
Это означает, что ID последней сессии Screen равен 32113. Вы можете завершить SSH-сессию и даже выключить устройство. Не переживайте, процесс osrm-extract продолжает выполняться. Когда вы захотите вернуться и отследить прогресс, подключитесь к серверу по SSH и введите следующую команду, чтобы узнать ID предыдущей сессии Screen.
screen - ls
Есть экран: 32113.pts-1.focal (19/05/2020 15:45:29) (Detached) 1 сокет в /run/screen/S-linuxbabe.
После этого вы сможете заново присоединиться к ранее открытому сеансу Screen.
screen - r 32113
Данный процесс требует значительных ресурсов. На моем сервере он задействует 9 ГБ оперативной памяти, а загрузка процессора достигает 6. Я использую карты Британии и Ирландии. Если вы планируете использовать карту всей Земли, потребление оперативной памяти может возрасти до 120 ГБ, поэтому целесообразно создать файл подкачки для расширения доступной памяти.
По окончании процесса будет сформирован файл с идентичным названием, но с расширением. osrm. Для рекурсивного деления этого графа на ячейки выполните следующую команду.
osrm-partition britain-and-ireland-latest.osrm
Отрегулируйте ячейки, определив веса маршрутизации для каждой из них.
osrm-customize britain-and-ireland-latest.osrm
Теперь вы можете включить маршрутизатор.
osrm-routed --algorithm=MLD britain-and-ireland-latest.osrm

Он слушает TCP порт 5000.
Настройка службы systemd
Запустить движок маршрутизации OSRM можно вручную, выполнив команду osrm-routed —algorithm=MLD britain-and-ireland-latest. osrm, однако более удобно запускать osrm-routed в качестве службы systemd, чтобы он работал в фоновом режиме.
Нажмите Ctrl+C для прерывания текущего процесса osrm-routed и выполните команду для создания файла юнита службы systemd для osrm-routed.
sudo nano /etc/systemd/system/osrm-routed.service
Сохраните указанные строки в файл.
[Unit] Description=Open Source Routing Machine Wants=network-online.target After=network.target network-online. target [Service] ExecStart=/usr/local/bin/osrm-routed --algorithm=MLD /srv/osrm/osrm-backend/britain-and-ireland-latest.osrm User=osrm Group=osrm Restart=always RestartSec=5s [Install] WantedBy=multi-user.target
Сохраните файл и закройте его. Измените владельца директории /srv/osrm/osrm-backend/.
sudo chown osrm:osrm /srv/osrm/osrm-backend/ -R
Теперь у нас есть возможность запустить и активировать службу osrm-routed с помощью systemd.
sudo systemctl start osrm-routed sudo systemctl enable osrm-routed
systemctl status osrm-routed

Если служба osrm-routed не запущена, вы можете использовать следующую команду для диагностики проблемы.
sudo journalctl -eu osrm-routed
Конфигурация обратного прокси
Можно настроить веб-сервер Apache или Nginx в качестве обратного прокси для службы osrm-routed, что позволит использовать доменное имя для доступа к маршрутизации, а также добавить поддержку HTTPS для шифрования.
Установите сервер Apache для работы с веб-приложениями.
sudo apt install apache2
Для настройки Apache в качестве обратного прокси необходимо активировать модули proxy, proxy_http и rewrite.
sudo a2enmod proxy proxy_http rewrite
Затем необходимо создать файл виртуального хоста для OSRM.
sudo nano /etc/apache2/sites-available/osrm.conf
Вставьте данный текст в файл. Замените osrm. your-domain.com на ваше реальное доменное имя и обязательно создайте для него DNS A-запись.
ServerName osrm. your-domain.com
на адрес http://127.0.0.1:5000/ и используйте обратный прокси для этого же адреса.
Сохраните файл и закройте его. После этого активируйте данный виртуальный хост.
sudo a2ensite osrm.conf
Перезапустите Apache, чтобы новые настройки начали действовать.
sudo systemctl reload apache2
Теперь у вас есть возможность осуществить удалённый доступ к OSRM, просто введя доменное имя (osrm. your-domain.com) в адресной строке вашего браузера.
Nginx — это широко используемый веб-сервер и прокси-сервер. Чтобы установить Nginx, выполните следующую команду.
sudo apt install nginx
Создайте файл конфигурации сервера для OSRM.
sudo nano /etc/nginx/conf.d/osrm.conf
Добавьте указанный контент в файл, заменив osrm. your-domain.com на ваше реальное доменное имя, и не забудьте создать A-запись DNS для этого домена.
server < listen 80; listen [::]:80; server_name osrm. your-domain.com

