Android百度地图——路径规划(驾车、步行和公交线路搜索)

分类: Android百度地图 419人阅读评论(2)收藏举报ANDROID百度地图路径规划驾车步行和公交线路搜索

前段时间公司项目比较忙,百度地图这块拖了好久了,这篇续前面几篇有关百度地图的。好了废话不多说,今天要聊的是有关路径规划的,如何使用百度地图搜索驾车、步行和公交路线并标注在地图上。这篇是基于Android百度地图——搜索服务之周边检索,有什么不清楚的请查看前面的几篇博文。路径规划:从那里到那里的线路规划,比如:从上海市盛夏路益江路到陆家嘴的驾车、步行和公交路线。

一、从那里到那里:

1、起始地点:

[java]view plaincopyprint?
  1. //上海市盛夏路益江路的GPS纬度经度值:121.637942,31.205889
  2. MKPlanNodestart=newMKPlanNode();
  3. 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?
  1. //上海市陆家嘴的GPS纬度经度值:121.509075,31.243319
  2. MKPlanNodeend=newMKPlanNode();
  3. 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?
  1. mMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST);
  2. mMKSearch.drivingSearch(null,start,null,end);
mMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST); mMKSearch.drivingSearch(null, start, null, end);

驾乘检索策略常量:较少费用

[java]view plaincopyprint?
  1. mMKSearch.setDrivingPolicy(MKSearch.ECAR_FEE_FIRST);
  2. mMKSearch.drivingSearch(null,start,null,end);
mMKSearch.setDrivingPolicy(MKSearch.ECAR_FEE_FIRST);        mMKSearch.drivingSearch(null, start, null, end);

驾乘检索策略常量:最短距离

[java]view plaincopyprint?
  1. mMKSearch.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST);
  2. mMKSearch.drivingSearch(null,start,null,end);
mMKSearch.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST);        mMKSearch.drivingSearch(null, start, null, end);

获取结果并展示时,需要实现MKSearchListener接口中的onGetDrivingRouteResult方法 :

[java]view plaincopyprint?
  1. @Override
  2. publicvoidonGetDrivingRouteResult(MKDrivingRouteResultresult,intarg1){
  3. if(result==null)
  4. return;
  5. RouteOverlayrouteOverlay=newRouteOverlay(BaiduMapRouteOverlayActivity.this,mMapView);
  6. routeOverlay.setData(result.getPlan(0).getRoute(0));
  7. mMapView.getOverlays().add(routeOverlay);
  8. mMapView.refresh();//刷新地图
  9. }
    @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?
  1. //步行线路搜索
  2. mMKSearch.walkingSearch(null,start,null,end);
 // 步行线路搜索        mMKSearch.walkingSearch(null, start, null, end);


获取结果并展示时,需要实现MKSearchListener接口中的onGetWalkingRouteResult方法

[java]view plaincopyprint?
  1. @Override
  2. publicvoidonGetWalkingRouteResult(MKWalkingRouteResultresult,intarg1){
  3. //TODOAuto-generatedmethodstub
  4. RouteOverlayrouteOverlay=newRouteOverlay(BaiduMapRouteOverlayActivity.this,mMapView);
  5. routeOverlay.setData(result.getPlan(0).getRoute(0));
  6. mMapView.getOverlays().add(routeOverlay);
  7. mMapView.refresh();//刷新地图
  8. }
 @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?
  1. //公交线路搜索
  2. mMKSearch.transitSearch("上海市",start,end);
      // 公交线路搜索        mMKSearch.transitSearch("上海市", start, end);

获取结果:

[java]view plaincopyprint?
  1. @Override
  2. publicvoidonGetTransitRouteResult(MKTransitRouteResultresult,intarg1){
  3. RouteOverlayrouteOverlay=newRouteOverlay(BaiduMapRouteOverlayActivity.this,mMapView);
  4. routeOverlay.setData(result.getPlan(0).getRoute(0));
  5. mMapView.getOverlays().add(routeOverlay);
  6. mMapView.refresh();//刷新地图
  7. }
  @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?
  1. packagecom.android.baidu.map;
  2. importandroid.app.Activity;
  3. importandroid.content.Context;
  4. importandroid.content.res.Configuration;
  5. importandroid.os.Bundle;
  6. importandroid.widget.Toast;
  7. importcom.baidu.mapapi.BMapManager;
  8. importcom.baidu.mapapi.MKGeneralListener;
  9. importcom.baidu.mapapi.map.MKEvent;
  10. importcom.baidu.mapapi.map.MapController;
  11. importcom.baidu.mapapi.map.MapView;
  12. importcom.baidu.mapapi.map.RouteOverlay;
  13. importcom.baidu.mapapi.search.MKAddrInfo;
  14. importcom.baidu.mapapi.search.MKBusLineResult;
  15. importcom.baidu.mapapi.search.MKDrivingRouteResult;
  16. importcom.baidu.mapapi.search.MKPlanNode;
  17. importcom.baidu.mapapi.search.MKPoiResult;
  18. importcom.baidu.mapapi.search.MKSearch;
  19. importcom.baidu.mapapi.search.MKSearchListener;
  20. importcom.baidu.mapapi.search.MKSuggestionResult;
  21. importcom.baidu.mapapi.search.MKTransitRouteResult;
  22. importcom.baidu.mapapi.search.MKWalkingRouteResult;
  23. importcom.baidu.platform.comapi.basestruct.GeoPoint;
  24. publicclassBaiduMapRouteOverlayActivityextendsActivity{
  25. publicstaticfinalStringBAIDU_MAP_KEY="07418AEC69BAAB7104C6230A6120C580DFFAEEBB";
  26. privateBMapManagermMapManager=null;
  27. privateMapViewmMapView=null;
  28. privateMKSearchmMKSearch=null;
  29. privateContextmContext;
  30. @Override
  31. publicvoidonCreate(BundlesavedInstanceState){
  32. super.onCreate(savedInstanceState);
  33. mContext=BaiduMapRouteOverlayActivity.this.getApplicationContext();
  34. mMapManager=newBMapManager(getApplicationContext());
  35. mMapManager.init(BAIDU_MAP_KEY,newMKGeneralListener(){
  36. @Override
  37. publicvoidonGetNetworkState(interrorCode){
  38. if(errorCode==MKEvent.ERROR_NETWORK_CONNECT){
  39. Toast.makeText(mContext,"您的网络出错啦!",Toast.LENGTH_LONG)
  40. .show();
  41. }
  42. }
  43. @Override
  44. publicvoidonGetPermissionState(interrorCode){
  45. if(errorCode==MKEvent.ERROR_PERMISSION_DENIED){
  46. //授权Key错误:
  47. Toast.makeText(mContext,
  48. "请在DemoApplication.java文件输入正确的授权Key!",
  49. Toast.LENGTH_LONG).show();
  50. }
  51. }
  52. });
  53. setContentView(R.layout.main);
  54. mMapView=(MapView)this.findViewById(R.id.bmapsView);
  55. mMapView.setBuiltInZoomControls(true);
  56. MapControllermMapController=mMapView.getController();
  57. //上海市的GPS纬度经度值:31.243319,121.509075
  58. GeoPointgeoPoint=newGeoPoint((int)(31.243319*1E6),
  59. (int)(121.509075*1E6));
  60. mMapController.setCenter(geoPoint);
  61. mMapController.setZoom(12);
  62. //检索从上海市盛夏路益江路到陆家嘴的驾车路线
  63. //上海市盛夏路益江路的GPS纬度经度值:121.637942,31.205889
  64. MKPlanNodestart=newMKPlanNode();
  65. start.pt=newGeoPoint((int)(31.205889*1E6),
  66. (int)(121.637942*1E6));
  67. //上海市陆家嘴的GPS纬度经度值:121.509075,31.243319
  68. MKPlanNodeend=newMKPlanNode();
  69. end.pt=newGeoPoint((int)(31.243319*1E6),(int)(121.509075*1E6));
  70. mMKSearch=newMKSearch();
  71. mMKSearch.init(mMapManager,newMKSearchListener(){
  72. @Override
  73. publicvoidonGetAddrResult(MKAddrInfoarg0,intarg1){
  74. //TODOAuto-generatedmethodstub
  75. }
  76. @Override
  77. publicvoidonGetBusDetailResult(MKBusLineResultarg0,intarg1){
  78. //TODOAuto-generatedmethodstub
  79. }
  80. @Override
  81. publicvoidonGetDrivingRouteResult(MKDrivingRouteResultresult,
  82. intarg1){
  83. if(result==null)
  84. return;
  85. RouteOverlayrouteOverlay=newRouteOverlay(
  86. BaiduMapRouteOverlayActivity.this,mMapView);
  87. routeOverlay.setData(result.getPlan(0).getRoute(0));
  88. mMapView.getOverlays().add(routeOverlay);
  89. mMapView.refresh();//刷新地图
  90. }
  91. @Override
  92. publicvoidonGetPoiDetailSearchResult(intarg0,intarg1){
  93. //TODOAuto-generatedmethodstub
  94. }
  95. @Override
  96. publicvoidonGetPoiResult(MKPoiResultarg0,intarg1,intarg2){
  97. //TODOAuto-generatedmethodstub
  98. }
  99. @Override
  100. publicvoidonGetSuggestionResult(MKSuggestionResultarg0,intarg1){
  101. //TODOAuto-generatedmethodstub
  102. }
  103. @Override
  104. publicvoidonGetTransitRouteResult(MKTransitRouteResultresult,
  105. intarg1){
  106. RouteOverlayrouteOverlay=newRouteOverlay(
  107. BaiduMapRouteOverlayActivity.this,mMapView);
  108. routeOverlay.setData(result.getPlan(0).getRoute(0));
  109. mMapView.getOverlays().add(routeOverlay);
  110. mMapView.refresh();//刷新地图
  111. }
  112. @Override
  113. publicvoidonGetWalkingRouteResult(MKWalkingRouteResultresult,
  114. intarg1){
  115. //TODOAuto-generatedmethodstub
  116. RouteOverlayrouteOverlay=newRouteOverlay(
  117. BaiduMapRouteOverlayActivity.this,mMapView);
  118. routeOverlay.setData(result.getPlan(0).getRoute(0));
  119. mMapView.getOverlays().add(routeOverlay);
  120. mMapView.refresh();//刷新地图
  121. }
  122. });
  123. //设置驾车路线搜索策略,时间优先、费用最少或距离最短
  124. /*
  125. *//驾乘检索策略常量:时间优先
  126. *mMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST);
  127. *mMKSearch.drivingSearch(null,start,null,end);
  128. *
  129. *//驾乘检索策略常量:较少费用mMKSearch.setDrivingPolicy(MKSearch.ECAR_FEE_FIRST);
  130. *mMKSearch.drivingSearch(null,start,null,end);
  131. *
  132. *//驾乘检索策略常量:最短距离mMKSearch.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST);
  133. *mMKSearch.drivingSearch(null,start,null,end);
  134. */
  135. //步行线路搜索
  136. mMKSearch.walkingSearch(null,start,null,end);
  137. //公交线路搜索
  138. //mMKSearch.transitSearch("上海市",start,end);
  139. }
  140. @Override
  141. publicvoidonConfigurationChanged(ConfigurationnewConfig){
  142. super.onConfigurationChanged(newConfig);
  143. }
  144. @Override
  145. protectedvoidonSaveInstanceState(BundleoutState){
  146. super.onSaveInstanceState(outState);
  147. mMapView.onSaveInstanceState(outState);
  148. }
  149. @Override
  150. protectedvoidonRestoreInstanceState(BundlesavedInstanceState){
  151. super.onRestoreInstanceState(savedInstanceState);
  152. mMapView.onRestoreInstanceState(savedInstanceState);
  153. }
  154. @Override
  155. protectedvoidonResume(){
  156. mMapView.onResume();
  157. if(mMapManager!=null){
  158. mMapManager.start();
  159. }
  160. super.onResume();
  161. }
  162. @Override
  163. protectedvoidonPause(){
  164. mMapView.onPause();
  165. if(mMapManager!=null){
  166. mMapManager.stop();
  167. }
  168. super.onPause();
  169. }
  170. @Override
  171. protectedvoidonDestroy(){
  172. mMapView.destroy();
  173. if(mMapManager!=null){
  174. mMapManager.destroy();
  175. mMapManager=null;
  176. }
  177. super.onDestroy();
  178. }
  179. }

更多相关文章

  1. Android开发者已经度过了初级吗
  2. Android 获取经纬度。2018年写
  3. Android中通过经纬度来过去到城市名称
  4. Android 获取地理位置的经度和纬度
  5. 尝试将纬度和经度发布到数据库时,Android JSON解析错误
  6. 高德地图api接口poi检索示例----并在信息框显示经纬度
  7. SQL Server 中 存储“经纬度”应设置的数据类型
  8. Sql经纬度计算与C#经纬度计算
  9. 根据两点经纬度计算距离和角度——java实现

随机推荐

  1. Android(安卓)五步修改状态栏颜色
  2. android主流屏幕适配方案总结
  3. Android(安卓)九宫格解锁Demo--Android(
  4. Android之通用MVP模式框架
  5. Android面试的一些总结
  6. ReactNative之Image在Android设置圆角图
  7. Android(安卓)View的绘制之 从源码了解me
  8. 描述下IOS和android系统流畅度的差别
  9. Android(安卓)Studio离线安装gradle(亲测
  10. android WebView与JS交互小结