通过上一章我们了解了如何利用百度地图的搜索功能,这一章我们看看如何使用路线规划功能。
在讲解这部分之前首先我们讲一个获取经纬度坐标的小技巧:
我们在实际使用百度地图时都会经常使用到路径规划,比如从某地到某地,我们输入起始点和目的地,选择交通工具,直接点击“搜索”即可。由此,我们可以看出路径规划是一种特殊类型的搜索服务。
我们也知道如果起始点和目标地如果不是很明确(比如输入的是“由由国际广场”到“太平洋百货”),地图会提醒你需要选择精确的起点或终点。
首先我们看看搜索代码:
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);// 设置地图中心点 }
@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(); }
带途经点的搜索是:
drivingSearch(java.lang.String startCity, MKPlanNode start, java.lang.String endCity, MKPlanNode end, java.util.List<MKWpNode> wpNodes)
步行路线搜索和驾车搜索相同,无非是调用方法修改为:walkingSearch。
搜索代码如下:
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(); }
我们还可以利用兴趣点搜索查询公交相应信息,对应查询代码:
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(); }