Project-OSRM/osrm-backend

GitHub: Project-OSRM/osrm-backend

基于 C++ 和 OpenStreetMap 的高性能开源路由引擎,提供路径规划、地图匹配、距离矩阵计算等核心导航服务。

Stars: 7553 | Forks: 3895

## Open Source Routing Machine [![osrm-backend CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/a7e5d4e5e2202918.svg)](https://github.com/Project-OSRM/osrm-backend/actions/workflows/osrm-backend.yml) [![Discord](https://img.shields.io/discord/1034487840219860992)](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, 交通导航, 后端开发, 地图导航, 地图服务, 地理信息系统, 坐标定位, 安全防御评估, 开源路由引擎, 数据擦除, 旅行商问题, 物流算法, 瓦片地图, 矢量切片, 请求拦截, 距离矩阵, 路径规划, 路网匹配, 高性能计算