Высокопроизводительный механизм маршрутизации, написанный на C++ и предназначенный для работы с данными OpenStreetMap.
Следующие сервисы доступны через HTTP API, интерфейс библиотеки C++ и оболочку NodeJs:
Чтобы быстро попробовать OSRM, воспользуйтесь нашим демонстрационным сервером, который включает в себя как серверную часть, так и внешний интерфейс.
Для быстрого ознакомления с тем, как дорожная сеть представлена в OpenStreetMap и как отображать конкретные объекты дорожной сети, посетите вики OSM по маршрутизации или это руководство по картированию для навигации.
Связанные репозитории Project-OSRM:
irc.oftc.net
, канал: #osrm
(веб-чат)https://lists.openstreetmap.org/listinfo/osrm-talk
Самый простой и быстрый способ настроить собственный механизм маршрутизации — использовать предоставляемые нами образы Docker.
Доступны два конвейера предварительной обработки:
мы рекомендуем использовать MLD по умолчанию, за исключением особых случаев использования, таких как матрицы очень больших расстояний, где CH на данный момент все еще лучше подходит. Ниже мы объясним конвейер MLD. Если вместо этого вы хотите использовать конвейер CH, замените osrm-partition
и osrm-customize
одним osrm-contract
и измените параметр алгоритма для osrm-routed
на --algorithm ch
.
Мы основываем наши образы Docker (серверная часть, внешний интерфейс) на Debian и следим за тем, чтобы они были максимально легкими. Старые версии серверной части можно найти в Docker Hub.
Загрузите выдержки OpenStreetMap, например, из Geofabrik.
wget http://download.geofabrik.de/europe/germany/berlin-latest.osm.pbf
Предварительно обработайте экстракт с профилем автомобиля и запустите HTTP-сервер механизма маршрутизации на порту 5000.
docker run -t -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-extract -p /opt/car.lua /data/berlin-latest.osm.pbf || echo "osrm-extract failed"
Флаг -v "${PWD}:/data"
создает каталог /data
внутри Docker-контейнера и делает доступным текущий рабочий каталог "${PWD}"
. Файл /data/berlin-latest.osm.pbf
внутри контейнера ссылается на "${PWD}/berlin-latest.osm.pbf"
на хосте.
docker run -t -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-partition /data/berlin-latest.osrm || echo "osrm-partition failed"
docker run -t -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-customize /data/berlin-latest.osrm || echo "osrm-customize failed"
Обратите внимание, что файла berlin-latest.osrm
нет, а есть несколько berlin-latest.osrm.*
, т.е. berlin-latest.osrm
— это не путь к файлу, а «базовый» путь, относящийся к набору файлов, и есть возможность его опустить. полностью этот суффикс .osrm
(например, osrm-partition /data/berlin-latest
).
docker run -t -i -p 5000:5000 -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-routed --algorithm mld /data/berlin-latest.osrm
Делайте запросы к HTTP-серверу
curl "http://127.0.0.1:5000/route/v1/driving/13.388860,52.517037;13.385983,52.496891?steps=true"
При желании запустите удобный интерфейс на порту 9966 и откройте его в браузере.
docker run -p 9966:9966 osrm/osrm-frontend
xdg-open 'http://127.0.0.1:9966'
Если Docker жалуется на невозможность подключения к демону Docker, убедитесь, что вы находитесь в группе docker
.
sudo usermod -aG docker $USER
После добавления себя в группу docker
обязательно выйдите из системы и снова войдите в нее с помощью терминала.
Мы поддерживаем следующие образы в реестре контейнеров:
Имя | Описание |
---|---|
latest | master скомпилирована с флагом выпуска |
latest-assertions | master скомпилированная с флагом выпуска, включенными утверждениями и символами отладки |
latest-debug | master скомпилирован с флагом отладки |
<tag> | конкретный тег, скомпилированный с флагом выпуска |
<tag>-debug | конкретный тег, скомпилированный с флагом отладки |
Следующее предназначено для Ubuntu 22.04. Инструкции по сборке на различных дистрибутивах, macOS или Windows см. в нашей Wiki.
Установить зависимости
sudo apt install build-essential git cmake pkg-config
libbz2-dev libxml2-dev libzip-dev libboost-all-dev
lua5.2 liblua5.2-dev libtbb-dev
Скомпилируйте и установите двоичные файлы OSRM.
mkdir -p build
cd build
cmake ..
cmake --build .
sudo cmake --build . --target install
Ознакомьтесь с политикой использования API.
Простой запрос с инструкциями и альтернативами по Берлину:
curl "https://router.project-osrm.org/route/v1/driving/13.388860,52.517037;13.385983,52.496891?steps=true&alternatives=true"
Привязки Node.js предоставляют доступ к механизму маршрутизации только для чтения. Здесь мы предоставляем документацию по API и примеры.
Вам понадобится современная цепочка инструментов libstdc++
( >= GLIBCXX_3.4.26
) для двоичной совместимости, если вы хотите использовать предварительно созданные двоичные файлы. Для более старых систем Ubuntu вы можете обновить стандартную библиотеку, например, с помощью:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update -y
sudo apt-get install -y libstdc++-9-dev
Вы можете установить привязки Node.js через npm install @project-osrm/osrm
или из этого репозитория либо через
npm install
который будет проверять и использовать готовые двоичные файлы, если они доступны для этого выпуска и вашей версии Node, или через
npm install --build-from-source
чтобы всегда принудительно создавать привязки Node.js из исходного кода.
До версии 5.27.0 область действия пакета osrm
Node не была ограничена. Если вы обновляете старый пакет, вам необходимо сделать следующее:
npm uninstall osrm --save
npm install @project-osrm/osrm --save
Подробности использования см. в документации по API.
Пример реализации сторонней компании с Docker и Node.js можно найти здесь.
При использовании кода в (научной) публикации указывайте ссылку
@inproceedings{luxen-vetter-2011,
author = {Luxen, Dennis and Vetter, Christian},
title = {Real-time routing with OpenStreetMap data},
booktitle = {Proceedings of the 19th ACM SIGSPATIAL International Conference on Advances in Geographic Information Systems},
series = {GIS '11},
year = {2011},
isbn = {978-1-4503-1031-4},
location = {Chicago, Illinois},
pages = {513--516},
numpages = {4},
url = {http://doi.acm.org/10.1145/2093973.2094062},
doi = {10.1145/2093973.2094062},
acmid = {2094062},
publisher = {ACM},
address = {New York, NY, USA},
}