RoughRoute — 入路点,真实道路路线出
基于OpenStreetMap数据构建的离线迷你路由器。给它有序的路径点,它会返回一条遵循真实道路的折线 - 在运行时没有网络调用,只需个位数毫秒。
免费开源 · Rust · MIT License
🧭 直线不是路
任何模拟运动的东西——mock-GPS播放工具、演示、地图动画——都需要一条看起来像是被驱动的路径,而不是一条穿过建筑物的直线。完整的路由引擎解决了这个问题,但它们很重,并且大多数都期望网络呼叫的另一端有一个服务器。
📦 小到足以嵌入
RoughRoute 做了一件事:输入路径点,输出一条看似合理的道路跟踪线。地图会提前编译成应用程序附带的紧凑地图文件,因此在运行时没有服务器,没有 API 密钥,也没有任何速率限制。
它的作用
📴 运行时无网络
查询针对设备上预先构建的地图文件运行。适用于飞机、隧道或 CI 中(网络关闭)。
🧩 一核三壳
相同的 Rust 核心编译为浏览器的 WebAssembly、通过 UniFFI 的本机 Android 库以及命令行二进制文件。
⚡ 个位数毫秒查询
A* 在压缩的道路网络上。速度足够快,可以路由播放的每一帧,而不仅仅是在开始时路由一次。
🗜 以兆字节为单位的地图文件
2 级塌陷和增量压缩几何形状使可用区域足够小,可以从CDN 捆绑或服务。
🚗 开车和步行
一个映射文件通过访问位掩码携带两个配置文件,因此您不必两次构建和传送该区域。
🔁 相同的输入,相同的字节
路由是确定性的:相同的航路点和相同的地图文件总是产生相同的线路。对于比较输出的测试来说是个好消息。
⚙️ 三步
- 提前将 .osm.pbf 区域编译为紧凑的 .graph 文件。
- 发送该文件 - 将其与应用程序捆绑在一起或将其放在 CDN 后面。
- 在设备上,加载该文件并在本地运行查询。您将得到坐标和距离。
⌨️ 从命令行
roughroute build region.osm.pbf -o region.graph
roughroute route region.graph \
--profile car \
--via 40.7128,-74.0060 \
--via 40.7580,-73.9855 \
--format geojson
或者从浏览器通过WebAssembly:
const router = new WasmRouter(graphBytes);
const { coords, distance } = router.route(waypoints, "car");
⚖️ 它故意不做的事情
RoughRoute 以准确性换取尺寸和速度。它忽略单向街道、转弯限制和基于速度的成本计算,如果找不到路径,它会返回一条直线路段而不是拒绝。对于回放、演示和离线后备来说,这是正确的交易,而对于逐向导航来说则是错误的交易,因为您需要一个完整的路由引擎。
获得麻省理工学院许可。地图数据来自 OpenStreetMap 贡献者,并获得 ODbL 许可。