天天看點

基于Leaflet和GraphHopper實作離線路徑規劃需求分析:開發過程:

需求分析:

       首先關于地圖功能都是基于開源架構Leaflet進行開發,現在要在斷網的情況下實作路徑規劃。這裡面其實包含了兩個問題:

1.路網資料必須是離線的;

2.必須有離線的路徑規劃背景服務。

開發過程:

       剛開始把GraphHopper源碼Git下來的時候,看了看代碼我是懵逼的。其實如果隻是用他的離線接口的話,沒有必要去看他的源代碼,隻要找到必要的readme.md文檔可以了。他這個項目上有好多個md文檔,從這個文檔跳到那個,很容易失去重點。下面給出我閱讀的順序。

        1.先把他給的例子跑起來看看效果,文檔位址:https://github.com/graphhopper/graphhopper/blob/master/docs/web/quickstart.md   怎麼跑裡面寫的已經很詳細了。

基于Leaflet和GraphHopper實作離線路徑規劃需求分析:開發過程:

起來之後是這樣的。這裡還有個問題,如果你的資料過大,可能會等的時間過長或者記憶體溢出,正常現象,可以在指令裡面加上-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就行,

基于Leaflet和GraphHopper實作離線路徑規劃需求分析:開發過程:

然後在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

繼續閱讀