基于Leaflet和GraphHopper实现离线路径规划
需求分析:
? ? ? ?首先關于地圖功能都是基于開源框架Leaflet進行開發,現在要在斷網的情況下實現路徑規劃。這里面其實包含了兩個問題:
1.路網數據必須是離線的;
2.必須有離線的路徑規劃后臺服務。
開發過程:
? ? ? ?剛開始把GraphHopper源碼Git下來的時候,看了看代碼我是懵逼的。其實如果只是用他的離線接口的話,沒有必要去看他的源代碼,只要找到必要的readme.md文檔可以了。他這個項目上有好多個md文檔,從這個文檔跳到那個,很容易失去重點。下面給出我閱讀的順序。
? ? ? ? 1.先把他給的例子跑起來看看效果,文檔地址:https://github.com/graphhopper/graphhopper/blob/master/docs/web/quickstart.md? ?怎么跑里面寫的已經很詳細了。
起來之后是這樣的。這里還有個問題,如果你的數據過大,可能會等的時間過長或者內存溢出,正常現象,可以在命令里面加上-Xmx2g -Xms2g,比如我用的是中國路網:java -Xmx2g -Xms2g -Dgraphhopper.datareader.file=china-latest.osm.pbf -jar *.jar server config-example.yml
? ? ? ?2.看完例子你應該有點想法了,接下來說說怎么用他提供的Java API,參考文檔:https://github.com/graphhopper/graphhopper/blob/master/docs/core/routing.md? ? 用Idea新建一個Maven項目,選那個maven-archetype-quickstart就行,
然后在pom.xml里面加上兩個依賴:
<dependency><groupId>com.graphhopper</groupId><artifactId>graphhopper-reader-osm</artifactId><version>0.11.0</version></dependency><dependency><groupId>com.graphhopper</groupId><artifactId>graphhopper-core</artifactId><version>0.11.0</version></dependency>再然后把文檔里的代碼拷到你的java文件,該改的地方改一改,路網數據也拷到項目里來。下面是我的代碼:
import com.graphhopper.GHRequest; import com.graphhopper.GHResponse; import com.graphhopper.GraphHopper; import com.graphhopper.PathWrapper; import com.graphhopper.reader.osm.GraphHopperOSM; import com.graphhopper.routing.util.EncodingManager; import com.graphhopper.util.GPXEntry; import com.graphhopper.util.Instruction; import com.graphhopper.util.InstructionList; import com.graphhopper.util.PointList;import java.util.List; import java.util.Locale; import java.util.Map;/*** Hello world!**/ public class App {public static void main( String[] args ){// create one GraphHopper instanceGraphHopper hopper = new GraphHopperOSM().forServer();hopper.setDataReaderFile("berlin-latest.osm.pbf");// where to store graphhopper files?hopper.setGraphHopperLocation("resources");hopper.setEncodingManager(new EncodingManager("car"));// now this can take minutes if it imports or a few seconds for loading// of course this is dependent on the area you importhopper.importOrLoad();// simple configuration of the request object, see the GraphHopperServlet classs for more possibilities.GHRequest req = new GHRequest(52.526457, 13.380146, 52.499504,13.426495).setWeighting("fastest").setVehicle("car").setLocale(Locale.CHINA);GHResponse rsp = hopper.route(req);// first check for errorsif(rsp.hasErrors()) {// handle them!// rsp.getErrors()return;}// use the best path, see the GHResponse class for more possibilities.PathWrapper path = rsp.getBest();// points, distance in meters and time in millis of the full pathPointList pointList = path.getPoints();double distance = path.getDistance();long timeInMs = path.getTime();System.out.println(pointList);InstructionList il = path.getInstructions();// iterate over every turn instructionfor(Instruction instruction : il) {instruction.getDistance();//System.out.println(instruction.getDistance());}// or get the jsonList<Map<String, Object>> iList = il.createJson();// or get the result as gpx entries:List<GPXEntry> list = il.createGPXList();System.out.println(iList);} }? ? ? ?到現在,你想要的數據基本上都可以拿到了,接下來你可以把他寫成一個后臺服務,在前臺調用。但是,上面的這段代碼只提供一個起點和終點的路徑規劃,想要再加上中間點或者有更多需求的話,可以多看看他們官網或者github上的代碼。
? ? ? ?其實,這里有個簡單方法,在第一步的時候,就已經把服務啟動了,那個就相當于一個遠程服務,只不過是跑在本機上。我們只要在前臺把url拼好,直接通過AJAX就可以進行請求。如何搭建離線路徑規劃服務以及前臺如何請求等詳細內容請見下篇。
https://blog.csdn.net/wml00000/article/details/84108694
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的基于Leaflet和GraphHopper实现离线路径规划的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对require和import的认识
- 下一篇: 基于GraphHopper搭建离线路径规