首先graphhopper是一个开源的免费的的路线规划,里面涵盖了全世界的地图,采用的经度纬度上WGS84(Gps)坐标系。因为是开源的所以设计到一些很精细到城市道路路线,可能与国内的三大图商(百度、高德、腾讯)有所差距。但是开源意味着我们可以免费使用,感谢graphhopper。GraphHopper Directions API with Route Optimization
话不多说,直接说怎么使用。
去openstream Map下载开源的亚洲板块中的中国地图数据Geofabrik Download Server
(当然如果你精确到中国的某一个城市,可以中国地图里面下载某一个城市的地图)
依赖:
<!-- https://mvnrepository.com/artifact/com.graphhopper/graphhopper-core -->
<dependency>
<groupId>com.graphhopper</groupId>
<artifactId>graphhopper-core</artifactId>
<version>4.0</version>
</dependency>
public GraphHopper createGraphHopperInstance() {
GraphHopper hopper = new GraphHopper();
// OSM 文件路径
hopper.setOSMFile("china-latest.osm.pbf");
// 读取完OSM数据之后会构建路线图,此处配置图的存储路径
hopper.setGraphHopperLocation("target/routing-graph-cache");
// 支持car、bike、foot三种交通方式的导航
hopper.setProfiles(new Profile("car").setVehicle("car").setWeighting("fastest").setTurnCosts(false));
//设置汽车
hopper.getCHPreparationHandler().setCHProfiles(new CHProfile("car"));
hopper.importOrLoad();
return hopper;
}
//自制路线距离
public Route routing(GraphHopper hopper, GrahhVo grahhVo) {
//输入你的经度纬度,选择交通方式
GHRequest req = new GHRequest(grahhVo.getFromLat(), grahhVo.getFromLng(), grahhVo.getToLat(), grahhVo.getToLng()).
setProfile("car");
GHResponse rsp = hopper.route(req);
//如果路线不可达抛异常
try {
// handle errors
if (rsp.hasErrors()) throw new RuntimeException(rsp.getErrors().toString());
} catch (Exception e) {
e.printStackTrace();
return routing(grahhVo);
}
// use the best path, see the GHResponse class for more possibilities.
ResponsePath path = rsp.getBest();
// 导航结果点位集合
PointList pointList = path.getPoints();
// 总距离 m
double distance=0;
distance = path.getDistance();
// 总耗时 ms
long timeInMs=0;
timeInMs = (path.getTime())/1000;
System.out.println("路线点位: " + pointList);
System.out.println("总距离: " + distance + ", 总用时: " + timeInMs);
GHPoint3D from = pointList.get(0);
GHPoint3D to = pointList.get(pointList.size()-1);
System.out.println("第一个点的坐标呢:"+pointList.get(pointList.size()-1)+"))))");
Translation tr = hopper.getTranslationMap().getWithFallBack(Locale.CHINA);
InstructionList il = path.getInstructions();
// iterate over all turn instructions
for (Instruction instruction : il) {
System.out.println("distance " + instruction.getDistance() + " for instruction: " + instruction.getTurnDescription(tr));
}
//选择自己需要的,并创建实体类
Route route=new Route();
/* route.setStartId(grahhVo.getStartId());
route.setEndId(grahhVo.getEndId());
if(grahhVo.getStartType()!=null)
route.setStartType(grahhVo.getStartType());
if(grahhVo.getEndType()!=null)
route.setEndType(grahhVo.getEndType());
route.setFromLat(grahhVo.getFromLat());
route.setFromLon(grahhVo.getFromLng());
route.setToLat(grahhVo.getToLat());
route.setToLon(grahhVo.getToLng());
route.setInstance(GetDistance(grahhVo.getFromLat(),grahhVo.getFromLng(),grahhVo.getToLat(), grahhVo.getToLng()));
if(distance!=0)
route.setDistance(distance);
if(timeInMs!=0)
route.setTime(timeInMs);
if(pointList!=null) {
route.setStartDistance(GetDistance(grahhVo.getFromLat(), grahhVo.getFromLng(), from.getLat(), from.getLon()));
route.setEndDistance(GetDistance(grahhVo.getToLat(), grahhVo.getToLng(), to.getLat(), to.getLon()));
}
if(pointList!=null){
route.setUnicom(0);
}else{
route.setUnicom(1);
}
route.setCity(grahhVo.getCity());*/
return route;
}
地图展示 Driving Directions - GraphHopper Maps
设计到地图上页面的展示,可以使用graphhopper里面全世界的地图进行展示,输入你的经度纬度(WGS84),与国内采用的经度纬度有点不一样,可以看看我自己的博客里面有关于经度纬度的转换文章。
graphhopper进行路线规划时间很快,估计在6ms到60ms之内,效率很高比我们国内调用图商(百度、高德、腾讯的api还快),通过我自己很多路径规划分析,感觉graphhopper的路径规划和高德的路径规划很接近。