距离上次写博客已经好久了,这段时间断断续续也有弄一下关于OpenStreetMap的东西,这次把离线路径规划的实现记录一下。
在OpenStreetMap提供的开源项目中,osmbonuspack提供了一些在线路径规划的借口,可以通过向在线发送起始点信息的方式来获取服务器回调的规划路径,主要的方式有以下三种:
GraphHopper
MapQuest
OSMR
具体的请看这里
其中GraphHopper是支持中文路径提示的,而OSMR对于道路的数据可能会比GraphHopper来的多一点(根据自己的一些测试得出的结论,没有具体验证过)
但是osmbonuspack并没有提供离线的路径规划的借口,而老板一定要求我实现离线的功能,而我自己又没有能力写出路径规划算法,所以在寻找离线接口这方面着实是费了不少力气。
所幸后来终于被我找到GraphHopper有提供离线路径规划的接口,可以参看这里的实现,其中,里面的calcpath
方法就是调用OpenStreetMap地图数据来实现离线路径规划的。
然鹅由于自己的渣渣属性,我在搞到离线地图数据的征途上颇费了一番周折(虽然doc都在这里),所以我决定把它记录下来。
首先,使用GraphHopper调用OpenStreetMap的地图数据实现离线路径规划是要经过他提供的shell对数据进行先一步的处理的。
1.我们要先获得所需要进行离线路径规划的区域的.osm地图数据(这一步很简单);
2.我们要去GitHub上下载GraphHopper的项目资源文件夹(这个也很容易);
3.然后把步骤1的.osm文件拷贝到GraphHopper项目文件夹中,然后运行graphhopper.sh来对数据进行转换。在这里,由于我使用的是Windows,我使用了babun来运行。启动babun后,将路径cd到GraphHopper文件夹,然后运行 ./graphhopper.sh import xx.osm
这样就会自动生成一个xx-gh的文件夹,里边就是进行路径规划所需要的地图数据了(这里的.osm文件不能过大,否则容易造成内存溢出,但是具体最大能多少我没有测试过,反正我试过将整个中国的地图数据进行转换最后失败了),生成的地图数据大小都不大;
4.接下来只需要将xx-gh这个文件夹复制到手机sd卡中的 graphhopper/maps/
路径下就可以啦。
然后就是调用之前说到的calcpath
里面的一些方法就能够实现路径的规划了,这里我就不赘述了,最后得到的路径就是 resp.getBest()
得到的。
然后怎么将它显示出来就随便大家了,我是使用osmbonuspack的打点和划线功能显示的。
到此为止就实现了基于OpenStreetMap地图数据的离线路径规划了,这个好处在于他可以规划一些你自己在本地添加到.osm文件中的一些道路,而不用上传到OpenStreetMap服务器上,然后再将自己本地修改过的地图用离线地图的方式显示出来就行啦。至于怎么显示离线地图,那就放到下一篇吧~