天天看點

基于OpenStreetMap地圖資料的離線路徑規劃

距離上次寫部落格已經好久了,這段時間斷斷續續也有弄一下關于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伺服器上,然後再将自己本地修改過的地圖用離線地圖的方式顯示出來就行啦。至于怎麼顯示離線地圖,那就放到下一篇吧~

繼續閱讀