基于Leaflet和GraphHopper实现离线路径规划
需求分析: 首先关于地图功能都是基于开源框架Leaflet进行开发,现在要在断网的情况下实现路径规划。这里面其实包含了两个问题:1.路网数据必须是离线的;2.必须有离线的路径规划后台服务。开发过程: 刚开始把GraphHopper源码Git下来的时候,看了看代码我是懵逼的。其实如果只是用他的离线接口的话,没有必要去看他的源代码,只要找到必要的readme...
需求分析:
首先关于地图功能都是基于开源框架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就可以进行请求。如何搭建离线路径规划服务以及前台如何请求等详细内容请见下篇。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)