哥们儿几个月前搞了个小项目,需要跑一个本地的地图服务。你想,现在这年头,离不开地图,导航、位置服务啥的,都得地图数据撑着。我寻思着,那行,干脆自己弄一套得了,省得老是调别人的API,限流不说,数据也不一定是最新的。
本站为89游戏官网游戏攻略分站,89游戏每日更新热门游戏,下载请前往主站地址:www.gm89.icu
刚开始那会儿,我图省事儿,直接去网上拽了个完整的 中国地图数据包 全球数据包,那玩意儿叫什么来着,反正就是个巨大的PBF文件,几十个G。下载就下了老半天,解压、导入数据库,那叫一个慢。好不容易搞定了,服务也起来了,心里美滋滋的。可没过几天,问题就来了。
你地图数据这东西,可不是一成不变的,路会修,店会开,地标会换。我这本地跑的服务,数据跟不上,那不就成了老黄历了嘛我寻思着,要不就隔三差五地把那个几十G的大PBF文件再拉一遍?那真是要我的老命!每次下载、导入,都得耗掉我大半天时间,带宽也顶不住,电脑也嗡嗡响。
第一次见到“*”这玩意儿
就在我抓耳挠腮,想着怎么才能更新这些数据的时候,我在一个技术论坛开源社区瞎逛。有人提到了什么“OSM更新流”的,还贴了几个链接。我点进去一看,好家伙,一堆奇奇怪怪的文件夹,里面都是一些小小的.pbf文件,文件名还都是数字,比如000/001/*,旁边还跟着一个文件。我当时就纳闷了,这是啥玩意儿?这么小的文件,能干
最让我眼熟的就是,有些文件名里带着replay字样。我当时就想,这肯定不是什么完整数据包,是不是跟“回放”啥的有关系?我以前玩游戏的时候,录像文件就叫replay。但地图数据这东西,怎么还回放?
上手就是干,结果撞了个南墙
好奇心驱使着我,我就瞎折腾起来了。我随便下了几个那种带数字的PBF文件,还有那个,想着能不能直接用我之前导入大PBF文件的工具打开。结果,当然是报错了!工具压根儿不认,提示文件格式不对,或者数据不完整。
我当时真想摔鼠标,心想这都是什么鬼东西!但是又觉得不对劲,既然有人提,就肯定有它的道理。于是我就开始各种搜索,什么“OSM更新”、“PBF差分”、“地图数据增量更新”之类的关键词,轮番轰炸。
茅塞顿开:原来是个“更新包”
折腾了几天,终于让我找到一些零零碎碎的线索。我才知道,原来我看到的那堆小PBF文件,根本就不是什么完整地图数据,它就是增量更新包,或者叫差分数据。
你想,整个地球那么大,每天都在变。要是一点点变化都要重新下载整个地球数据,那谁也受不了。聪明的大佬们就搞了个机制,把每天甚至每小时产生的地图变化,单独打包成一个个很小的PBF文件,这些文件就是大家说的“*”流中的一部分。它们记录的只是某个时间段内,地图上新增了什么、修改了什么、删除了什么。
那个文件,就是个状态记录。它告诉你,当前这个更新包是第多少个,它适用于从哪个版本更新到哪个版本。就跟游戏更新包一样,你得知道你的游戏版本,才能打对应的补丁。
实战出真知:打补丁,更新我的本地地图
搞明白了原理,接下来就是找工具了。我发现了一个叫osmosis“奥斯莫西斯”的开源工具(名字有点拗口,但很管用),专门就是干这个活儿的。还有一些基于它的或者更简单的脚本别人写好的脚本也行。
我的步骤大概是这样:
- 我得记住我本地数据库里的地图数据,它对应的是哪个时间点、哪个版本。这个信息在导入的时候就会有记录。
- 然后,我就去那个更新流的
网站地址,找到比我本地数据新的那个文件,看看它说了什么,比如它告诉我现在最新的更新到第“12345”号了。 - 我就把从我本地版本到“12345”号中间的所有那些小PBF更新文件,一个一个地下载下来。有时候一天能有好几十个,有时候就几个。
- 就是用那个“奥斯莫西斯”工具,把这些下载下来的增量PBF文件,按照顺序,一个接一个地“打补丁”到我本地的地图数据库里。这个过程就像是给我的地图数据库“播放”一遍所有的变化。
这个过程比我想象的要快得多!每个小PBF文件才几MB、几十MB,下载快,处理起来也快。我的本地地图服务,数据很快就更新到了最新的状态,而且全程只花了很少的带宽和时间。
感受:这东西真香!
自从我搞明白了这东西,我的本地地图服务就没再出现过数据老旧的问题。每天定时跑个脚本,自动下载更新包,自动打补丁,我的地图服务永远都是新鲜的。
回过头来看,这个,就是提供了一种非常高效、智能的数据同步机制。它不是让你每次都全量替换,而是给你一个小小的“差值”,让你自己去“缝合”。这不光省了我的事儿,也极大地减轻了提供地图数据源那边的压力。所以说,一个看起来不起眼的小文件格式,背后却藏着大大的智慧。
我这下可算彻底搞明白了,这玩意儿就是用来给咱这种跑本地服务的,提供增量更新的宝贝,省时省力,真心不错。