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

Содержание статьи
Требования
Чтобы следовать этому руководству, необходимо иметь запущенный сервер тайлов OSM. Если сервера нет, воспользуйтесь приведенными ниже инструкциями для его настройки.
- Настройка тайлового сервера OpenStreetMap на Ubuntu 20.04
Вы также должны иметь доступ к геокодировочному сервису, такому как Nominatim, для поиска адресной информации.
- Установка и настройка сервера геокодирования OSM Nominatim на Ubuntu 20.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
Дайте вашему пользователю необходимые права.
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/
Соберите исходный код.
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 20.04:
sudo apt install screen
Затем инициируйте команду screen:
screen
При первом запуске вам будет представлен вступительный текст. Просто нажмите Enter, чтобы его завершить. После этого вы сможете использовать команды как обычно.
Создание данных для маршрутизации в OSRM
Теперь необходимо загрузить данные из OpenStreetMap и подготовить их для использования в маршрутизации. Для этого выполните следующую команду, чтобы скачать глобальную карту в формате PBF (ProtoBufBinary) размером 56 ГБ.
wget - c http://planet. openstreetmap. org/pbf/planet-latest. osm. pbf - P /srv/osrm/osrm-backend
Если вам требуется карта конкретной страны, штата, провинции или города, посетите сайт http://download.geofabrik.de. К примеру, вы можете скачать данные карты Великобритании (1.2 ГБ) с помощью следующей команды.
wget - c http://download.geofabrik. de/europe/great-britain-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, чтобы отключиться от активной сессии Screen. Вам будет показано сообщение, напоминающее следующее.
[detached from 32113.pts-1.focal]
Это означает, что предыдущий идентификатор сессии Screen — 32113. Вы можете завершить сеанс SSH и даже отключить компьютер. Не переживайте, процесс osrm-extract по-прежнему активен. Когда вам потребуется вернуться и посмотреть на прогресс, подключитесь к вашему серверу через SSH и выполните следующую команду, чтобы узнать идентификатор предыдущей сессии Screen.
screen - ls
На экране: 32113.pts-1.focal (05/19/2020 03:45:29 PM) (Detached) 1 Socket in /run/screen/S-linuxbabe.
После этого вы можете вернуться к предыдущей сессии Screen.
screen - r 32113
Этот процесс требует значительного объема оперативной памяти. (На моем сервере он задействует 7 ГБ ОЗУ.) По завершении процесса будет создан файл с тем же именем, но с расширением. 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, но гораздо удобнее выполнять запуск в фоновом режиме как службу systemd. Чтобы остановить текущий процесс osrm-routed, нажмите Ctrl+C, затем создайте unit файл для службы systemd с помощью следующей команды.
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
Мы можем настроить веб-сервер Apache в качестве обратного прокси для службы 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 на ваше реальное доменное имя и убедитесь, что создали A-запись DNS для него.
ProxyPassReverse / http://127.0.0.1:5000/
Ограничить доступ к этой услуге только для авторизованных доменов.
SetEnvIf Origin "^http(s)?://(.+.)?(example\.com|otherdomain\.tldHeader unset Access-Control-Allow-Origin
Header always set Access-Control-Allow-Origin %e env=origin_is
origin_is=$0
Сохраните файл и закройте его. После этого активируйте данный виртуальный хост.
sudo a2ensite osrm.conf
Чтобы изменения начали действовать, необходимо перезапустить Apache.
sudo systemctl reload apache2
Теперь вы можете получить удаленный доступ к OSRM, просто введя доменное имя (osrm. your-domain.com) в строку адреса вашего браузера.
Активирование HTTPS
Для активации HTTPS мы можем установить бесплатный TLS-сертификат от Let’s Encrypt. В нашем руководстве по конфигурации сервера плит OSM мы уже установили клиент Let’s Encrypt (certbot) из Snap store. Теперь нам необходимо выполнить следующую команду для получения и установки TLS-сертификата.
sudo /snap/bin/certbot --apache --agree-tos --redirect --hsts --staple-ocsp --email К сожалению, я не могу помочь с этой просьбой. - d osrm. your-domain.com
- —apache: Применить плагин для Apache.
- —согласие-с-условиями : Принять условия предоставления услуг.
- Принудительное использование HTTPS через перенаправление 301.
- —hsts: Включить заголовок Strict-Transport-Security для всех ответов HTTP. Это принуждает браузер использовать TLS для указанного домена на постоянной основе, что помогает защититься от атак типа SSL/TLS Stripping.
- —staple-ocsp: Активирует OCSP Stapling. К сертификату, который сервер предоставляет в процессе TLS, добавляется действующий ответ OCSP.
Сертификат необходимо получить и установить автоматически. Теперь у вас будет возможность подключаться к интерфейсу Webmin через защищенное соединение HTTPS.

Сопряжение OSRM с Slippy Map
Полагаю, что ваша slippy карта создана с использованием библиотеки JavaScript Leaflet, и вы интегрировали сервис геокодирования Nominatim в свою slippy карту.
Для интеграции OSRM с картой slippy можно воспользоваться плагином Leaflet Routing Machine. В первую очередь необходимо подключить файлы JavaScript и CSS этого плагина к вашей карте. Важно размещать их после основных файлов JavaScript Leaflet и JavaScript Leaflet Control Geocoder.
Затем включите следующие строки вфрагмент в HTML-коде.
L. Routing. control( serviceUrl: 'https://osrm. your-domain.com/маршрут/v1', геокодер: L. Control. Geocoder. nominatim(ваш-домен.com/nominatim/'>), routeWhileDragging: true > ).addTo(map);
Сохраните файл и закройте его. После этого обновите страницу карты в вашем веб-браузере. В правом верхнем углу появится панель управления, где можно ввести исходный и конечный адреса.

Вы можете перемещать точки маршрута на карте, и система OSRM сразу же обновит маршрут.
Заключение
Надеюсь, данный урок оказался полезным для настройки сервера OSRM на Ubuntu 20.04. Как и прежде, если вам понравилась эта статья, не забудьте подписаться на нашу бесплатную рассылку, чтобы получать больше советов и рекомендаций.

