新闻详情

新闻详情

首页 / 资讯中心 / 详情

Gosmore:一份OSM数据就能离线导航的开源路由引擎

发布时间:2026/9/25 4:59:27来源:尧图网络
Gosmore:一份OSM数据就能离线导航的开源路由引擎
简介Gosmore是一款基于OpenStreetMap数据的开源导航应用采用2D/3D双视图展示地图支持离线搜索与逐行路由规划特别适合在偏远地区或网络不稳定环境下使用的地图需求也适合开发者研究开源C导航项目。压缩包共22个文件仅6.2MB除主程序gosmore.exe与7z.exe外还包含libxml2-2.dll等运行依赖、default.pak配置资源、icons.csv图标定义和14个wav导航提示音结构简洁便于按需替换地图数据或二次开发。已有47人学习下载。从开源角度读者不仅能直接体验完整的离线导航流程还能通过源码与资源文件理解OpenStreetMap数据的解析方式、路由算法和音频反馈机制为自建离线地图服务或嵌入导航功能提供了可参考的轻量级实现。1. Gosmore 是什么一份 OSM 数据就能撑起离线导航的开源引擎聊路由引擎大多数人的第一反应是 OSRM、Valhalla、GraphHopper 这些重型选手。Gosmore 走的是完全相反的路线它用 C 实现拿到 OpenStreetMap 的导出数据后直接在本地构建一张路网库再以一个轻量 HTTP 服务对外提供驾车、骑行、步行路径。它不依赖数据库不依赖在线瓦片服务也不需要预先部署集群。第一次跑通只需要两步下载一块区域的 PBF 文件执行创建命令生成路由库。这个项目特别适合嵌入式设备、内网地图和离线导航的场景在开源项目里属于少见的“小而完整”的样例也适合想自己掌控路由算法的工程师做二次开发。2. Gosmore 的取舍为什么轻量离线比重度预处理更适合嵌入式路由2.1 路由引擎的底层链路从 OSM 原始数据到一条路径先定义一下路由引擎的工作流程。从 OpenStreetMap 下载的 PBF 文件里保存着节点、道路和关系三类基础元素。路由引擎拿到这些数据后第一步是把道路抽象成一张有向图路口是图的节点道路段是图的边边的权重由长度、限速和通行方向共同决定。第二步是启动搜索算法最常用的是 Dijkstra 的变体从起点向外扩展直到终点被纳入最短路径树。第三步才是把这条路径翻译成人类能看懂的逐向指令比如“前方路口左转进入 XX 路”。Gosmore 的特别之处在第零步它自己负责解析 PBF 并把图固化成本地二进制文件。“固化”这一步意味着运行时不再需要 XML 解析器和数据库连接直接把文件映射到内存就能做查询。很多重引擎把这一步包得又大又黑而 Gosmore 把全过程留在你眼前编译一次、对着一份数据跑一遍你就能看到它到底在做什么。对于做嵌入式的工程师来说这种可观测性比性能数字更重要。2.2 Gosmore 与 OSRM、Valhalla 的分野一份数据库文件还是整条工具链维度GosmoreOSRMValhalla数据预处理PBF 直接建路由库需先加工 OSM 数据构建多层分级图构建 tile 数据启用动态成本运行服务单进程可跑几乎是纯内存计算需要配套 HTTP 服务和共享内存管理服务与依赖较多配置更长离线能力路由库文件拷走即用可离线但要整套服务配合可离线但部署成本高典型规模城市、区域级全国、全球级多模式、全国级二次开发难度低代码量小中机制复杂较高模块多OSRM 在性能和路由质量上做了大量优化尤其适合全国级数据的低延迟查询。Valhalla 则在多模式出行和实时交通上更强适合有动态路况诉求的业务。Gosmore 没有这些能力它的“卖点”非常朴素预处理结束后只有一个路由库文件拷到任何一台能跑二进制的机器上就能离线起服务。社区现状也要实话实说Gosmore 属于完成了历史使命但维护节奏放缓的开源项目。如果你做的是全国级在线导航不要选它但如果你做的是区域级离线方案它的简洁性反而成了巨大优势。我见过不少人在离线工控机上先跑 Gosmore 做验证确认数据链路没问题后再上重型引擎。2.3 什么场景该选 Gosmore三条判断标准判断标准很简单满足任意两条就可以考虑。第一数据范围限定在一个城市或省级区域不需要全球路由。第二运行环境是离线内网、车载电脑或 ARM 开发板内存可能只有 12GB。第三你需要能看懂、能改的路由内核而不是一个只有参数文档的黑匣子。反例也很明确。如果你要支持全国范围的百万级并发请求别用 Gosmore如果你需要实时路况、更多道路属性参与算路也别用。Gosmore 的价值区间就是“用最简单的方式解决离线路径规划”超出这个区间其他引擎更合适。3. 用 Ubuntu 从源码跑通 GosmorePBF 下载、编译参数与本地 HTTP 服务3.1 获取测试数据按区域下载 OpenStreetMap PBFOpenStreetMap 官方数据太大全量 planet 文件有几十 GB不适合拿来验证。常见做法是从 Geofabrik 镜像下载按国家或地区切好的 PBF 文件比如台湾、香港、新加坡或者德国某个州。具体到测试选一个地级市大小的区域最划算构建速度快内存占用低排查问题也方便。mkdir -p ~/osm cd ~/osm wget -c https://download.geofabrik.de/asia/taiwan-latest.osm.pbf ls -lh taiwan-latest.osm.pbfwget -c可以断点续传PBF 文件几十 MB 到几百 MB网络不稳定时能省不少重下时间。PBF 是二进制压缩格式Gosmore 原生支持不需要额外转换。这里我一般会先看一眼文件大小心里有个底如果下载特别慢就换更小的行政区域包。3.2 编译 Gosmore依赖与 CMake 参数Gosmore 的编译依赖不多核心是 zlib解 PBF 的压缩流、libxml2 和 expat备用 XML 解析路径。Ubuntu 上需要安装开发头文件而不是只装运行时库。装错包是新手最容易踩的坑后面第 5 章会专门讲。sudo apt install -y build-essential cmake zlib1g-dev libxml2-dev libexpat-dev cd ~/src/gosmore mkdir -p build cd build cmake .. -DCMAKE_BUILD_TYPERelease make -j$(nproc)-DCMAKE_BUILD_TYPERelease会关掉调试符号生成的二进制体积更小、运行时内存占用也更低。make -j$(nproc)用全部 CPU 核心并行编译如果机器内存紧张建议改成make -j2避免编译过程因内存不足被杀。编译成功后build目录下会有一个gosmore可执行文件。3.3 创建 Gosmore 路网库从 PBF 生成二进制路由文件这一步是核心。Gosmore 会把 OSM 的路网数据解析并构造成二进制路由库之后所有查询都基于这个库不再碰原始 PBF。./gosmore -c ~/osm/taiwan-latest.osm.pbf ls -lh gosmore.db-c表示创建模式输入文件是上一步下载的 PBF输出默认是当前目录下的gosmore.db。这个过程是 CPU 密集和内存密集的城市级数据几秒到十几秒省级数据可能要几分钟内存峰值通常在几百 MB 到 1GB 以上。我习惯用time ./gosmore -c ...记录耗时方便对比不同区域数据量对构建时间的影响。如果创建过程中内存不足被系统杀掉就需要回到第 3.1 节换更小的区域包或者用 osmium 把数据裁剪到边界范围内再构建。这个问题很常见属于“数据范围没选对”造成的规模失误不是 Gosmore 本身的问题。3.4 启动服务并打出第一条路线路由库生成后把gosmore.db作为输入启动 HTTP 服务监听本地端口。不同 fork 对端口参数命名略有差异统一的做法是先看帮助信息。./gosmore gosmore.db -p 8080 curl http://127.0.0.1:8080/?flat25.04flon121.51tlat25.05tlon121.55vmotorcar把gosmore.db作为第一个参数启动服务-p指定监听端口。如果这个 fork 不识别-p先执行./gosmore -h看帮助里的端口参数名。curl请求中flat和flon是起点经纬度tlat和tlon是终点经纬度v指定出行方式。返回 JSON 里带一个response数组就是算出来的路径点列。能打出这些点说明整个链路已经跑通。浏览器直接打开http://127.0.0.1:8080/一般能看到 Gosmore 内置的调试页面可以在地图上点选起点终点验证路径。这个页面很简陋只适合快速确认服务活着不适合做生产界面。4. Gosmore HTTP API 参数与返回结构三条线路的 Python 冒烟测试4.1 请求参数表与经纬度边界Gosmore 的 HTTP 接口非常直接所有参数都走 URL query string。以下是我手头常见版本支持的参数建议以实际 fork 的 README 为准。参数必需说明示例flat是起点纬度25.04flon是起点经度121.51tlat是终点纬度25.05tlon是终点经度121.55v否出行方式motorcar / bicycle / footmotorcarformat否返回格式 jsonjsoncallback否JSONP 回调函数名用于跨域调试cb经纬度都是 WGS84 坐标小数直接传浮点值不需要编码。最容易写错的是纬度经度顺序纬度在前、经度在后和很多地图服务的“经度,纬度”习惯相反。这个反了我不知道多少次每次都是冒烟测试第一步就发现返回空路径。4.2 三种出行方式的差异与配置入口motorcar只走允许机动车通行的道路会避开步行街、台阶和部分小路bicycle会优先选择骑行友好道路有时会主动绕远foot则会把公园步道、人行横道纳入计算。三种方式的差别来自 Gosmore 源码树里的车辆配置文件不同版本位置不一样但通常能在 profiles 目录下找到和 motorcar、bicycle、foot 同名的文件。配置文件决定一条道路是否可用以及它的通行代价。比如highwayresidential对 motorcar 是允许的但对vfoot可能权重很低。如果你发现某条路明明存在却算不出来先检查配置里是不是把这个类型的道路过滤掉了。4.3 Python 冒烟脚本连测三条路线写一个简单的 Python 脚本循环请求三个坐标对能快速验证服务和路网状态。这是我把 Gosmore 集成到项目前必跑的检查。import requests def gosmore_route(flat, flon, tlat, tlon, vmotorcar): base http://127.0.0.1:8080/ params { flat: flat, flon: flon, tlat: tlat, tlon: tlon, v: v, } resp requests.get(base, paramsparams, timeout15) resp.raise_for_status() return resp.json() if __name__ __main__: cases [ (25.040, 121.510, 25.050, 121.520), (25.045, 121.515, 25.055, 121.525), (25.030, 121.505, 25.060, 121.530), ] for flat, flon, tlat, tlon in cases: data gosmore_route(flat, flon, tlat, tlon) pts data.get(response, []) print(路径点数:, len(pts), 起点:, pts[0], 终点:, pts[-1])timeout15是为了防止极端情况下服务端长时间无响应拖死测试流程。resp.raise_for_status()会快速暴露 HTTP 层的异常。如果所有用例的路径点数都大于 0说明路网覆盖连续且服务稳定如果某个用例返回空先确认坐标是否在 PBF 覆盖范围内再检查配置文件对该路段类型的限制。5. Gosmore 部署避坑手册编译、内存与路网匹配的五个现场5.1 现象服务起来了但路由请求一直返回空白结果启动后curl根目录能通但带起点终点的请求返回空 JSON 或者直接白屏。原因通常是启动方式不对有些版本要求先创建数据库再启动服务有些版本启动服务时要显式指定数据库文件路径参数顺序反了就会进到“无数据模式”。解决先执行./gosmore -h确认启动参数再用./gosmore gosmore.db -p 端口这种“数据库文件 端口”的组合启动。如果依旧空白用第 4.3 节的 Python 脚本打一个最短请求看返回 JSON 里有没有response字段。没有这个字段说明请求链路根本就没进路由逻辑。5.2 现象刚下载的最新 PBF某个区域却完全无路可选其他区域正常唯独某个县城或者新区算不出路线。我遇到过的原因有两个一是该区域在 OpenStreetMap 上本来就没画路网二是道路标签是highwayconstruction或highwayproposed这种还在施工或规划中的路不会被当作可通行道路。Gosmore 不是地图渲染器它只认标签标签不满足条件就不给路。解决到 OpenStreetMap 网页上核对坐标附近是否有已标注的highway*道路。如果有检查具体标签如果是construction找到配置文件中对应的过滤规则手动允许或者换一条已通车的路做测试坐标。5.3 现象编译或建库时内存暴涨整个进程被 OOM 杀掉较大区域的数据文件在构建路由库时内存占用会线性上升。我试过用一个欧洲国家的 PBF 在 2GB 内存机器上构建跑到一半系统直接 kill 进程。这不是 Gosmore 的 bug而是数据范围超出了机器承载能力。解决先把 PBF 按行政区边界裁小再构建。推荐用 osmium命令是osmium extract -b 左,下,右,上 输入.osm.pbf -o 输出.osm.pbf。把数据控制在城市级构建内存会从 GB 级降到几百 MB。编译阶段同理make -j$(nproc)改make -j2减少并行编译带来的内存压力。5.4 现象zlib 和 libxml2 明明装了cmake 却报找不到系统里有/usr/lib/x86_64-linux-gnu/libz.so但 cmake 配置阶段报Could NOT find ZLIB。原因是 Ubuntu 区分运行时库和开发头文件只装了zlib1g没装zlib1g-dev头文件/usr/include/zlib.h不存在。解决安装zlib1g-dev libxml2-dev libexpat-dev。如果不确定包名用apt-cache search zlib | grep dev找出准确的包名再安装。这个现象在干净系统上特别常见属于系统准备阶段最容易翻车的一步。5.5 现象路径形状正确但转弯指令顺序错乱明显绕路路线整体从起点到了终点但指令顺序和实际道路走向对不上或者某段路明明直线可达却绕了一大圈。原因一般是配置文件里的道路通行方向判断过严把oneway标签缺失的道路当成了双向禁行也可能是经纬度参数写反导致起点终点被替换。解决先用一条简单的“直行”路线做基准测试比如起点终点在同一条主干道上确认基础逻辑没问题。再逐步加上转弯对比 OpenStreetMap 上的实际道路方向。如果想调去配置文件里放宽oneway相关判断或者在数据预处理时保留更多道路属性。这个用玄学很难排查老老实实从简单坐标对开始。6. 让 Gosmore 适配真实离线项目数据裁剪、车辆配置与 systemd 常驻Gosmore 的价值在离线场景里才真正放大。我常用的三个技巧能让它从“能跑”变成“好用”。第一是按城市边界裁剪数据后重新建库。全国 PBF 构建出来的路由库可能有好几 GB而一个城市只需要几十 MB。裁剪命令我会用 osmiumosmium extract -b 121.0,25.0,121.7,25.2 ~/osm/taiwan-latest.osm.pbf -o ~/osm/taipei.osm.pbf构建内存和查询延迟都会明显下降路由库文件也方便拷进嵌入式设备。第二是通过车辆配置文件调整路线偏好。默认配置偏保守如果你觉得 motorcar 模式太爱走窄巷把highwayresidential的代价调高同时降低highwayprimary的代价路线就会更倾向走主干道。具体关键字以你拿到的版本为准思路是“代价越小越优先”。第三是把 Gosmore 注册成 systemd 服务让它开机自启、崩溃自动拉起。写一个 unit 文件指向启动命令再把建库流程放到单独脚本里数据更新时手动执行一次即可。我在做离线导航相关项目时最有用的一个习惯是先把 Gosmore 跑通再用重型引擎做批量计算。你不仅验证了数据质量也给整个方案留下了一个不依赖外网的兜底。这些年的踩坑经验让我对“离线路线”四个字理解得越来越具体它不单是不连网而是当所有人都连不上网时你的设备还能给出那条路。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

librosa.display 深度解析:基于 matplotlib 的音频与音乐可视化 API 全解 2026/9/25 5:40:16

librosa.display 深度解析:基于 matplotlib 的音频与音乐可视化 API 全解

音频处理科研 【免费下载链接】librosa Python library for audio and music analysis 项目地址: https://gitcode.com/gh_mirrors/li/librosa 点击查看 免费下载 本文围绕 librosa 官方文档中的 Display API 索引页 展开,系统讲解 librosa.display 模块…

阅读更多 →
Apache Beam 基础设施合规强制模块:IAM 策略与服务账号密钥漂移检测实战 2026/9/25 5:40:16

Apache Beam 基础设施合规强制模块:IAM 策略与服务账号密钥漂移检测实战

大数据批处理流处理数据工程 【免费下载链接】beam Apache Beam is a unified programming model for Batch and Streaming data processing. 项目地址: https://gitcode.com/gh_mirrors/beam4/beam 点击查看 免费下载 infra/enforcement 是 Apache Beam 仓库中用于…

阅读更多 →
Atlas 300V 24G跑YOLO全流程:从环境搭建到推理优化 2026/9/25 5:40:09

Atlas 300V 24G跑YOLO全流程:从环境搭建到推理优化

干了这么多年AI部署,说实话被各种推理卡折磨过不少回,Atlas 300V 24G 这张卡算是让我印象比较深的一张。一开始单纯以为它就是一张普通的 PCIe 加速卡,结果从驱动到算子适配到模型转换,每一步都有它自己的脾气。这篇文章就围绕 At…

阅读更多 →
Atlas 300V 24G推理加速卡部署YOLOv5全流程实战 2026/9/25 5:40:09

Atlas 300V 24G推理加速卡部署YOLOv5全流程实战

最近在折腾Atlas这块卡,把YOLO模型从PyTorch一路迁移到昇腾推理环境,踩了不少坑,也终于理清了整套流程。先说结论:Atlas 300V 24G确实是运算加速卡,但更准确的说法是AI推理加速卡,它和打游戏的显卡、跑训练…

阅读更多 →
CIFAR-10/CIFAR-100稳定下载与数据验证指南 2026/9/25 5:40:03

CIFAR-10/CIFAR-100稳定下载与数据验证指南

1. 项目概述:为什么CIFAR-10和CIFAR-100仍是深度学习入门绕不开的“第一块砖”你刚打开PyTorch文档,想跑通第一个图像分类模型,官方教程里赫然写着torchvision.datasets.CIFAR10;你在Keras官网上找示例代码,tf.keras.d…

阅读更多 →
Atlas 300V Pro 24G推理卡部署YOLO实战:从环境搭建到性能调优 2026/9/25 5:39:57

Atlas 300V Pro 24G推理卡部署YOLO实战:从环境搭建到性能调优

1. 一张24GB的推理卡,先搞清楚它能干什么先回答那个被反复问到的问题:Atlas 300V 24G确实是运算加速卡,而且不是那种插在个人电脑里跑游戏的显卡,它的定位是数据中心和边缘服务器里的AI推理加速卡。很多朋友看到“300V”“24G”第…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉