valhalla/valhalla

GitHub: valhalla/valhalla

基于 OpenStreetMap 的开源路由引擎,支持多模式导航、等时线分析、地图匹配和路径优化。

Stars: 5467 | Forks: 855

``` ██▒ █▓ ▄▄▄ ██▓ ██░ ██ ▄▄▄ ██▓ ██▓ ▄▄▄ ▓██░ █▒▒████▄ ▓██▒ ▓██░ ██▒▒████▄ ▓██▒ ▓██▒ ▒████▄ ▓██ █▒░▒██ ▀█▄ ▒██░ ▒██▀▀██░▒██ ▀█▄ ▒██░ ▒██░ ▒██ ▀█▄ ▒██ █░░░██▄▄▄▄██ ▒██░ ░▓█ ░██ ░██▄▄▄▄██ ▒██░ ▒██░ ░██▄▄▄▄██ ▒▀█░ ▓█ ▓██▒░██████▒░▓█▒░██▓ ▓█ ▓██▒░██████▒░██████▒▓█ ▓██▒ ░ ▐░ ▒▒ ▓▒█░░ ▒░▓ ░ ▒ ░░▒░▒ ▒▒ ▓▒█░░ ▒░▓ ░░ ▒░▓ ░▒▒ ▓▒█░ ░ ░░ ▒ ▒▒ ░░ ░ ▒ ░ ▒ ░▒░ ░ ▒ ▒▒ ░░ ░ ▒ ░░ ░ ▒ ░ ▒ ▒▒ ░ ░░ ░ ▒ ░ ░ ░ ░░ ░ ░ ▒ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ``` Valhalla 是一个开源路由引擎及相关库,用于处理 OpenStreetMap 数据。Valhalla 还包括诸如时间和距离矩阵计算、等时线、高程采样、地图匹配和旅游优化(旅行商问题)等工具。 ## 构建状态 | Linux | macOS & Windows | 代码覆盖率 | 时区数据库 | ----- | --------------- | ------------- | ----------- | [![Build Linux](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/7cf236fe70213118.svg)](https://github.com/valhalla/valhalla/actions/workflows/linux.yml) | [![Windows & macOS CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/923ba1ef1f213125.svg)](https://github.com/valhalla/valhalla/actions/workflows/osx_win_python_builds.yml) | [![codecov](https://codecov.io/gh/valhalla/valhalla/branch/master/graph/badge.svg)](https://codecov.io/gh/valhalla/valhalla) | [![timezone_db](https://img.shields.io/badge/tzdb%20version-2025c-blue.svg)](https://github.com/valhalla/valhalla/actions/workflows/publish_tz_db.yml) ## 许可证 Valhalla 以及 Valhalla 组织下的所有项目均使用 [MIT 许可证](https://github.com/valhalla/valhalla/blob/master/COPYING)。头像/Logo 由 [Jordan](https://www.jaykaydraws.com/portfolio) 设计。 `./test/data` 中的 OpenStreetMap 数据根据 [ODbL](https://opendatacommons.org/licenses/odbl/) 授权,版权归 OSM 贡献者所有([版权声明](https://www.openstreetmap.org/copyright))。有关 Valhalla 最常用的数据源的许可证和其他要求的更多信息,可以在 [文档](https://valhalla.github.io/valhalla/mjolnir/data_sources/) 中找到。 ## 概述 我们希望 Valhalla 项目具有以下几个关键特性,以区别于其他路由和网络分析引擎。它们是: - 基于开放数据的开源软件,拥有非常宽松的许可证。应允许开发过程的透明度,鼓励贡献和社区投入,并促进在其他项目中的使用。 - 分层瓦片数据结构。应允许用户在内存受限的设备上保持较小的内存占用,支持离线路由,并提供区域提取和部分更新的手段。 - 通过插件架构在图中对边和顶点进行动态、运行时成本计算。应允许定制化和备选路线生成。 - 基于 C++ 的 API。应允许对各个部分进行交叉编译,以便在离线便携设备上实现路由。 - 基于插件的叙事和操作生成架构。应允许根据行政区或目标区域定制生成内容。 - 多模式和基于时间的路由。应允许在同一路线中混合汽车、步行、自行车和公共交通,或设定到达某地点的时间。 ## 演示服务器 [FOSSGIS e.V.](https://fossgis.de) 托管了一个向公众开放的演示服务器,其中包含完整的全球路网图和一个运行在 的 [开源 Web 应用](https://github.com/gis-ops/valhalla-app)。HTTP API 可在稍微不同的子域上访问,例如 。演示服务器的使用遵循 OSRM 和 Nominatim 演示服务器通用的合理使用政策(通过[速率限制](https://github.com/valhalla/valhalla/discussions/3373#discussioncomment-1644713)进行一定程度的强制执行)。 ## 平台兼容性 Valhalla 在许多 Linux 和 Mac OS 发行版上功能完备,也可用于 iOS 和 Android 设备。 对于 Windows,并非所有功能都完全支持。构建 Valhalla 库可以完美运行,以下应用程序模块也是如此: - `TOOLS`:用于查询和基准测试各种组件的实用工具 - `DATA_TOOLS`:用于构建输入数据和处理交通数据的实用工具 - `PYTHON_BINDINGS`:通过 Valhalla Python 库使用所有操作(路由、等时线、矩阵等)(需要在 `PATH` 中有完整的(即开发版)Python 发行版) ## 组织结构 Valhalla 组织由几个库模块组成,每个模块负责不同的功能。各个模块的布局如下: - [Midgard](https://github.com/valhalla/valhalla/tree/master/valhalla/midgard) - 基础地理和几何算法,用于其他各种项目。 - [Baldr](https://github.com/valhalla/valhalla/tree/master/valhalla/baldr) - 用于访问和缓存瓦片路由数据的基础数据结构。 - [Sif](https://github.com/valhalla/valhalla/tree/master/valhalla/sif) - 用于计算图节点和边成本的库。可用作 `loki` 和 `thor` 的输入。 - [Skadi](https://github.com/valhalla/valhalla/tree/master/valhalla/skadi) - 用于访问高程数据的库和服务。可用作 `mjolnir` 的输入或作为独立服务使用。 - [Mjolnir](https://github.com/valhalla/valhalla/tree/master/valhalla/mjolnir) - 将开放数据转换为 Valhalla 图瓦片的工具。 - [Loki](https://github.com/valhalla/valhalla/tree/master/valhalla/loki) - 用于搜索图瓦片并将输入位置与瓦片内的实体关联的库。此关联实体(边或顶点)可用作 `thor` 的输入。 - [Meili](https://github.com/valhalla/valhalla/tree/master/valhalla/meili) - 用于地图匹配的库。 - [Thor](https://github.com/valhalla/valhalla/tree/master/valhalla/thor) - 用于在图瓦片层级结构中生成路径的库。此路径及沿路径的属性信息可用作 `odin` 的输入。 - [Odin](https://github.com/valhalla/valhalla/tree/master/valhalla/odin) - 用于基于路径生成操作指令和叙事的库。这组导向信息可用作 `tyr` 的输入。 - [Tyr](https://github.com/valhalla/valhalla/tree/master/valhalla/tyr) - 用于处理路由 HTTP 请求并与所有其他 Valhalla API 通信的服务。该服务将格式化 `odin` 的输出,并支持 json(以及最终的 protocol buffer)输出。 - [Tools](https://github.com/valhalla/valhalla/tree/master/src) - 一组命令行工具,用于测试上述库组件的各种功能,并为质量测试和性能基准测试提供基础。 - [Demos](https://github.com/valhalla/demos) - 一组允许与服务和 API 进行交互的演示程序。 ## 文档 文档存储在此 GitHub 仓库的 `docs/` 文件夹中。可以在 [valhalla.github.io/valhalla](https://valhalla.github.io/valhalla) 查看。 ## 安装 有关二进制文件的更多信息,请参阅下方的[命令行工具](#command-line-tools)部分和[文档](https://valhalla.github.io/valhalla)。 ### 从源代码构建 如果您想从源代码构建 Valhalla,请遵循[文档](https://valhalla.github.io/valhalla/building/)。 ### 使用 Docker [![Test & Publish Docker image](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/ad140b107f213126.svg)](https://github.com/orgs/valhalla/packages?repo_name=valhalla) 要在本地或您自己的服务器上运行 Valhalla,我们建议使用我们的 [Docker 镜像](https://github.com/orgs/valhalla/packages)之一,请参阅 [README](https://github.com/valhalla/valhalla/blob/master/docker/README.md)。 ### 通过 Python 绑定 [![pyvalhalla version](https://img.shields.io/pypi/v/pyvalhalla?label=pyvalhalla)](https://pypi.org/project/pyvalhalla/) 我们将(非常)高级的 Python 绑定发布到 PyPI,包名为 [`pyvalhalla`](https://pypi.org/project/pyvalhalla/)。 这些 Python 包不仅包含 Python 绑定,还提供对 C++ 可执行文件的访问,例如通过 `python -m valhalla valhalla_build_tiles -h` 的形式。更多详情请参阅 [Python README](https://valhalla.github.io/valhalla/README_python)。 安装原生 C++ 可执行文件甚至不需要 root 权限甚至安装 Python。只需从 [PyPI](https://pypi.org/project/pyvalhalla) 下载所需的 wheel 包,使用例如 `unzip` 解压,然后直接运行其中包含的 `valhalla/bin/`。 ### 通过 NodeJS 绑定 [![npm version](https://img.shields.io/npm/v/@valhallajs/valhallajs/latest?label=@valhallajs/valhallajs@latest)](https://www.npmjs.com/package/@valhallajs/valhallajs) [![npm version](https://img.shields.io/npm/v/@valhallajs/valhallajs/weekly?label=@valhallajs/valhallajs@weekly)](https://www.npmjs.com/package/@valhallajs/valhallajs) 我们提供高级 NodeJS 绑定: ``` npm install @valhallajs/valhallajs ``` 更多详情请参阅 [NodeJS README](https://github.com/valhalla/valhalla/blob/master/src/bindings/nodejs/README.md)。 ## 贡献 我们 :heart: 对 Valhalla 的贡献。贡献可以是非技术性的,例如通过 [Transifex](https://www.transifex.com/valhalla/valhalla-phrases/locales-en-us-json--transifex/) 翻译成其他语言或改进文档,也可以是技术性的,如修复错误或实现功能。在着手处理 PR 之前提出 issue 非常重要。 理想情况下,请先熟悉我们的[贡献指南](https://github.com/valhalla/valhalla/blob/master/CONTRIBUTING.md)。 ## 命令行工具 ### `valhalla_service` 即单次模式 如果您无法(例如在 Windows Server 上)或不想运行完整的 HTTP API,您可以使用所谓的“单次模式”下的 'valhalla_service' 可执行文件获得(几乎)完全相同的行为。这很简单,只需传递配置文件、操作(route, isochrone, matrix 等)和字符串化的 JSON 请求(或者为了避免 shell 命令长度限制,传递包含请求的文件): ``` valhalla_service valhalla.json isochrone '{"locations":[{"lat":42.552448,"lon":1.564865}],"costing":"auto","contours":[{"time":10,"color":"ff0000"}], "show_locations":true}' # 或者您可以传入一个包含相同内容的文件 valhalla_service valhalla.json isochrone isochrone_request.txt ``` 需要注意的是,单次模式的所有 Valhalla 日志都会通过管道传输到 `stderr`,而实际的 JSON 响应将位于 `stdout` 中。要完全静音日志,请在配置文件中将 `type: ""` 传递给 `midgard.logging`。 ### 批量脚本工具 - [批量 Run_Route](https://github.com/valhalla/valhalla/blob/master/run_route_scripts/README.md) ## 相关项目 以下项目是开源的,旨在让 Valhalla 及其功能更易于使用: - [**OpenStreetMapSpeeds**](https://github.com/OpenStreetMapSpeeds/):一个融合开放 GPS 数据以改进 Valhalla 速度分类的项目。当前的 JSON 文件来自 2022 年初,可在此处[下载](https://raw.githubusercontent.com/OpenStreetMapSpeeds/schema/master/default_speeds.json),并通过在 `mjolnir.default_speeds_config` 配置选项中设置路径来使用。 - [**valhalla-operator**](https://github.com/itayankri/valhalla-operator):一个用于部署和管理 Valhalla 的 k8s operator。 - [**valhalla-app**](https://github.com/gis-ops/valhalla-app):一个基于 React 的 Valhalla Web 应用,为 提供支持。 - [**valhalla-qgis-plugin**](https://github.com/gis-ops/valhalla-qgis-plugin):一个 Valhalla 的 QGIS 插件,也可在[官方 QGIS 插件商店](https://plugins.qgis.org/plugins/valhalla/)中找到,内置 `valhalla_service` 和 `valhalla_build_tiles`。 - [**routingpy**](https://github.com/gis-ops/routingpy):一个适用于大多数开源路由引擎(包括 Valhalla)的 Python 客户端,为所有引擎提供通用接口。可在 [PyPI](https://pypi.org/project/routingpy/) 上获取。 - [**routingjs**](https://github.com/gis-ops/routingjs):一个适用于大多数开源路由引擎(包括 Valhalla)的 TypeScript 客户端,为所有引擎提供通用接口。可在 [npm](https://www.npmjs.com/package/@routingjs/valhalla) 上作为特定于引擎的包获取。 - [**Valhalla_jll.jl**](https://github.com/JuliaBinaryWrappers/Valhalla_jll.jl):为 Julia 提供的 Valhalla 二进制文件。 - [**valhalla-go**](https://github.com/pufferffish/valhalla-go):通过 cgo 实现的 Valhalla Golang 绑定
标签:C++, GIS, LibOSRM, MITM代理, OpenStreetMap, OSM, Python脚本, TSP, Valhalla, 图形处理, 地图匹配, 地图服务, 地理信息系统, 多模式交通, 导航, 开源, 数据擦除, 旅行商问题, 智能交通, 物流科技, 等时线, 自驾路线, 行程优化, 请求拦截, 距离矩阵, 路径规划, 路由引擎, 逆向工具, 骑行导航, 高程采样