Project-OSRM/osrm-backend
GitHub: Project-OSRM/osrm-backend
基于 C++ 和 OpenStreetMap 的高性能开源路由引擎,提供路径规划、地图匹配、距离矩阵计算等核心导航服务。
Stars: 7553 | Forks: 3895
## Open Source Routing Machine
[](https://github.com/Project-OSRM/osrm-backend/actions/workflows/osrm-backend.yml) [](https://discord.gg/es9CdcCXcb)
使用 C++ 编写的高性能路由引擎,专为在 OpenStreetMap 数据上运行而设计。
通过 HTTP API、C++ 库接口和 NodeJs 封装器提供以下服务:
- Nearest - 将坐标吸附到街道网络并返回最近的匹配项
- Route - 查找坐标间最快的路径
- Table - 计算提供的所有坐标对之间最快路径的时长或距离
- Match - 以最合理的方式将嘈杂的 GPS 轨迹吸附到道路网络
- Trip - 使用贪婪启发式算法解决旅行商问题
- Tile - 生成带有内部路由元数据的 Mapbox Vector Tiles
要快速试用 OSRM,请使用我们的 [演示服务器](http://map.project-osrm.org),它同时提供了后端和前端。
有关 OpenStreetMap 中如何表示道路网络以及如何映射特定道路网络特征的快速介绍,请查看 [OSM 路由 Wiki](https://wiki.openstreetmap.org/wiki/Routing) 或 [关于导航映射的指南](https://web.archive.org/web/20221206013651/https://labs.mapbox.com/mapping/mapping-for-navigation/)。
相关的 [Project-OSRM](https://github.com/Project-OSRM) 仓库:
- [osrm-frontend](https://github.com/Project-OSRM/osrm-frontend) - 面向用户的带地图前端。演示服务器在后端之上运行此程序
- [osrm-text-instructions](https://github.com/Project-OSRM/osrm-text-instructions) - 来自 OSRM 路由响应的文本指令
- [osrm-backend-docker](https://github.com/project-osrm/osrm-backend/pkgs/container/osrm-backend) - 即用型 Docker 镜像
## 文档
### 完整文档
- [托管文档](http://project-osrm.org)
- [osrm-routed HTTP API 文档](docs/http.md)
- [libosrm API 文档](docs/libosrm.md)
## 联系方式
- Discord: [加入](https://discord.gg/es9CdcCXcb)
- BlueSky: [主页](https://bsky.app/profile/osrm.bsky.social)
## 快速入门
搭建您自己的路由引擎最简单快捷的方法是使用我们提供的 Docker 镜像。
有两种预处理管道可用:
- Contraction Hierarchies (CH)
- Multi-Level Dijkstra (MLD)
我们默认推荐使用 MLD,除非是特殊用例(例如超大型距离矩阵),目前 CH 在这种情况下仍然是更好的选择。
下面我们解释 MLD 管道。
如果您想改用 CH 管道,请将 `osrm-partition` 和 `osrm-customize` 替换为单个 `osrm-contract`,并将 `osrm-routed` 的算法选项更改为 `--algorithm ch`。
### 使用 Docker
我们的 Docker 镜像([后端](https://github.com/Project-OSRM/osrm-backend/pkgs/container/osrm-backend)、[前端](https://hub.docker.com/r/osrm/osrm-frontend/))基于 Debian,并确保它们尽可能轻量。旧版本的后端可以在 [Docker Hub](https://hub.docker.com/r/osrm/osrm-backend/) 上找到。
下载 OpenStreetMap 提取数据,例如从 [Geofabrik](http://download.geofabrik.de/)
```
wget http://download.geofabrik.de/europe/germany/berlin-latest.osm.pbf
```
使用 car 配置文件预处理提取数据,并在端口 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"`。请注意,此过程可能需要很长时间才能完成,终端输出变化很少,例如,550.7MB 的墨西哥 OSM 文件大约需要 30 分钟才能完成提取并生成边扩展图表示。
```
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` 组后,请确保在终端中注销并重新登录。
我们在 Container Registry 中支持以下镜像:
| 名称 | 描述 |
| ------------------- | ------------------------------------------------------------------------------ |
| `latest` | 使用 release 标志编译的 `master` 分支 |
| `latest-assertions` | 使用 release 标志编译的 `master` 分支,启用了断言和调试符号 |
| `latest-debug` | 使用 debug 标志编译的 `master` 分支 |
| `` | 使用 release 标志编译的特定标签 |
| `-debug` | 使用 debug 标志编译的特定标签 |
### 从源代码构建
以下内容针对 Ubuntu 22.04。
有关在不同发行版、macOS 或 Windows 上构建的说明,请参阅我们的 [Wiki](https://github.com/Project-OSRM/osrm-backend/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 使用政策](https://github.com/Project-OSRM/osrm-backend/wiki/Demo-server)。
关于柏林的带指令和备选方案的简单查询:
```
curl "https://router.project-osrm.org/route/v1/driving/13.388860,52.517037;13.385983,52.496891?steps=true&alternatives=true"
```
### 使用 Node.js 绑定
Node.js 绑定提供对路由引擎的只读访问。
我们在 [这里](docs/nodejs/api.md) 提供 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 文档](docs/nodejs/api.md)。
可以 [在此处](https://github.com/door2door-io/osrm-express-server-demo) 找到第三方使用 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},
}
```
标签:Bash脚本, C++, Docker, GIS, GNU通用公共许可证, HTTP API, MITM代理, Node.js, OpenStreetMap, OSM, OSRM, Python脚本, rizin, TSP, 交通导航, 后端开发, 地图导航, 地图服务, 地理信息系统, 坐标定位, 安全防御评估, 开源路由引擎, 数据擦除, 旅行商问题, 物流算法, 瓦片地图, 矢量切片, 请求拦截, 距离矩阵, 路径规划, 路网匹配, 高性能计算