需求分析:
首先關于地圖功能都是基于開源架構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 instance
GraphHopper 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 import
hopper.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 errors
if(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 path
PointList pointList = path.getPoints();
double distance = path.getDistance();
long timeInMs = path.getTime();
System.out.println(pointList);
InstructionList il = path.getInstructions();
// iterate over every turn instruction
for(Instruction instruction : il) {
instruction.getDistance();
//System.out.println(instruction.getDistance());
}
// or get the json
List<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