Android百度地图——路径规划(驾车、步行和公交线路搜索)
16lz
2021-01-23
Android百度地图——路径规划(驾车、步行和公交线路搜索)
分类: Android百度地图 2013-03-15 12:25419人阅读评论(2)收藏举报ANDROID百度地图路径规划驾车步行和公交线路搜索前段时间公司项目比较忙,百度地图这块拖了好久了,这篇续前面几篇有关百度地图的。好了废话不多说,今天要聊的是有关路径规划的,如何使用百度地图搜索驾车、步行和公交路线并标注在地图上。这篇是基于Android百度地图——搜索服务之周边检索,有什么不清楚的请查看前面的几篇博文。路径规划:从那里到那里的线路规划,比如:从上海市盛夏路益江路到陆家嘴的驾车、步行和公交路线。
一、从那里到那里:
1、起始地点:
[java]view plaincopyprint?- //上海市盛夏路益江路的GPS纬度经度值:121.637942,31.205889
- MKPlanNodestart=newMKPlanNode();
- start.pt=newGeoPoint((int)(31.205889*1E6),(int)(121.637942*1E6));
// 上海市盛夏路益江路的GPS纬度经度值:121.637942,31.205889 MKPlanNode start = new MKPlanNode(); start.pt = new GeoPoint((int) (31.205889 * 1E6), (int) (121.637942 * 1E6));
2、目的地点:
[java]view plaincopyprint?- //上海市陆家嘴的GPS纬度经度值:121.509075,31.243319
- MKPlanNodeend=newMKPlanNode();
- end.pt=newGeoPoint((int)(31.243319*1E6),(int)(121.509075*1E6));
// 上海市陆家嘴的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、驾车线路:
驾乘检索策略常量:时间优先
[java]view plaincopyprint?- mMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST);
- mMKSearch.drivingSearch(null,start,null,end);
mMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST); mMKSearch.drivingSearch(null, start, null, end);
驾乘检索策略常量:较少费用
[java]view plaincopyprint?- mMKSearch.setDrivingPolicy(MKSearch.ECAR_FEE_FIRST);
- mMKSearch.drivingSearch(null,start,null,end);
mMKSearch.setDrivingPolicy(MKSearch.ECAR_FEE_FIRST); mMKSearch.drivingSearch(null, start, null, end);
驾乘检索策略常量:最短距离
[java]view plaincopyprint?- mMKSearch.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST);
- mMKSearch.drivingSearch(null,start,null,end);
mMKSearch.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST); mMKSearch.drivingSearch(null, start, null, end);
获取结果并展示时,需要实现MKSearchListener接口中的onGetDrivingRouteResult方法 :
[java]view plaincopyprint?- @Override
- publicvoidonGetDrivingRouteResult(MKDrivingRouteResultresult,intarg1){
- if(result==null)
- return;
- RouteOverlayrouteOverlay=newRouteOverlay(BaiduMapRouteOverlayActivity.this,mMapView);
- routeOverlay.setData(result.getPlan(0).getRoute(0));
- mMapView.getOverlays().add(routeOverlay);
- mMapView.refresh();//刷新地图
- }
@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、步行线路:
[java]view plaincopyprint?- //步行线路搜索
- mMKSearch.walkingSearch(null,start,null,end);
// 步行线路搜索 mMKSearch.walkingSearch(null, start, null, end);
获取结果并展示时,需要实现MKSearchListener接口中的onGetWalkingRouteResult方法
- @Override
- publicvoidonGetWalkingRouteResult(MKWalkingRouteResultresult,intarg1){
- //TODOAuto-generatedmethodstub
- RouteOverlayrouteOverlay=newRouteOverlay(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();//刷新地图 }
3、公交线路:
公交线路搜索的方法为transitSearch(String city, MKPlanNode start, MKPlanNode end),city:为待查公交线路所在城市,start和end分别是起点和终点;获取结果的方法改为重写onGetTransitRouteResult方法。
[java]view plaincopyprint?- //公交线路搜索
- mMKSearch.transitSearch("上海市",start,end);
// 公交线路搜索 mMKSearch.transitSearch("上海市", start, end);
获取结果:
[java]view plaincopyprint?- @Override
- publicvoidonGetTransitRouteResult(MKTransitRouteResultresult,intarg1){
- RouteOverlayrouteOverlay=newRouteOverlay(BaiduMapRouteOverlayActivity.this,mMapView);
- routeOverlay.setData(result.getPlan(0).getRoute(0));
- mMapView.getOverlays().add(routeOverlay);
- mMapView.refresh();//刷新地图
- }
@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();//刷新地图 }
四、完整代码:
[java]view plaincopyprint?- packagecom.android.baidu.map;
- importandroid.app.Activity;
- importandroid.content.Context;
- importandroid.content.res.Configuration;
- importandroid.os.Bundle;
- importandroid.widget.Toast;
- importcom.baidu.mapapi.BMapManager;
- importcom.baidu.mapapi.MKGeneralListener;
- importcom.baidu.mapapi.map.MKEvent;
- importcom.baidu.mapapi.map.MapController;
- importcom.baidu.mapapi.map.MapView;
- importcom.baidu.mapapi.map.RouteOverlay;
- importcom.baidu.mapapi.search.MKAddrInfo;
- importcom.baidu.mapapi.search.MKBusLineResult;
- importcom.baidu.mapapi.search.MKDrivingRouteResult;
- importcom.baidu.mapapi.search.MKPlanNode;
- importcom.baidu.mapapi.search.MKPoiResult;
- importcom.baidu.mapapi.search.MKSearch;
- importcom.baidu.mapapi.search.MKSearchListener;
- importcom.baidu.mapapi.search.MKSuggestionResult;
- importcom.baidu.mapapi.search.MKTransitRouteResult;
- importcom.baidu.mapapi.search.MKWalkingRouteResult;
- importcom.baidu.platform.comapi.basestruct.GeoPoint;
- publicclassBaiduMapRouteOverlayActivityextendsActivity{
- publicstaticfinalStringBAIDU_MAP_KEY="07418AEC69BAAB7104C6230A6120C580DFFAEEBB";
- privateBMapManagermMapManager=null;
- privateMapViewmMapView=null;
- privateMKSearchmMKSearch=null;
- privateContextmContext;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- mContext=BaiduMapRouteOverlayActivity.this.getApplicationContext();
- mMapManager=newBMapManager(getApplicationContext());
- mMapManager.init(BAIDU_MAP_KEY,newMKGeneralListener(){
- @Override
- publicvoidonGetNetworkState(interrorCode){
- if(errorCode==MKEvent.ERROR_NETWORK_CONNECT){
- Toast.makeText(mContext,"您的网络出错啦!",Toast.LENGTH_LONG)
- .show();
- }
- }
- @Override
- publicvoidonGetPermissionState(interrorCode){
- 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);
- MapControllermMapController=mMapView.getController();
- //上海市的GPS纬度经度值:31.243319,121.509075
- GeoPointgeoPoint=newGeoPoint((int)(31.243319*1E6),
- (int)(121.509075*1E6));
- mMapController.setCenter(geoPoint);
- mMapController.setZoom(12);
- //检索从上海市盛夏路益江路到陆家嘴的驾车路线
- //上海市盛夏路益江路的GPS纬度经度值:121.637942,31.205889
- MKPlanNodestart=newMKPlanNode();
- start.pt=newGeoPoint((int)(31.205889*1E6),
- (int)(121.637942*1E6));
- //上海市陆家嘴的GPS纬度经度值:121.509075,31.243319
- MKPlanNodeend=newMKPlanNode();
- end.pt=newGeoPoint((int)(31.243319*1E6),(int)(121.509075*1E6));
- mMKSearch=newMKSearch();
- mMKSearch.init(mMapManager,newMKSearchListener(){
- @Override
- publicvoidonGetAddrResult(MKAddrInfoarg0,intarg1){
- //TODOAuto-generatedmethodstub
- }
- @Override
- publicvoidonGetBusDetailResult(MKBusLineResultarg0,intarg1){
- //TODOAuto-generatedmethodstub
- }
- @Override
- publicvoidonGetDrivingRouteResult(MKDrivingRouteResultresult,
- intarg1){
- if(result==null)
- return;
- RouteOverlayrouteOverlay=newRouteOverlay(
- BaiduMapRouteOverlayActivity.this,mMapView);
- routeOverlay.setData(result.getPlan(0).getRoute(0));
- mMapView.getOverlays().add(routeOverlay);
- mMapView.refresh();//刷新地图
- }
- @Override
- publicvoidonGetPoiDetailSearchResult(intarg0,intarg1){
- //TODOAuto-generatedmethodstub
- }
- @Override
- publicvoidonGetPoiResult(MKPoiResultarg0,intarg1,intarg2){
- //TODOAuto-generatedmethodstub
- }
- @Override
- publicvoidonGetSuggestionResult(MKSuggestionResultarg0,intarg1){
- //TODOAuto-generatedmethodstub
- }
- @Override
- publicvoidonGetTransitRouteResult(MKTransitRouteResultresult,
- intarg1){
- RouteOverlayrouteOverlay=newRouteOverlay(
- BaiduMapRouteOverlayActivity.this,mMapView);
- routeOverlay.setData(result.getPlan(0).getRoute(0));
- mMapView.getOverlays().add(routeOverlay);
- mMapView.refresh();//刷新地图
- }
- @Override
- publicvoidonGetWalkingRouteResult(MKWalkingRouteResultresult,
- intarg1){
- //TODOAuto-generatedmethodstub
- RouteOverlayrouteOverlay=newRouteOverlay(
- 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
- publicvoidonConfigurationChanged(ConfigurationnewConfig){
- super.onConfigurationChanged(newConfig);
- }
- @Override
- protectedvoidonSaveInstanceState(BundleoutState){
- super.onSaveInstanceState(outState);
- mMapView.onSaveInstanceState(outState);
- }
- @Override
- protectedvoidonRestoreInstanceState(BundlesavedInstanceState){
- super.onRestoreInstanceState(savedInstanceState);
- mMapView.onRestoreInstanceState(savedInstanceState);
- }
- @Override
- protectedvoidonResume(){
- mMapView.onResume();
- if(mMapManager!=null){
- mMapManager.start();
- }
- super.onResume();
- }
- @Override
- protectedvoidonPause(){
- mMapView.onPause();
- if(mMapManager!=null){
- mMapManager.stop();
- }
- super.onPause();
- }
- @Override
- protectedvoidonDestroy(){
- mMapView.destroy();
- if(mMapManager!=null){
- mMapManager.destroy();
- mMapManager=null;
- }
- super.onDestroy();
- }
- }
更多相关文章
- Android开发者已经度过了初级吗
- Android 获取经纬度。2018年写
- Android中通过经纬度来过去到城市名称
- Android 获取地理位置的经度和纬度
- 尝试将纬度和经度发布到数据库时,Android JSON解析错误
- 高德地图api接口poi检索示例----并在信息框显示经纬度
- SQL Server 中 存储“经纬度”应设置的数据类型
- Sql经纬度计算与C#经纬度计算
- 根据两点经纬度计算距离和角度——java实现