用 C++ 编写的高性能路由引擎,设计用于在 OpenStreetMap 数据上运行。
以下服务可通过 HTTP API、C++ 库接口和 NodeJs 包装器提供:
要快速尝试 OSRM,请使用我们的演示服务器,该服务器带有后端和顶部前端。
有关如何在 OpenStreetMap 中表示道路网络以及如何映射特定道路网络功能的快速介绍,请参阅有关路线的 OSM wiki 或有关导航映射的指南。
相关项目-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 上找到。
例如从 Geofabrik 下载 OpenStreetMap 提取内容
wget http://download.geofabrik.de/europe/germany/berlin-latest.osm.pbf
使用汽车配置文件预处理提取内容,并在端口 5000 上启动路由引擎 HTTP 服务器
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"
在 docker 容器内创建目录/data
并使当前工作目录"${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
您可以通过npm install @project-osrm/osrm
或通过此存储库安装 Node.js 绑定
npm install
它将检查并使用预构建的二进制文件(如果它们可用于此版本和您的 Node 版本),或者通过
npm install --build-from-source
始终强制从源代码构建 Node.js 绑定。
在 v5.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},
}