2020最新超详细的Android 百度地图开发讲解(3) 路线规划步行骑行驾车路线规划

开发前配置,显示基本地图,实时定位等查看之前代码,此博客紧接上一博客:https://blog.csdn.net/Ace_bb/article/details/104457764
路线规划是百度地图开发最核心的部分,但不是最麻烦的,个人感觉TTS导航是百度地图开发中最麻烦的部分。 路线规划需要的步骤比实现定位多,坑也比较多。这里先实现输入起始点地址,然后实现路线规划,自动查找到最短路线。

本博客将按如下顺序介绍 分三篇文章介绍

  1. 实现基本路线规划,默认地址,无输入交互(步行规划)
  2. 实现起始点输入的路线规划 链接:https://blog.csdn.net/Ace_bb/article/details/104458854
  3. 骑行驾车路线规划实现

实现基本路线规划,默认地址,无输入交互(步行规划)

开发前准备 添加需要的图标 资源包

资源下载:链接:https://pan.baidu.com/s/1V5xKPp_nJPiVFKrrY8-t_Q
提取码:ib5y

下载后打开:

assets文件夹

将assets 文件夹添加到main目录下:

com文件夹

将com问价夹添加到main->java目录下:

这两个文件夹直接复制粘贴即可,不用担心文件名重复,Android studio 会自动将新的文件加进去,保留原有的文件。

com文件夹添加后,会发现很多报错,先不要急,有错误解决就好。 最先需要修改的是R文件报错,因为每个Project的R文件目录肯定是不一样的,引用别人的代码经常都要修改。

R错误主要在IconGenerator类中。

如果有设置自动引用包,把这行代码删除后会自动引用。

text_bubble

然后发现IconGenerator类中有一个text_bubble报错,需要再将这个布局文件添加进来。
打开之前下载的路线规划资源包,打开layout文件夹,把里面的text_bubble.xml文件复制粘贴到layout目录下:

styles.xml1

然后需要替换values文件中的styles文件。打开资源包中的

将styles.xml文件复制粘贴到项目中。
替换前:

替换后:

添加路线规划的button

在布局文件中添加一个button,点击时进行路线规划。

<Buttonandroid:id="@+id/but_RoutrPlan"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="规划"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toTopOf="parent"android:layout_marginTop="50dp"/>

直接复制粘贴。

完整代码

先直接看完整代码,注意看注释


public class MainActivity extends AppCompatActivity implements View.OnClickListener{private MapView mMapView = null;private BaiduMap mBaiduMap = null;private Context context;/* 设置定位代码*///定位相关private double mLatitude;private double mLongtitude;//方向传感器private MyOrientationListener mMyOrientationListener;private float mCurrentX;//自定义图标private BitmapDescriptor mIconLocation;//定义SDK核心类private LocationClient mLocationClient;public BDAbstractLocationListener myListener;private LatLng mLastLocationData;//判断是否是首次定位private boolean isFirstin = true;/* 设置定位代码 *///设置变量target,表示默认定位的地方 默认地点华理protected LatLng target = new LatLng(30.83673,121.510342);//路线规划相关private RoutePlanSearch mSearch = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);SDKInitializer.initialize(getApplicationContext());setContentView(R.layout.activity_main);SDKInitializer.setCoordType(CoordType.BD09LL);//没有这个HTTP申请无法实现路线规划SDKInitializer.setHttpsEnable(true);/* 设置定位代码 */this.context = this;//获取百度地图控件mMapView = (MapView) findViewById(R.id.bmapView);//获取地图控件对象mBaiduMap = mMapView.getMap();initMyLocation(); //定位方法/* 设置定位代码 *///设置地图默认定位位置,地图中心位target的经纬度MapStatusUpdate mapStatusUpdate= MapStatusUpdateFactory.newLatLng(target);mBaiduMap.setMapStatus(mapStatusUpdate);//设置地图缩放比例为15mapStatusUpdate = MapStatusUpdateFactory.zoomTo(18);mBaiduMap.setMapStatus(mapStatusUpdate);//路线规划方法initPoutePlan();button();}private void button() {//按钮ImageView mImage_Loc = (ImageView) findViewById(R.id.image_loc);Button mbut_RoutrPlan = (Button) findViewById(R.id.but_RoutrPlan);//按钮事件处理mImage_Loc.setOnClickListener(this);mbut_RoutrPlan.setOnClickListener(this);}public void onClick(View v){SDKInitializer.initialize(getApplicationContext());switch (v.getId()){case R.id.image_loc:{centerToMyLocation(mLatitude,mLongtitude);break;}case R.id.but_RoutrPlan:{StarRoute();}}}protected void onStart() {super.onStart();//开启定位图层mBaiduMap.setMyLocationEnabled(true);if (!mLocationClient.isStarted())mLocationClient.start();//开启方向传感器mMyOrientationListener.start();}@Overrideprotected void onResume() {super.onResume();mMapView.onResume();}@Overrideprotected void onPause() {super.onPause();mMapView.onPause();}@Overrideprotected void onStop() {super.onStop();//停止定位mBaiduMap.setMyLocationEnabled(false);mLocationClient.stop();//停止方向传感器mMyOrientationListener.stop();}@Overrideprotected void onDestroy() {super.onDestroy();//关闭定位图层mBaiduMap.setMyLocationEnabled(false);mMapView.onDestroy();mMapView = null;}//定位  通过继承抽象类BDAbstractListener并重写其onReceieveLocation方法来获取定位数据,并将其传给MapView。 1private class MyLocationListener extends BDAbstractLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {//mapView 销毁后不在处理新接收的位置if (location == null || mMapView == null) {return;}MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius())// 此处设置开发者获取到的方向信息,顺时针0-360.direction(mCurrentX).latitude(location.getLatitude()).longitude(location.getLongitude()).build();mBaiduMap.setMyLocationData(locData);//设置自定义图标MyLocationConfiguration config = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, mIconLocation);mBaiduMap.setMyLocationConfiguration(config);//更新经纬度mLatitude = location.getLatitude();mLongtitude = location.getLongitude();//设置起点mLastLocationData = new LatLng(mLatitude, mLongtitude);if (isFirstin) {centerToMyLocation(location.getLatitude(), location.getLongitude());if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果Toast.makeText(context, "定位:" + location.getAddrStr(), Toast.LENGTH_SHORT).show();} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果Toast.makeText(context, "定位:" + location.getAddrStr(), Toast.LENGTH_SHORT).show();} else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果Toast.makeText(context, "定位:" + location.getAddrStr(), Toast.LENGTH_SHORT).show();} else if (location.getLocType() == BDLocation.TypeServerError) {Toast.makeText(context, "定位:服务器错误", Toast.LENGTH_SHORT).show();} else if (location.getLocType() == BDLocation.TypeNetWorkException) {Toast.makeText(context, "定位:网络错误", Toast.LENGTH_SHORT).show();} else if (location.getLocType() == BDLocation.TypeCriteriaException) {Toast.makeText(context, "定位:手机模式错误,请检查是否飞行", Toast.LENGTH_SHORT).show();}isFirstin = false;}}}//初始化定位,实现当前位置的定位 发起定位 2private void initMyLocation() {//缩放地图MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);mBaiduMap.setMapStatus(msu);//开启定位图层mBaiduMap.setMyLocationEnabled(true);//声明LocationClient类 LocationClient类必须在主线程中声明。需要Context类型的参数mLocationClient = new LocationClient(getApplicationContext());/*** 设置定位参数包括:定位模式(高精度定位模式,低功耗定位模式和仅用设备定位模式),* 返回坐标类型,是否打开GPS,是否返回地址信息、位置语义化信息、POI信息等等。* 高精度定位模式:这种定位模式下,会同时使用网络定位和GPS定位,优先返回最高精度的定位结果;* 低功耗定位模式:这种定位模式下,不会使用GPS,只会使用网络定位(Wi-Fi和基站定位);* 仅用设备定位模式:这种定位模式下,不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位。*///通过LocationClientOption设置LocationClient相关参数LocationClientOption option = new LocationClientOption();option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系int span = 10000;option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要option.setOpenGps(true);//可选,默认false,设置是否使用gpsoption.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要//设置locationClientOptionmLocationClient.setLocOption(option);myListener = new MyLocationListener();//注册监听函数 获取到位置信息时会回调该定位监听器mLocationClient.registerLocationListener(myListener);//解决定位到几内亚湾的问题List<String> permissionList = new ArrayList<>();if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);}if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {permissionList.add(Manifest.permission.READ_PHONE_STATE);}if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);}if (!permissionList.isEmpty()) {String[] permissions = permissionList.toArray(new String[permissionList.size()]);ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);} else {requestLocation();}
//        requestWindowFeature(Window.FEATURE_NO_TITLE);//初始化图标mIconLocation = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps);initOrientation();//开始定位mLocationClient.start();}//回到当前位置的方法 3private void centerToMyLocation(double latitude, double longtitude) {mBaiduMap.clear();mLastLocationData = new LatLng(latitude, longtitude);MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(mLastLocationData);mBaiduMap.animateMapStatus(msu);}//传感器 4private void initOrientation() {//传感器mMyOrientationListener = new MyOrientationListener(context);mMyOrientationListener.setOnOrientationListener(new MyOrientationListener.OnOrientationListener() {@Overridepublic void onOrientationChanged(float x) {mCurrentX = x;}});}//initMyLocation 中调用的方法,同样用于定位。 5private void requestLocation() {//开始定位,定位结果会回调到前面注册的监听器中mLocationClient.start();}//路线规划初始化private void initPoutePlan() {mSearch = RoutePlanSearch.newInstance();mSearch.setOnGetRoutePlanResultListener(listener);}// 路线规划模块public OnGetRoutePlanResultListener listener = new OnGetRoutePlanResultListener() {@Overridepublic void onGetWalkingRouteResult(WalkingRouteResult result) {if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {Toast.makeText(MainActivity.this, "路线规划:未找到结果,检查输入", Toast.LENGTH_SHORT).show();//禁止定位isFirstin = false;}assert result != null;if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {// 起终点或途经点地址有岐义,通过以下接口获取建议查询信息result.getSuggestAddrInfo();return;}if (result.error == SearchResult.ERRORNO.NO_ERROR) {mBaiduMap.clear();Toast.makeText(MainActivity.this, "路线规划:搜索完成", Toast.LENGTH_SHORT).show();WalkingRouteOverlay overlay = new WalkingRouteOverlay(mBaiduMap);overlay.setData(result.getRouteLines().get(0));overlay.addToMap();overlay.zoomToSpan();}//禁止定位isFirstin = false;}@Overridepublic void onGetTransitRouteResult(TransitRouteResult var1) {}@Overridepublic void onGetMassTransitRouteResult(MassTransitRouteResult var1) {}@Overridepublic void onGetDrivingRouteResult(DrivingRouteResult result) {}@Overridepublic void onGetIndoorRouteResult(IndoorRouteResult var1) {}@Overridepublic void onGetBikingRouteResult(BikingRouteResult var1) {}};//开始规划,这里实现多种不同的路线规划方式。private void StarRoute() {SDKInitializer.initialize(getApplicationContext());// 设置起、终点信息PlanNode stNode = PlanNode.withCityNameAndPlaceName("北京", "西二旗地铁站");PlanNode enNode = PlanNode.withCityNameAndPlaceName("北京", "百度科技园");mSearch.walkingSearch((new WalkingRoutePlanOption()).from(stNode).to(enNode));}
}

运行调试程序,如果有报错可能是报错的R包没有修改完。根据错误提示再修改一次就好了。
运行后点击规划按钮:

篇幅过长,接下来的留在下一篇文章中介绍

——————————————————————————
版权所有,转载请说明出处。觉得有用请点个赞

参考博客:https://blog.csdn.net/qq_38605488/article/details/87125202
官方文档:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/route/walk

Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(3) 路线规划步行骑行驾车路线规划相关推荐

  1. Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(6) POI检索, 根据地址输入提示检索 Sug

    POI检索, 根据地址输入提示检索 Sug 参考百度地图官方文档:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/search/sug ...

  2. android studio百度地图教程,Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(4) 路线规划之起始点地址输入实现规划...

    实现起始点输入的路线规划 要实现输入起始点的路线规划,需要两个输入框,可以将两个输入框设置在和地图同一个Activity中,也可以新建一个Activity,来实现地址的输入,然后通过页面之间的跳转来传 ...

  3. 在Ubuntu环境 下载Android studio,并配置genymotion模拟器(超详细)

    Android studio 1. Ubuntu下安装Android studio完整版 1.1. 安装Android studio 1.1.1. 下载环境 1.1.2. 配置共享文件夹 1.1.3. ...

  4. 使用Android Studio创建第一个程序Hello word超详细

    首先,打开Android Studio软件,双击打开. 打开后的页面如下所示,点击第一个新建一个项目. 点开之后如图所示,点击Phone and Tablet,这个就是手机和平板适用,在选择下列空白项 ...

  5. android百度地图定位自定义图标,百度地图SDK集成及根据坐标实现定位(android studio开发)...

    百度地图SDK集成及根据坐标实现定位(android studio开发) 百度地图SDK集成及根据坐标实现定位(android studio开发) 1.下载百度地图SDK 链接:http://lbsy ...

  6. 超详细的Android百度地图开发:在APP上定位并显示出来

    超详细的Android百度地图开发:在APP上定位并显示出来 一 写在前面 二 注册百度开发者账户.申请API KEY 三.代码实现 四.问题 五.总结 一 写在前面 由于项目所需,我需要在手机APP ...

  7. android 最新sdk版本,详解如何在Android studio中更新sdk版本和build-tools版本

    一.首先看下Android开发用到的sdk目录: build-tools 保存着一些Android平台相关通用工具,比如adb.和aapt.aidl.dx等文件. aapt即Android Asset ...

  8. 重装android studio 始终提示SDK installed

    重装android studio 始终提示SDK installed 重装完android studio 之后,要新建项目提示,sdk丢失需要重新安装 然后点击打开SDK管理器,设置SDK安装目录,我 ...

  9. 使用 Android Studio 跑新浪微博SDK Demo遇到的问题及解决

    概述 这是新浪微博官方 Android SDK Demo 使用 Android Studio 导入.编译并运行通过的版本. 源码:WeiboSdkDemo 官方项目请点击: weibo_android ...

最新文章

  1. 进程间通信学习小结(共享内存)
  2. python qq邮箱 群发
  3. BZOJ 1666 USACO 2006 Oct. 奶牛的数字游戏
  4. 第3章 StringBuilder类
  5. 关于python2和python3除法的区别
  6. Android Service和Binder、AIDL
  7. Oracle入门(十三B)之高级查询(上)
  8. 2018.9.15,Matlab实验三:字符串、单元数组和结构体
  9. JEECG智能开发平台-项目选型最爱
  10. Oracle一条SQL语句插入多条记录
  11. Angular 的概念模型
  12. 汽车销售管理系统 c语言版 课程设计,《汽车销售管理系统 C语言版》.doc
  13. 微信小程序实验一 ——— 简单计算器与秒表
  14. 微信公众号-- 微信分享功能(分享到朋友和朋友圈显示图片和简介)
  15. 导航信号测试用什么软件,专业GPS测试软件 VisualGPSXP入门
  16. java架构模式与设计模式(三)--事件风暴
  17. 语音生成视频论文:Audio-driven Talking Face Video Generation with Learning-based Personalized Head Pose
  18. thinkjs的这个bug害人不浅
  19. AutoAugment 学习
  20. linux系统从开机到登陆界面的启动过程

热门文章

  1. 新闻推荐数据集MIND介绍
  2. 怎么防止解决百度转码问题
  3. js删除json中指定的元素
  4. 向量检索的索引构建算法综述
  5. js模块化(ESModule与CommonJS)
  6. 自动计数报警器c语言程序,计数报警器电路设计方案汇总(多款模拟电路设计原理图详解)...
  7. CardView属性app:cardUseCompatPadding和app:cardPreventCornerOverlap
  8. 刷题学习—算法思想(双指针、排序、回溯、二分法、滑动窗口、贪心、单调栈)
  9. 字符串处理:输入字符串s1和s2以及插入位置f,在字符串s1中的指定位置f处插入字符串s2。如输入BEIJING, 123, 3,则输出:BEI123JING。
  10. Java Web项目开发流程