基于Leaflet和GraphHopper实现离线路径规划

需求分析:

       首先关于地图功能都是基于开源框架Leaflet进行开发,现在要在断网的情况下实现路径规划。这里面其实包含了两个问题:

1.路网数据必须是离线的;

2.必须有离线的路径规划后台服务。

开发过程:

       刚开始把GraphHopper源码Git下来的时候,看了看代码我是懵逼的。其实如果只是用他的离线接口的话,没有必要去看他的源代码,只要找到必要的readme.md文档可以了。他这个项目上有好多个md文档,从这个文档跳到那个,很容易失去重点。下面给出我阅读的顺序。

        1.先把他给的例子跑起来看看效果,文档地址:https://github.com/graphhopper/graphhopper/blob/master/docs/web/quickstart.md   怎么跑里面写的已经很详细了。

基于Leaflet和GraphHopper实现离线路径规划_第1张图片

起来之后是这样的。这里还有个问题,如果你的数据过大,可能会等的时间过长或者内存溢出,正常现象,可以在命令里面加上-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实现离线路径规划_第2张图片

然后在pom.xml里面加上两个依赖:

    
      com.graphhopper
      graphhopper-reader-osm
      0.11.0
    
    
      com.graphhopper
      graphhopper-core
      0.11.0
    

再然后把文档里的代码拷到你的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> iList = il.createJson();

        // or get the result as gpx entries:
        List list = il.createGPXList();
        System.out.println(iList);
    }
}

       到现在,你想要的数据基本上都可以拿到了,接下来你可以把他写成一个后台服务,在前台调用。但是,上面的这段代码只提供一个起点和终点的路径规划,想要再加上中间点或者有更多需求的话,可以多看看他们官网或者github上的代码。

       其实,这里有个简单方法,在第一步的时候,就已经把服务启动了,那个就相当于一个远程服务,只不过是跑在本机上。我们只要在前台把url拼好,直接通过AJAX就可以进行请求。如何搭建离线路径规划服务以及前台如何请求等详细内容请见下篇。

https://blog.csdn.net/wml00000/article/details/84108694

你可能感兴趣的:(Leaflet)