Android之调用百度地图API规划当前位置到指定位置的路线

版权声明:本文版权归Heavn所有,转载或引用请注明出处 https://blog.csdn.net/qq_38137411/article/details/83063122

本文属于原创作品,转载请注明出处。

数据库课设做了一个Android端的外面平台,包括顾客端、骑手端、商家端和后台审核端四个客户端。
然后想给骑手做一个路线导航的功能,能够自动规划自己当前位置到顾客或者商家的路线。
这里调用了百度地图的API。
以下是具体内容。

  1. 下载百度地图SDK

    上百度地图官网下载,下载时建议把示例代码也下载下来,里面有些文件之后可以用到。

  2. 配置AndroidStudio

    具体配置过程可以参看这篇博客

  3. 源代码
    找到之前下载的示例代码中的assets文件夹,将它复制到src/main目录下,这个文件夹里面含有百度地图路线规划的图片素材,当然也可以自定义使用。

    然后,将示例代码中的DrivingRouteOverlay.java和OverlayManager.java复制过来

    接下来是源代码,这里以驾车路线规划作为展示:

activity_map.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!--顶部导航栏-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center_vertical"
        android:background="@color/blue"
        android:orientation="horizontal">
        <ImageView
            android:id="@+id/back"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@drawable/back"/>
        <TextView
            android:text="地图导航"
            android:textColor="@color/white"
            android:textSize="20sp"
            android:gravity="center"
            android:paddingRight="50dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <com.baidu.mapapi.map.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true"></com.baidu.mapapi.map.MapView>
</LinearLayout>

MapActivity.java

/**
 * 百度地图定位与导航
 * Created by Administrator on 2018/9/30 0030.
 */

public class MapActivity extends BaseActivity {
    private MapView mMapView;
    private LocationClient locationClient;
    private BaiduMap baiduMap;
    private boolean firstLocation;
    private RoutePlanSearch mySearch;

    private ImageView back;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //此方法要再setContentView方法之前实现
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_map);



        back = findViewById(R.id.back);
        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
        mMapView = findViewById(R.id.map);
        baiduMap = mMapView.getMap();
        MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15f);
        baiduMap.setMapStatus(msu);

        // 定位初始化
        locationClient = new LocationClient(this);
        firstLocation =true;
        // 设置定位的相关配置
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        option.setOpenGps(true);
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(1000);
        locationClient.setLocOption(option);

        locationClient.registerLocationListener(new BDLocationListener() {
            @Override
            public void onReceiveLocation(BDLocation location) {
                // map view 销毁后不在处理新接收的位置
                if (location == null || mMapView == null)
                    return;
                // 构造定位数据
                MyLocationData locData = new MyLocationData.Builder()
                        .accuracy(location.getRadius())
                        // 此处设置开发者获取到的方向信息,顺时针0-360
                        .direction(100).latitude(location.getLatitude())
                        .longitude(location.getLongitude()).build();
                // 设置定位数据
                baiduMap.setMyLocationData(locData);

                // 第一次定位时,将地图位置移动到当前位置
                if (firstLocation)
                {
                    firstLocation = false;
                    //手机定位到的当前位置
                    LatLng xy = new LatLng(location.getLatitude(),
                            location.getLongitude());
                    mySearch = RoutePlanSearch.newInstance();
                    mySearch.setOnGetRoutePlanResultListener(listener);
                    PlanNode stNode = PlanNode.withLocation(xy);
                    //目的位置
                    PlanNode enNode = PlanNode.withCityNameAndPlaceName("北京", "天安门广场");
                    //驾车路线规划
                    mySearch.drivingSearch((new DrivingRoutePlanOption())
                            .from(stNode)
                            .to(enNode));
                    mySearch.destroy();
                    MapStatusUpdate status = MapStatusUpdateFactory.newLatLng(xy);
                    baiduMap.animateMapStatus(status);
                }
            }
        });
    }

    @Override
    protected void onStart()
    {
        // 如果要显示位置图标,必须先开启图层定位
        baiduMap.setMyLocationEnabled(true);
        if (!locationClient.isStarted())
        {
            locationClient.start();
        }
        super.onStart();
    }

    @Override
    protected void onStop()
    {
        // 关闭图层定位
        baiduMap.setMyLocationEnabled(false);
        locationClient.stop();
        super.onStop();
    }

    @Override
    protected void onDestroy()
    {
        super.onDestroy();
        // 在activity执行onDestroy时执行mMapView.onDestroy()
        mMapView.onDestroy();
        mMapView = null;
    }

    @Override
    protected void onResume()
    {
        super.onResume();
        // 在activity执行onResume时执行mMapView. onResume ()
        mMapView.onResume();
    }

    @Override
    protected void onPause()
    {
        super.onPause();
        // 在activity执行onPause时执行mMapView. onPause ()
        mMapView.onPause();
    }

    OnGetRoutePlanResultListener listener = new OnGetRoutePlanResultListener() {
        //获取步行线路规划结果
        @Override
        public void onGetWalkingRouteResult(WalkingRouteResult result) {
        }
        //获取综合公共交通线路规划结果
        @Override
        public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
        }
        //获取**跨城**综合公共交通线路规划结果
        @Override
        public void onGetMassTransitRouteResult(MassTransitRouteResult massTransitRouteResult) {
        }
        //获取驾车线路规划结果
        @Override
        public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
            if (drivingRouteResult == null || drivingRouteResult.error !=   SearchResult.ERRORNO.NO_ERROR) {
                Toast.makeText(MapActivity.this, "抱歉,未找到结果"+drivingRouteResult.error, Toast.LENGTH_SHORT).show();
                Log.e("error",""+drivingRouteResult.error.toString());
            }
            if (drivingRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
                // 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
                drivingRouteResult.getSuggestAddrInfo();
                return;
            }
            if (drivingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
                if (drivingRouteResult.getRouteLines().size() >= 1) {
                    DrivingRouteOverlay overlay = new DrivingRouteOverlay(baiduMap);
                    baiduMap.setOnMarkerClickListener(overlay);
                    overlay.setData(drivingRouteResult.getRouteLines().get(0));
                    overlay.addToMap();
                    overlay.zoomToSpan();
                } else {
                    Log.d("route result", "结果数<0");
                    return;
                }
            }
        }
        //室内路线规划结果
        @Override
        public void onGetIndoorRouteResult(IndoorRouteResult indoorRouteResult) {
        }
        //获取普通骑行路规划结果
        @Override
        public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
            if (bikingRouteResult == null || bikingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
                Toast.makeText(MapActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
            }
            if (bikingRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
                // 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
                bikingRouteResult.getSuggestAddrInfo();
                return;
            }
            if (bikingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
                if (bikingRouteResult.getRouteLines().size() >= 1) {
                    BikingRouteOverlay overlay = new BikingRouteOverlay(baiduMap);
                    baiduMap.setOnMarkerClickListener(overlay);
                    overlay.setData(bikingRouteResult.getRouteLines().get(0));//设置路线数据
                    overlay.addToMap();
                    overlay.zoomToSpan();
                } else {
                    Log.d("route result", "结果数<0");
                    return;
                }
            }
        }
    };
}

但是我也试过骑行路线规划,不知道为什么骑行路线的搜索结果数量时钟为0,如果有哪位大佬知道原因的请评价告知一下,在此万分感谢!

猜你喜欢

转载自blog.csdn.net/qq_38137411/article/details/83063122