Valhalla 是人们常常忘记存在的路径规划层,直到某个地图产品开始给出无法解释的路线决策时,它才显出位置。地图瓦片可以显示道路。地理编码器可以找到地点。路径规划处在更难的中间层:把开放道路数据转成一张图,判断某类出行者可以使用哪些边,在请求时给各种取舍定价,并返回应用可以信任的方向指令。Valhalla 的意义在于,它把这一层放在开放、可检查、可运营的 OpenStreetMap 数据之上,避开专有 directions 端点背后的黑箱。[1][3]

截至 2026-06-13T10:03:32Z UTC,公开的 valhalla/valhalla 仓库显示有 5,806 stars908 forks899 open issues,并在 2026-06-13T08:44:55Z 有 push 活动;最新 GitHub release 为 3.7.0,发布于 2026-04-29。[2][10] 这些数字只是维护信号。Valhalla 更持久的工程理由在于项目组织方式:它围绕路径规划专用库展开,覆盖瓦片数据、costing、海拔、图生成、位置关联、路径生成、叙述生成和 HTTP 服务处理。[1]

图像语境:封面使用真实街道骑行照片,没有采用地图截图或示意图。这个选择是有意的。Valhalla 的产品价值不在视觉风格,而在路径规划层:当限速、转向限制、道路等级、出行模式、海拔、通行规则和请求偏好彼此牵引时,这一层负责决定什么才算“好路线”。[9]

这个项目是路径规划引擎,边界不同于地图应用

仓库把 Valhalla 描述为一个开源路径规划引擎,以及一组面向 OpenStreetMap 数据的配套库,工具范围包括路径规划、时间距离矩阵、等时圈、海拔采样、地图匹配和行程优化。[1] 这个范围值得完整保留。Valhalla 的目标不在于替换整套地图技术栈。它不负责制图设计、地址搜索、车队 UI 或驾驶员手机屏幕。它负责的是交通图转化为决策的那一段。

turn-by-turn 概览清楚展示了它的实际表面:Valhalla 可以为 Web 或移动应用提供全球范围的路径规划和导航,覆盖驾车、步行、骑行、多模式以及面向公交换乘的请求,并沿路径生成 maneuver directions。[3] 因而,只要一个产品需要方向指令,同时又希望路线行为可以被理解,Valhalla 就有用武之地。市政应用、出行创业公司、物流工具、研究流程、步道产品或内部现场作业系统,都可以把路径规划引擎当作可部署、可测试的软件来推理。

第一道采用边界由此很清楚。当前路线本身属于产品承诺的一部分时,Valhalla 才真正有吸引力。如果应用只是把“方向指引”当作普通功能,托管 API 已经足够。如果应用需要解释一条路线为什么避开某条路、优先选择自行车道、选择到达时间路径、把嘈杂 GPS 吸附到已知道路,或者生成服务区多边形,Valhalla 给了团队一个检查机制的位置。[3][4][6]

瓦片是运营单元

Valhalla 的路径规划图是分瓦片的。瓦片规格描述了三层层级结构:高速道路使用 4 度瓦片,主干道路使用 1 度瓦片,本地道路使用 0.25 度瓦片。[5] 这超出存储细节。它让全球道路网络变成机器可以加载、缓存、更新和查询的对象,避开把整个地球当成一个巨大内存对象的做法。

仓库把分瓦片层级数据结构描述为一种支持更小内存占用、离线路径规划、区域 extract 和局部更新的方式。[1] 这些才是路径规划引擎无法只凭一次成功演示路线来评价的现实原因。如果一个产品覆盖的是一座都市圈、一个国家或某支车队的运营区域,它不应承担与全球导航服务相同的运行时形态。如果移动端或嵌入式使用场景需要在网络连接失败时继续规划路径,瓦片边界就会变成部署边界。

Valhalla 的内部模块之一 Baldr 把这套架构说得更明确。它的文档描述了 route-data tiles、瓦片缓存、层级瓦片布局,以及节点、边和出口等瓦片数据成员。[7] 用更直接的话说,Valhalla 的图超出“把 OSM 导入数据库”这一步。它是一种路径规划专用表示,各个部分都按寻路和路径归因的需要来塑形。

运营工作也在这里进入系统。运行 Valhalla 的团队必须决定瓦片数据怎样生成、extract 从哪里来、多久刷新一次、海拔和公交输入是否重要、目标区域需要多少磁盘和内存,以及路径数据可以陈旧到什么程度。开源带来的是控制权,同时也把维护工作留给运营者。

Costing 是产品政策进入系统的位置

Valhalla 最重要的设计选择或许是运行时 costing。turn-by-turn API reference 说明,路径请求必须包含一个 costing model,并且可以包含该模型的可选参数。[4] 在实践中,这意味着“最快路线”不会作为普遍真理被写死在图里。请求可以要求汽车、自行车、行人、卡车、公交车、出租车、滑板车、摩托车或多模式行为,并通过选项改变引擎给边和 maneuver 定价的方式。[4]

这一区分很重要,因为路径规划政策就是产品政策。避开爬坡的自行车路线、遵守限制的卡车路线、区别对待小巷的人行路线,以及混合步行和公交的多模式路线,都超出同一条中性路径的几个变体。它们是在回答“这类出行者应该承担哪些成本”这个问题。Valhalla 的架构把这个问题留在请求附近,避开将其塞进不透明 route profile 内部的做法。[3][4]

仓库的模块布局进一步强化了这一点。Sif 处理图节点和边的 costing;Loki 把输入位置关联到图实体;Thor 在图层级中生成路径;Odin 生成 maneuver 和叙述;Tyr 处理 HTTP 请求并格式化 API 输出。[1] 这些名字很容易被略过,但这种分离很有用。它意味着位置匹配、成本政策、路径搜索和文字方向指令是不同职责。

失败模式来自过度自信。运行时 costing 不能自动解决缺失地图标签、糟糕的本地速度假设、封闭道路、坏 GPS,或产品尚未定义自身路径偏好的问题。Valhalla 给团队一个编码和测试政策的位置。它没有拿走团队理解政策内容的责任。

地图匹配拓宽了使用场景

路径规划从计划中的移动开始。地图匹配从已经观察到的移动开始。Valhalla 的 map-matching API 可以把坐标轨迹,例如 GPS 位置,匹配到 OpenStreetMap 中的道路和路径上。[6] 文档区分了 trace_routetrace_attributes:前者返回吸附到道路网络并带叙述指令的形状,后者返回匹配路径上的详细归因。[6]

这带来的是另一类产品价值。公交分析人员可以把车辆轨迹对齐到道路图上。骑行应用可以把手机里噪声很大的 GPS 转成类似路线的记录。物流团队可以比较实际行驶路径与预期路径。道路安全流程可以把属性附着在观察到的移动上,而不只附着在计划行程上。路径规划引擎一旦也能解释轨迹,就会进入计划与现实之间的反馈回路。

map-matching 文档还指出,服务请求应使用 POST,因为 shapes 或 encoded polylines 体量会很大。[6] 这个很小的 API 细节提醒我们,路径基础设施有物理约束。GPS 轨迹很臃肿。全区域瓦片占空间。多模式路径规划需要街道之外的数据输入。因此,严肃的 Valhalla 部署是一条数据流水线和一次服务运营,而不只是链接进应用的一个库。

为什么 Valhalla 仍然是一条独立 OSS 赛道

Interline 的概览很有用,它把 Valhalla 放在一个多用途路径规划引擎的位置上,并说明其源自 Mapzen 的 mobility 工作,已经用于多种地图和出行语境。[8] 这一点重要,因为该项目处在一条中间赛道:比通用图数据库更专门,比托管 directions API 更自主,也比单模式最短路径演示更宽。

它也不同于开源地图团队已经熟悉的相邻项目。OpenStreetMap 提供数据公共品。渲染器和瓦片栈展示地图。地理编码器把文本变成地点。Valhalla 把交通图变成路径决策。混淆这些层,团队就会在导航产品表现糟糕时责怪错误的系统。

最好的试点应该很窄。选择一个区域、一到两种出行模式,以及一类当前答案令人痛苦的路线。生成或取得瓦片。运行已知的起终点对。把路线选择、ETA 行为、avoid/prefer 设置、地图匹配轨迹和等时圈与人的预期比较。随后检查失误:缺失的 OSM 标签、过时的本地速度假设、costing knobs、瓦片新鲜度或产品政策。这个过程比粘贴一个托管 API key 更慢,但每次都会产出更好的工程问题。

当路线行为足够战略化,值得自己拥有时,Valhalla 很适合:离线导航、自定义自行车或卡车偏好、本地出行分析、研究级等时圈、现场服务辖区规划,或者地图匹配与路径规划同样重要的应用。[1][4][6] 当团队想要的是成品消费者导航产品、不掌握数据流水线的实时交通运营,或希望由别人解释每一个路径异常的支持模型时,它的适配度会降低。

记住 Valhalla 最清楚的方式是:它让路径规划成为一个可以运营的图成本问题。地图仍然重要,但路线超出截图。路线是在一次请求下,由瓦片、成本、关联位置、路径搜索、叙述生成和数据新鲜度共同汇合之后得到的结果。这正是开源基础设施擅长显形的部分。

来源

  1. GitHub,valhalla/valhalla - 项目仓库、README 范围、功能列表、模块布局、分瓦片层级结构理由,以及 OpenStreetMap 数据语境。
  2. GitHub API,valhalla/valhalla 仓库元数据,采样于 2026-06-13 - stars、forks、open issues、push timestamp 和仓库状态字段。
  3. Valhalla Docs,“Routing overview” - turn-by-turn 服务范围、全球路径规划、支持的出行模式,以及 maneuver-directions 语境。
  4. Valhalla Docs,“Turn-by-turn API reference” - 运行时 costing 要求、costing models、请求参数和路线行为控制。
  5. Valhalla Docs,“Tile Specifications” - 图瓦片用途、三层层级、瓦片尺寸,以及高速、主干和本地层级之间的道路等级切分。
  6. Valhalla Docs,“Map Matching service API reference” - 坐标到道路匹配、trace_routetrace_attributes、POST 指导和路径归因行为。
  7. Valhalla Docs,“Baldr” - 路径规划数据结构、route-data tiles、瓦片缓存、层级布局、节点、边、出口,以及路径规划子问题支持。
  8. Interline Technologies,“Intro to Valhalla multi-purpose routing engine” - 对 Valhalla 起源、使用场景和它在开源路径规划生态中位置的独立概览。
  9. Wikimedia Commons,“File:2009-03-07 Man with bicycle helmet.jpg” - 本文封面所用真实街道骑行照片的来源页面。
  10. GitHub API,valhalla/valhalla 最新 release 元数据,采样于 2026-06-13 - Valhalla 3.7.0 的 release tag 和 publication timestamp。