前段时间公司项目比较忙,百度地图这块拖了好久了,这篇续前面几篇有关百度地图的。好了废话不多说,今天要聊的是有关路径规划的,如何使用百度地图搜索驾车、步行和公交路线并标注在地图上。这篇是基于Android百度地图——搜索服务之周边检索,有什么不清楚的请查看前面的几篇博文。路径规划:从那里到那里的线路规划,比如:从上海市盛夏路益江路到陆家嘴的驾车、步行和公交路线。
一、从那里到那里:
1、起始地点:
// 上海市盛夏路益江路的GPS纬度经度值:121.637942,31.205889 MKPlanNode start = new MKPlanNode(); start.pt = new GeoPoint((int) (31.205889 * 1E6), (int) (121.637942 * 1E6));
2、目的地点:
// 上海市陆家嘴的GPS纬度经度值: 121.509075,31.243319 MKPlanNode end = new MKPlanNode(); end.pt = new GeoPoint( (int) (31.243319 * 1E6), (int) (121.509075 * 1E6));
注:获取地点的GPS值可以到http://api.map.baidu.com/lbsapi/getpoint/index.html查询,要注意拿到的值的顺序,获取到的值是经纬度(也就是说第一个表示的是经度值,第二个表示的是纬度值)。而我们在地图上查找或标注时使用的顺序是GPS纬度经度值,因此记得调整顺序,不然在百度地图上就显示不出来。
二、如何到达,怎样到达:
1、驾车线路:
驾乘检索策略常量:时间优先
mMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST); mMKSearch.drivingSearch(null, start, null, end);
驾乘检索策略常量:较少费用
mMKSearch.setDrivingPolicy(MKSearch.ECAR_FEE_FIRST); mMKSearch.drivingSearch(null, start, null, end);
驾乘检索策略常量:最短距离
mMKSearch.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST); mMKSearch.drivingSearch(null, start, null, end);
获取结果并展示时,需要实现MKSearchListener接口中的onGetDrivingRouteResult方法 :
@Override public void onGetDrivingRouteResult(MKDrivingRouteResult result, int arg1) { if (result == null) return; RouteOverlay routeOverlay = new RouteOverlay(BaiduMapRouteOverlayActivity.this, mMapView); routeOverlay.setData(result.getPlan(0).getRoute(0)); mMapView.getOverlays().add(routeOverlay); mMapView.refresh();//刷新地图 }
2、步行线路:
// 步行线路搜索 mMKSearch.walkingSearch(null, start, null, end);
获取结果并展示时,需要实现MKSearchListener接口中的onGetWalkingRouteResult方法
@Override public void onGetWalkingRouteResult(MKWalkingRouteResult result, int arg1) { // TODO Auto-generated method stub RouteOverlay routeOverlay = new RouteOverlay(BaiduMapRouteOverlayActivity.this, mMapView); routeOverlay.setData(result.getPlan(0).getRoute(0)); mMapView.getOverlays().add(routeOverlay); mMapView.refresh();//刷新地图 }
3、公交线路:
公交线路搜索的方法为transitSearch(String city, MKPlanNode start, MKPlanNode end),city:为待查公交线路所在城市,start和end分别是起点和终点;获取结果的方法改为重写onGetTransitRouteResult方法。
// 公交线路搜索 mMKSearch.transitSearch("上海市", start, end);
获取结果:
@Override public void onGetTransitRouteResult(MKTransitRouteResult result, int arg1) { RouteOverlay routeOverlay = new RouteOverlay(BaiduMapRouteOverlayActivity.this, mMapView); routeOverlay.setData(result.getPlan(0).getRoute(0)); mMapView.getOverlays().add(routeOverlay); mMapView.refresh();//刷新地图 }
四、完整代码:
package com.android.baidu.map; import android.app.Activity; import android.content.Context; import android.content.res.Configuration; import android.os.Bundle; import android.widget.Toast; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.MKGeneralListener; import com.baidu.mapapi.map.MKEvent; import com.baidu.mapapi.map.MapController; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.RouteOverlay; import com.baidu.mapapi.search.MKAddrInfo; import com.baidu.mapapi.search.MKBusLineResult; import com.baidu.mapapi.search.MKDrivingRouteResult; import com.baidu.mapapi.search.MKPlanNode; import com.baidu.mapapi.search.MKPoiResult; import com.baidu.mapapi.search.MKSearch; import com.baidu.mapapi.search.MKSearchListener; import com.baidu.mapapi.search.MKSuggestionResult; import com.baidu.mapapi.search.MKTransitRouteResult; import com.baidu.mapapi.search.MKWalkingRouteResult; import com.baidu.platform.comapi.basestruct.GeoPoint; public class BaiduMapRouteOverlayActivity extends Activity { public static final String BAIDU_MAP_KEY = "07418AEC69BAAB7104C6230A6120C580DFFAEEBB"; private BMapManager mMapManager = null; private MapView mMapView = null; private MKSearch mMKSearch = null; private Context mContext; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = BaiduMapRouteOverlayActivity.this.getApplicationContext(); mMapManager = new BMapManager(getApplicationContext()); mMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() { @Override public void onGetNetworkState(int errorCode) { if (errorCode == MKEvent.ERROR_NETWORK_CONNECT) { Toast.makeText(mContext, "您的网络出错啦!", Toast.LENGTH_LONG) .show(); } } @Override public void onGetPermissionState(int errorCode) { if (errorCode == MKEvent.ERROR_PERMISSION_DENIED) { // 授权Key错误: Toast.makeText(mContext, "请在 DemoApplication.java文件输入正确的授权Key!", Toast.LENGTH_LONG).show(); } } }); setContentView(R.layout.main); mMapView = (MapView) this.findViewById(R.id.bmapsView); mMapView.setBuiltInZoomControls(true); MapController mMapController = mMapView.getController(); // 上海市的GPS纬度经度值:31.243319,121.509075 GeoPoint geoPoint = new GeoPoint((int) (31.243319 * 1E6), (int) (121.509075 * 1E6)); mMapController.setCenter(geoPoint); mMapController.setZoom(12); // 检索从上海市盛夏路益江路到陆家嘴的驾车路线 // 上海市盛夏路益江路的GPS纬度经度值:121.637942,31.205889 MKPlanNode start = new MKPlanNode(); start.pt = new GeoPoint((int) (31.205889 * 1E6), (int) (121.637942 * 1E6)); // 上海市陆家嘴的GPS纬度经度值: 121.509075,31.243319 MKPlanNode end = new MKPlanNode(); end.pt = new GeoPoint((int) (31.243319 * 1E6), (int) (121.509075 * 1E6)); mMKSearch = new MKSearch(); mMKSearch.init(mMapManager, new MKSearchListener() { @Override public void onGetAddrResult(MKAddrInfo arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetDrivingRouteResult(MKDrivingRouteResult result, int arg1) { if (result == null) return; RouteOverlay routeOverlay = new RouteOverlay( BaiduMapRouteOverlayActivity.this, mMapView); routeOverlay.setData(result.getPlan(0).getRoute(0)); mMapView.getOverlays().add(routeOverlay); mMapView.refresh();// 刷新地图 } @Override public void onGetPoiDetailSearchResult(int arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetTransitRouteResult(MKTransitRouteResult result, int arg1) { RouteOverlay routeOverlay = new RouteOverlay( BaiduMapRouteOverlayActivity.this, mMapView); routeOverlay.setData(result.getPlan(0).getRoute(0)); mMapView.getOverlays().add(routeOverlay); mMapView.refresh();// 刷新地图 } @Override public void onGetWalkingRouteResult(MKWalkingRouteResult result, int arg1) { // TODO Auto-generated method stub RouteOverlay routeOverlay = new RouteOverlay( BaiduMapRouteOverlayActivity.this, mMapView); routeOverlay.setData(result.getPlan(0).getRoute(0)); mMapView.getOverlays().add(routeOverlay); mMapView.refresh();// 刷新地图 } }); // 设置驾车路线搜索策略,时间优先、费用最少或距离最短 /* * // 驾乘检索策略常量:时间优先 * mMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST); * mMKSearch.drivingSearch(null, start, null, end); * * // 驾乘检索策略常量:较少费用 mMKSearch.setDrivingPolicy(MKSearch.ECAR_FEE_FIRST); * mMKSearch.drivingSearch(null, start, null, end); * * // 驾乘检索策略常量:最短距离 mMKSearch.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST); * mMKSearch.drivingSearch(null, start, null, end); */ // 步行线路搜索 mMKSearch.walkingSearch(null, start, null, end); // 公交线路搜索 // mMKSearch.transitSearch("上海市", start, end); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mMapView.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); mMapView.onRestoreInstanceState(savedInstanceState); } @Override protected void onResume() { mMapView.onResume(); if (mMapManager != null) { mMapManager.start(); } super.onResume(); } @Override protected void onPause() { mMapView.onPause(); if (mMapManager != null) { mMapManager.stop(); } super.onPause(); } @Override protected void onDestroy() { mMapView.destroy(); if (mMapManager != null) { mMapManager.destroy(); mMapManager = null; } super.onDestroy(); } }