Java使用graphhopper完成路线规划

    首先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的路径规划和高德的路径规划很接近。

要调用百度地图路线规划,你需要先注册百度地图开发者账号,并且创建一个应用,然后获取应用的AK(Access Key)。 接下来,你可以使用百度地图提供的Web API或者SDK进行路线规划。以下是一个使用百度地图Web API进行路线规划的示例代码: ```java import java.net.URLEncoder; import java.util.List; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class BaiduMapRoutePlanning { public static void main(String[] args) throws Exception { // 百度地图开发者AK String ak = "your_ak_here"; // 起点经纬度 String origin = "40.057406,116.296439"; // 终点经纬度 String destination = "39.908749,116.397491"; // 请求URL String url = "http://api.map.baidu.com/direction/v2/driving?origin=" + URLEncoder.encode(origin, "UTF-8") + "&destination=" + URLEncoder.encode(destination, "UTF-8") + "&ak=" + ak; // 创建HttpClient CloseableHttpClient httpClient = HttpClients.createDefault(); try { // 创建HttpGet HttpGet httpGet = new HttpGet(url); // 发送请求并获得响应 CloseableHttpResponse response = httpClient.execute(httpGet); try { // 解析响应内容 String content = EntityUtils.toString(response.getEntity()); System.out.println(content); } finally { response.close(); } } finally { httpClient.close(); } } } ``` 上面的代码中,我们使用了Apache HttpClient库来发送HTTP请求,并且将返回的JSON格式数据打印到控制台上。你需要将`your_ak_here`替换成你自己的百度地图开发者AK。 如果你想使用百度地图SDK进行路线规划,可以参考百度地图官方文档中的示例代码。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值