Android之百度地图(三)

本文介绍如何使用百度地图API进行路线规划,包括步行、驾车等,并展示如何在地图上显示起点、终点及路线。通过实现OnGetRoutePlanResultListener接口,解析并显示各种路线结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于项目打开运行时错误的解决方案
在这里插入图片描述

在第一个build.gradle 中打开 然后分别加上 google()
在这里插入图片描述
重新try again就可以了

下面介绍一下百度地图开发中ak值的获取方法(然后百度搜索百度地图开发平台就可以了)

SHA1值就是这么获取的 点击signingReport 等待几秒就可以了
SHA1: 4F:68:35:47:76:43:8B:EB:C8:52:4D:B5:6C:98:FD:52:67:34:55:6C
在这里插入图片描述

升级版本的百度地图 新增了地图规划功能(主要是百度提供,我只是负责稍微修改)

public class MapNavigateDemoActivity extends Activity implements  OnGetRoutePlanResultListener
{
	private MapView mMapView=null;	   		//MapView显示地图的视图
	private BaiduMap mBaiduMap = null;		//地图控制器
	private LatLng gpStart;					//起始点经纬度
	private LatLng gpEnd;					//结束点经纬度
	private BitmapDescriptor bitMapN = null;//起点图标
	private BitmapDescriptor bitMapS = null;//重点图标
	//状态标志为 0表示开始状态 1表示已经设置起始点的状态
	private int nState=0;
	//Overlay管理器
	OverlayManager routeOverlay = null;
	//搜索模块,也可去掉地图模块独立使用
	RoutePlanSearch mSearch = null;
	//检索完成标志位
	boolean useDefaultIcon = false;
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		//在使用SDK各组件之前初始化context信息,传入ApplicationContext
		//注意该方法要再setContentView方法之前实现
		SDKInitializer.initialize(getApplicationContext());
		setContentView(R.layout.main);

		mMapView = (MapView) this.findViewById(R.id.bmapView);	//获得MapView引用
		mBaiduMap=mMapView.getMap();							//获得地图控制器

		bitMapN = BitmapDescriptorFactory.fromResource(R.drawable.point_n);//加载图片
		bitMapS = BitmapDescriptorFactory.fromResource(R.drawable.point_s);
		//设置地图缩放比
		float mZoomLevel = 12.0f;
		mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(mZoomLevel));
		//设置地图中心点为华北理工大学曹妃甸校区
		mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(new LatLng(39.207928,118.598560)));

		mSearch = RoutePlanSearch.newInstance();		//获取路径规划搜索接口
		mSearch.setOnGetRoutePlanResultListener(this);	//添加监听
		mBaiduMap.setOnMapClickListener(
				new OnMapClickListener()
				{
					@Override
					public boolean onMapPoiClick(MapPoi arg0)
					{
						return false;
					}
					@Override
					public void onMapClick(LatLng mLatlng)
					{
						if(nState==0)
						{	 //若地图在没有终点与起点的情况下或
							//在同时又起点与终点的情况下被点击
							mBaiduMap.clear();
							gpStart=mLatlng;				//获取点击的坐标
							OverlayOptions mOverlay = new MarkerOptions()
									.position(gpStart)	//设置起点气球坐标
									.icon(bitMapN)		//设置起点气球图标
									.perspective(true);//设置开启 marker 覆盖物近大远小效果,默认开启
							mBaiduMap.addOverlay(mOverlay);	//添加到地图上
							nState=1;//状态标志位设为1
						}else if(nState==1)
						{
							gpEnd=mLatlng;
							OverlayOptions mOverlay = new MarkerOptions()	//添加的终点气球
									.position(gpEnd)	//设置终点气球坐标
									.icon(bitMapS)		//设置终点气球图标
									.perspective(true);		//设置开启 marker 覆盖物近大远小效果,默认开启
							mBaiduMap.addOverlay(mOverlay);	//添加到地图上
							nState=0;//状态标志位设为0
							SearchButtonProcess();//发起步行路线规划方法
						}
					}
				}
		);

	}
	public void SearchButtonProcess()
	{
		//建立起点和终点节点
		PlanNode stNode = PlanNode.withLocation(gpStart);//起点节点
		PlanNode enNode = PlanNode.withLocation(gpEnd);//终点节点
		//发起步行路线规划
		mSearch.walkingSearch((new WalkingRoutePlanOption()).from(stNode).to(enNode));
		//mSearch.drivingSearch((new DrivingRoutePlanOption()).from(stNode).to(enNode));
		System.out.println("search");
	}

	@Override
	public void onGetDrivingRouteResult(DrivingRouteResult arg0)
	{
	}

	@Override
	public void onGetIndoorRouteResult(IndoorRouteResult indoorRouteResult) {

	}

	@Override
	public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {

	}

	@Override
	public void onGetTransitRouteResult(TransitRouteResult arg0)
	{
	}

	@Override
	public void onGetMassTransitRouteResult(MassTransitRouteResult massTransitRouteResult) {

	}

	@Override
	public void onGetWalkingRouteResult(WalkingRouteResult result) {//获取步行线路规划结果
		if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR)//没检索到结果
		{
			Toast.makeText(MapNavigateDemoActivity.this, "抱歉,未找到结果!", Toast.LENGTH_SHORT).show();
			return;
		}
		if (result.error == SearchResult.ERRORNO.NO_ERROR)
		{
			//用于显示步行路线的overlay
			WalkingRouteOverlay overlay = new WalkingRouteOverlay(mBaiduMap);
			//添加监听
			mBaiduMap.setOnMarkerClickListener(overlay);
			routeOverlay = overlay;
			//添加步行规划数据
			overlay.setData(result.getRouteLines().get(0));
			//将所有Overlay 添加到地图上
			overlay.addToMap();
			//缩放地图,使所有Overlay都在合适的视野内
			overlay.zoomToSpan();
			//状态标志位设为0
			nState=0;
		}
	}
	@Override
	protected void onDestroy()
	{
		super.onDestroy();
		//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
		mMapView.onDestroy();
	}
	@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这个接口
这个接口是干嘛的呢? 这个接口能够实现三种方法
分别返回三种路线的结果。

在这里插入图片描述

接下来多了这两样东西
在这里插入图片描述
一丶OverlayManager这个类 解释如下
在这里插入图片描述

来看下使用主要是运用在了显示步行路线的overlay上(可以理解为WalkingRouteOverlay是OverlayManager的一个子类)
在这里插入图片描述
先创建一个overlay的对象 (要把BaiduMap传进去) 然后在把该overlay赋给OverlayManager 并且如果要使用zoomToSpan方法的话 必须要添加监听
该方法只对marker类型的overlay有效
在这里插入图片描述

二丶RoutePlanSearch的解释
在这里插入图片描述
来看下代码中使用的情况
在这里插入图片描述
在这里插入图片描述
顺便说明一下 在路线规划的时候
要将LatLng 类型的坐标变成 PlanNode的节点型
然后调用 from to 这个方法 并且强制转换成 option类型!
才可以调用RoutePlanSearch中的walkingSearch方法
当然其他类似drivingSearch方法也是这么操作的!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑瞳丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值