通过上一章我们了解了如何利用百度地图的搜索功能,这一章我们看看如何使用路线规划功能。
在讲解这部分之前首先我们讲一个获取经纬度坐标的小技巧:
- 我们用Chrome浏览器去:http://ditu.google.cn/;
- 输入需要搜索的地点,并点击你选择的位置,确保其在地图正中;
- 打开Chrome浏览器的javascript控制台,输入:javascript:void(prompt('',gApplication.getMap().getCenter())),即可得到经纬度坐标;
- 这个经纬度坐标用到百度地图中需要* 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();
}