Android版本百度地图开发(三)——路线规划

通过上一章我们了解了如何利用百度地图的搜索功能,这一章我们看看如何使用路线规划功能。


在讲解这部分之前首先我们讲一个获取经纬度坐标的小技巧:

  1. 我们用Chrome浏览器去:http://ditu.google.cn/
  2. 输入需要搜索的地点,并点击你选择的位置,确保其在地图正中;
  3. 打开Chrome浏览器的javascript控制台,输入:javascript:void(prompt('',gApplication.getMap().getCenter())),即可得到经纬度坐标;
  4. 这个经纬度坐标用到百度地图中需要* 1E6;


4 路径规划

4.1 路径规划介绍

我们在实际使用百度地图时都会经常使用到路径规划,比如从某地到某地,我们输入起始点和目的地,选择交通工具,直接点击“搜索”即可。由此,我们可以看出路径规划是一种特殊类型的搜索服务。

我们也知道如果起始点和目标地如果不是很明确(比如输入的是“由由国际广场”到“太平洋百货”),地图会提醒你需要选择精确的起点或终点。


4.2 路径分析

4.2.3 驾车线路搜索

首先我们看看搜索代码:

				MKPlanNode start = new MKPlanNode();
				// 上海浦东新区浦东南路由由大酒店(31.21316849046321, 121.51698589324951)
				start.pt = new GeoPoint((int) (31.213168 * 1E6),
						(int) (121.516985 * 1E6));
				MKPlanNode end = new MKPlanNode();
				// 上海黄浦区淮海中路太平洋百货(31.22316956746088, 121.47417783737183)
				end.pt = new GeoPoint((int) (31.223169 * 1E6),
						(int) (121.474177 * 1E6));
				// 设置驾车路线搜索策略,时间优先、费用最少或距离最短
				mMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST);
				// 由于我们采用经纬度坐标进行搜索,起点和终点参数无需输入
				if (mMKSearch.drivingSearch(null, start, null, end) != 0) {
					Toast.makeText(BaiduMapActivity.this, "搜索失败", 3).show();
				} else {
					// 搜索成功,设置中心点为起点坐标
					GeoPoint point = new GeoPoint((int) (31.213168 * 1E6),
							(int) (121.516985 * 1E6));
					mMapController.setCenter(point);// 设置地图中心点
				}

处理结果代码为(同样在SearchListener中):

	@Override
	public void onGetDrivingRouteResult(MKDrivingRouteResult result, int arg1) {
		if (result == null) {
			Toast.makeText(activity, "抱歉,未找到结果", Toast.LENGTH_LONG).show();
			return;
		}
		// 叠加路线到地图显示,此处仅展示一个方案作为示例
		RouteOverlay routeOverlay = new RouteOverlay(activity, mapView); 
		routeOverlay.setData(result.getPlan(0).getRoute(0));
		mapView.getOverlays().add(routeOverlay);
		mapView.refresh();
	}

4.2.4 带途经点的搜索

带途经点的搜索是:

drivingSearch(java.lang.String startCity, MKPlanNode start, java.lang.String endCity, MKPlanNode end, java.util.List<MKWpNode> wpNodes)

处理结果和之前相同。


4.3 步行路线搜索

步行路线搜索和驾车搜索相同,无非是调用方法修改为:walkingSearch。



4.4 公交路线搜索

搜索代码如下:

				MKPlanNode start = new MKPlanNode();
				// 上海浦东新区浦东南路由由大酒店(31.21316849046321, 121.51698589324951)
				start.pt = new GeoPoint((int) (31.213168 * 1E6),
						(int) (121.516985 * 1E6));
				MKPlanNode end = new MKPlanNode();
				// 上海黄浦区淮海中路太平洋百货(31.22316956746088, 121.47417783737183)
				end.pt = new GeoPoint((int) (31.223169 * 1E6),
						(int) (121.474177 * 1E6));
				mMKSearch.setTransitPolicy(MKSearch.EBUS_TIME_FIRST);
				// 由于我们采用经纬度坐标进行搜索,起点和终点参数无需输入
				if (mMKSearch.transitSearch("shanghai", start, end) != 0) {
					Toast.makeText(BaiduMapActivity.this, "搜索失败", 3).show();
				} else {
					// 搜索成功,设置中心点为起点坐标
					GeoPoint point = new GeoPoint((int) (31.213168 * 1E6),
							(int) (121.516985 * 1E6));
					mMapController.setCenter(point);// 设置地图中心点
				}

处理搜索结果:

	@Override
	public void onGetTransitRouteResult(MKTransitRouteResult result, int arg1) {
		if (result == null) {
			Toast.makeText(activity, "抱歉,未找到结果", Toast.LENGTH_LONG).show();
			return;
		}
		// 叠加路线到地图显示,此处仅展示一个方案作为示例
		RouteOverlay routeOverlay = new RouteOverlay(activity, mapView); 
		routeOverlay.setData(result.getPlan(0).getRoute(0));
		mapView.getOverlays().add(routeOverlay);
		mapView.refresh();
	}

4.4.1 利用兴趣点搜索查询公交信息

我们还可以利用兴趣点搜索查询公交相应信息,对应查询代码:

mMKSearch.poiSearchInCity("上海", "610"); 

查询到兴趣点的处理:

	@Override
	public void onGetPoiResult(MKPoiResult res, int type, int error) {
		// 错误号可参考MKEvent中的定义
		if (error != 0 || res == null) {
			Toast.makeText(activity, "抱歉,未找到结果", Toast.LENGTH_LONG).show();
			return;
		}
		// 找到公交路线poi node
		MKPoiInfo curPoi = null;
		int totalPoiNum = res.getNumPois();
		for (int idx = 0; idx < totalPoiNum; idx++) {
			curPoi = res.getPoi(idx);
			// poi类型,0:普通点,1:公交站,2:公交线路,3:地铁站,4:地铁线路
			if (2 == curPoi.ePoiType) {
				break;
			}
		}
		// 根据得到的uid查询详细公交信息
		// busLineSearch(java.lang.String city, java.lang.String busLineUid)
		search.busLineSearch("上海", curPoi.uid);
	}

真正查询公交信息的处理:

	@Override
	public void onGetBusDetailResult(MKBusLineResult result, int iError) {
		if (iError != 0 || result == null) {
			Toast.makeText(activity, "抱歉,未找到结果", Toast.LENGTH_LONG).show();
			return;
		}
		// 叠加公交路线显示到地图
		RouteOverlay routeOverlay = new RouteOverlay(activity, mapView); // 此处仅展示一个方案作为示例
		routeOverlay.setData(result.getBusRoute());
		mapView.getOverlays().clear();
		mapView.getOverlays().add(routeOverlay);
		mapView.refresh();
		// 定位到公交起点位置
		mapView.getController().animateTo(result.getBusRoute().getStart());
	}



至此,路线规划功能全部完成。


另外,SDK从2.1.1版本开始支持调用百度导航功能(需要百度导航5.0以上版本),代码如下:

				double mLat1 = 31.21316849046321;
				double mLon1 = 121.51698589324951;
				double mLat2 = 31.22316956746088;
				double mLon2 = 121.47417783737183;
				int lat = (int) (mLat1 * 1E6);
				int lon = (int) (mLon1 * 1E6);
				GeoPoint pt1 = new GeoPoint(lat, lon);
				lat = (int) (mLat2 * 1E6);
				lon = (int) (mLon2 * 1E6);
				GeoPoint pt2 = new GeoPoint(lat, lon);
				/*
				 * 
				 * 导航参数
				 * 
				 * 导航起点和终点不能为空,当GPS可用时启动从用户位置到终点间的导航,
				 * 
				 * 当GPS不可用时,启动从起点到终点间的模拟导航。
				 */
				NaviPara para = new NaviPara();
				para.startPoint = pt1; // 起点坐标
				para.startName = "从这里开始";
				para.endPoint = pt2; // 终点坐标
				para.endName = "到这里结束";
				try {
					// 调起百度地图客户端导航功能,参数this为Activity。
					BaiduMapNavigation.openBaiduMapNavi(para,
							BaiduMapActivity.this);
				} catch (BaiduMapAppNotSupportNaviException e) {
					// 在此处理异常
					e.printStackTrace();
				}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值