Skip to content

路线规划

基本介绍

根据出发地、目的地、途经地以及路径策略设置,可以根据用户设置的车牌信息,帮助用户规避限行区域,规划出最佳出行路线。 关键类:

  • DMapNavi :此类是导航功能管理类,提供路线规划、行前选路、导航中控制导航视野,设置主辅路、桥上桥下等方法。
  • DMapNaviListener:此类是导航事件信息与数据协议类,提供算路导航过程中的事件(如:路径规划成功/失败、TTS播报字符串、定位信号类型、路口放大图、车道线、到达目的地等)以及实时数据(如:诱导信-息NaviInfo等)回调接口。
  • ParallelRoadListener:导航中监听主辅路、桥上桥下变化的回调接口。

初始化DMapNavi

导航和路线规划都需要先初始化DMapNavi实例,需要设置ContextDiMap两个参数,其中Context是必须要设置的,不能为空。DiMap在仅需要算路时,可以不传;如果要发起导航,在地图上显示导航路线,需要通过MapView.getMap接口获取到DiMap,然后再初始化DMapNavi。

xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.dmap.api.maps.MapView
        android:id="@+id/mapview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
java
    MapView mapView = findViewById(R.id.mapview);
    mapView.getMap(didiMap -> {
        DMapNavi dMapNavi = new DMapNavi(Context, DiMap);
        // 添加导航信息回调监听
        dMapNavi.addDMapNaviListener(DMapNaviListener);
        // 添加主辅路、桥上桥下信息回调监听
        dMapNavi.addParallelRoadListener(ParallelRoadListener);
        ... ...
    }

1、设置车辆信息

车辆信息需要在算路之前设置,可以通过设置车牌号和设置CarInfo.setRestriction(true)设置规避限行(如果设置了CarInfo.setRestriction(true),将会替代dMapNavi.calculateDriveRoute设置的算路策略,默认为PathPlanningStrategy.DRIVING_AVOID_RESTRICT),计算出合理路线。其他算路策略参考PathPlanningStrategy

java
    DMapCarInfo carInfo = new DMapCarInfo();
    carInfo.setCarNumber("京XXXXXXX");
    carInfo.setRestriction(true);
    DMapNavi dMapNavi = new DMapNavi(context, null);
    dMapNavi.setCarInfo(carInfo);
    NaviPoi start = new NaviPoi("东软北京研发中心科研楼", new LatLng(40.04809245589786, 116.28114759922028), "");
    NaviPoi end = new NaviPoi("北京西站", new LatLng(39.89591, 116.3213), "");
    List<NaviPoi> waypoints = null;
    dMapNavi.calculateDriveRoute(start, end, waypoints, PathPlanningStrategy.DRIVING_DEFAULT);

2、算路

计算路线可以通过设置起终点(途经点)经纬度来发起算路。示例代码如下

java
    DMapNavi dMapNavi = new DMapNavi(context, null);
    NaviPoi start = new NaviPoi("东软北京研发中心科研楼", new LatLng(40.04809245589786, 116.28114759922028), "");
    NaviPoi end = new NaviPoi("北京西站", new LatLng(39.89591, 116.3213), "");
    List<NaviPoi> waypoints = new ArrayList();
    wayponits.add(new NaviPoi("西二旗地铁站", new LatLng(40.053061, 116.306205), ""));
    dMapNavi.calculateDriveRoute(start, end, waypoints, PathPlanningStrategy.DRIVING_DEFAULT);

3、算路结果

当路径规划成功时,会触发DMapNaviListener.onCalculateRouteSuccess回调,DMapCalcRouteResult可以获取到路线信息,获取到路线之后,可以调用dMapNavi.startNavi()发起导航。

java
    @Override
    public void onCalculateRouteSuccess(DMapCalcRouteResult routeResult) {
        Log.i(TAG, "onCalculateRouteSuccess:" + routeResult);
        long[] routeIds = routeResult.getRouteId();
        // 默认选中第一条路线,如果有多条路线,想设置设置第二条路线导航的话,startNavi之前设置路线id
        if (routeIds != null && routeIds.length > 1) {
            dMapNavi.selectRouteId(routeIds[1]);
        }
        dMapNavi.startNavi();
    }

如果路线规划失败,则会触发DMapNaviListener.onCalculateRouteFailure回调,可以在此回调中来执行相应处理逻辑。