现在的位置: 首页 > 综合 > 正文

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

2018年05月05日 ⁄ 综合 ⁄ 共 10696字 ⁄ 字号 评论关闭

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

一、从那里到那里:

        1、起始地点:

[java] view
plain
copy

  1. // 上海市盛夏路益江路的GPS纬度经度值:121.637942,31.205889   
  2.        MKPlanNode start = new MKPlanNode();  
  3.        start.pt = new GeoPoint((int) (31.205889 * 1E6), (int) (121.637942 * 1E6));  

        2、目的地点:

[java] view
plain
copy

  1. // 上海市陆家嘴的GPS纬度经度值: 121.509075,31.243319   
  2.        MKPlanNode end = new MKPlanNode();  
  3.        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
plain
copy

  1. mMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST);  
  2.         mMKSearch.drivingSearch(null, start, null, end);  

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

[java] view
plain
copy

  1. mMKSearch.setDrivingPolicy(MKSearch.ECAR_FEE_FIRST);  
  2.         mMKSearch.drivingSearch(null, start, null, end);  

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

[java] view
plain
copy

  1. mMKSearch.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST);  
  2.         mMKSearch.drivingSearch(null, start, null, end);  

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

[java] view
plain
copy

  1. @Override  
  2.         public void onGetDrivingRouteResult(MKDrivingRouteResult result, int arg1) {  
  3.             if (result == null)  
  4.                 return;  
  5.               
  6.             RouteOverlay routeOverlay = new RouteOverlay(BaiduMapRouteOverlayActivity.this, mMapView);     
  7.               
  8.             routeOverlay.setData(result.getPlan(0).getRoute(0));   
  9.             mMapView.getOverlays().add(routeOverlay);  
  10.             mMapView.refresh();//刷新地图  
  11.               
  12.         }  

        2、步行线路:

[java] view
plain
copy

  1. // 步行线路搜索  
  2.        mMKSearch.walkingSearch(null, start, null, end);  


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

[java] view
plain
copy

  1. @Override  
  2.            public void onGetWalkingRouteResult(MKWalkingRouteResult result, int arg1) {  
  3.                // TODO Auto-generated method stub  
  4.              RouteOverlay routeOverlay = new RouteOverlay(BaiduMapRouteOverlayActivity.this, mMapView);     
  5.                 routeOverlay.setData(result.getPlan(0).getRoute(0));   
  6.                 mMapView.getOverlays().add(routeOverlay);  
  7.                 mMapView.refresh();//刷新地图  
  8.            }  

 

        3、公交线路:

公交线路搜索的方法为transitSearch(String city, MKPlanNode start, MKPlanNode end),city:为待查公交线路所在城市,start和end分别是起点和终点;获取结果的方法改为重写onGetTransitRouteResult方法。

[java] view
plain
copy

  1. // 公交线路搜索  
  2.   mMKSearch.transitSearch("上海市", start, end);  

获取结果:

[java] view
plain
copy

  1. @Override  
  2.           public void onGetTransitRouteResult(MKTransitRouteResult result, int arg1) {  
  3.              RouteOverlay routeOverlay = new RouteOverlay(BaiduMapRouteOverlayActivity.this, mMapView);     
  4.                routeOverlay.setData(result.getPlan(0).getRoute(0));   
  5.                mMapView.getOverlays().add(routeOverlay);  
  6.                mMapView.refresh();//刷新地图  
  7.                  
  8.           }  

四、完整代码:

[java] view
plain
copy

  1. package com.android.baidu.map;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Context;  
  5. import android.content.res.Configuration;  
  6. import android.os.Bundle;  
  7. import android.widget.Toast;  
  8.   
  9. import com.baidu.mapapi.BMapManager;  
  10. import com.baidu.mapapi.MKGeneralListener;  
  11. import com.baidu.mapapi.map.MKEvent;  
  12. import com.baidu.mapapi.map.MapController;  
  13. import com.baidu.mapapi.map.MapView;  
  14. import com.baidu.mapapi.map.RouteOverlay;  
  15. import com.baidu.mapapi.search.MKAddrInfo;  
  16. import com.baidu.mapapi.search.MKBusLineResult;  
  17. import com.baidu.mapapi.search.MKDrivingRouteResult;  
  18. import com.baidu.mapapi.search.MKPlanNode;  
  19. import com.baidu.mapapi.search.MKPoiResult;  
  20. import com.baidu.mapapi.search.MKSearch;  
  21. import com.baidu.mapapi.search.MKSearchListener;  
  22. import com.baidu.mapapi.search.MKSuggestionResult;  
  23. import com.baidu.mapapi.search.MKTransitRouteResult;  
  24. import com.baidu.mapapi.search.MKWalkingRouteResult;  
  25. import com.baidu.platform.comapi.basestruct.GeoPoint;  
  26.   
  27. public class BaiduMapRouteOverlayActivity extends Activity {  
  28.   
  29.     public static final String BAIDU_MAP_KEY = "07418AEC69BAAB7104C6230A6120C580DFFAEEBB";  
  30.   
  31.     private BMapManager mMapManager = null;  
  32.   
  33.     private MapView mMapView = null;  
  34.   
  35.     private MKSearch mMKSearch = null;  
  36.   
  37.     private Context mContext;  
  38.   
  39.     @Override  
  40.     public void onCreate(Bundle savedInstanceState) {  
  41.         super.onCreate(savedInstanceState);  
  42.   
  43.         mContext = BaiduMapRouteOverlayActivity.this.getApplicationContext();  
  44.   
  45.         mMapManager = new BMapManager(getApplicationContext());  
  46.         mMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() {  
  47.   
  48.             @Override  
  49.             public void onGetNetworkState(int errorCode) {  
  50.                 if (errorCode == MKEvent.ERROR_NETWORK_CONNECT) {  
  51.                     Toast.makeText(mContext, "您的网络出错啦!", Toast.LENGTH_LONG)  
  52.                             .show();  
  53.                 }  
  54.             }  
  55.   
  56.             @Override  
  57.             public void onGetPermissionState(int errorCode) {  
  58.                 if (errorCode == MKEvent.ERROR_PERMISSION_DENIED) {  
  59.                     // 授权Key错误:  
  60.                     Toast.makeText(mContext,  
  61.                             "请在 DemoApplication.java文件输入正确的授权Key!",  
  62.                             Toast.LENGTH_LONG).show();  
  63.                 }  
  64.             }  
  65.         });  
  66.   
  67.         setContentView(R.layout.main);  
  68.   
  69.         mMapView = (MapView) this.findViewById(R.id.bmapsView);  
  70.         mMapView.setBuiltInZoomControls(true);  
  71.   
  72.         MapController mMapController = mMapView.getController();  
  73.         // 上海市的GPS纬度经度值:31.243319,121.509075  
  74.         GeoPoint geoPoint = new GeoPoint((int) (31.243319 * 1E6),  
  75.                 (int) (121.509075 * 1E6));  
  76.         mMapController.setCenter(geoPoint);  
  77.         mMapController.setZoom(12);  
  78.   
  79.         // 检索从上海市盛夏路益江路到陆家嘴的驾车路线  
  80.   
  81.         // 上海市盛夏路益江路的GPS纬度经度值:121.637942,31.205889  
  82.         MKPlanNode start = new MKPlanNode();  
  83.         start.pt = new GeoPoint((int) (31.205889 * 1E6),  
  84.                 (int) (121.637942 * 1E6));  
  85.   
  86.         // 上海市陆家嘴的GPS纬度经度值: 121.509075,31.243319  
  87.         MKPlanNode end = new MKPlanNode();  
  88.         end.pt = new GeoPoint((int) (31.243319 * 1E6), (int) (121.509075 * 1E6));  
  89.   
  90.         mMKSearch = new MKSearch();  
  91.         mMKSearch.init(mMapManager, new MKSearchListener() {  
  92.   
  93.             @Override  
  94.             public void onGetAddrResult(MKAddrInfo arg0, int arg1) {  
  95.                 // TODO Auto-generated method stub  
  96.   
  97.             }  
  98.   
  99.             @Override  
  100.             public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {  
  101.                 // TODO Auto-generated method stub  
  102.   
  103.             }  
  104.   
  105.             @Override  
  106.             public void onGetDrivingRouteResult(MKDrivingRouteResult result,  
  107.                     int arg1) {  
  108.                 if (result == null)  
  109.                     return;  
  110.   
  111.                 RouteOverlay routeOverlay = new RouteOverlay(  
  112.                         BaiduMapRouteOverlayActivity.this, mMapView);  
  113.                 routeOverlay.setData(result.getPlan(0).getRoute(0));  
  114.                 mMapView.getOverlays().add(routeOverlay);  
  115.                 mMapView.refresh();// 刷新地图  
  116.   
  117.             }  
  118.   
  119.             @Override  
  120.             public void onGetPoiDetailSearchResult(int arg0, int arg1) {  
  121.                 // TODO Auto-generated method stub  
  122.   
  123.             }  
  124.   
  125.             @Override  
  126.             public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) {  
  127.                 // TODO Auto-generated method stub  
  128.   
  129.             }  
  130.   
  131.             @Override  
  132.             public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {  
  133.                 // TODO Auto-generated method stub  
  134.   
  135.             }  
  136.   
  137.             @Override  
  138.             public void onGetTransitRouteResult(MKTransitRouteResult result,  
  139.                     int arg1) {  
  140.                 RouteOverlay routeOverlay = new RouteOverlay(  
  141.                         BaiduMapRouteOverlayActivity.this, mMapView);  
  142.                 routeOverlay.setData(result.getPlan(0).getRoute(0));  
  143.                 mMapView.getOverlays().add(routeOverlay);  
  144.                 mMapView.refresh();// 刷新地图  
  145.   
  146.             }  
  147.   
  148.             @Override  
  149.             public void onGetWalkingRouteResult(MKWalkingRouteResult result,  
  150.                     int arg1) {  
  151.                 // TODO Auto-generated method stub  
  152.                 RouteOverlay routeOverlay = new RouteOverlay(  
  153.                         BaiduMapRouteOverlayActivity.this, mMapView);  
  154.                 routeOverlay.setData(result.getPlan(0).getRoute(0));  
  155.                 mMapView.getOverlays().add(routeOverlay);  
  156.                 mMapView.refresh();// 刷新地图  
  157.             }  
  158.   
  159.         });  
  160.   
  161.         // 设置驾车路线搜索策略,时间优先、费用最少或距离最短  
  162.   
  163.         /* 
  164.          * // 驾乘检索策略常量:时间优先 
  165.          * mMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST); 
  166.          * mMKSearch.drivingSearch(null, start, null, end); 
  167.          *  
  168.          * // 驾乘检索策略常量:较少费用 mMKSearch.setDrivingPolicy(MKSearch.ECAR_FEE_FIRST); 
  169.          * mMKSearch.drivingSearch(null, start, null, end); 
  170.          *  
  171.          * // 驾乘检索策略常量:最短距离 mMKSearch.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST); 
  172.          * mMKSearch.drivingSearch(null, start, null, end); 
  173.          */  
  174.   
  175.         // 步行线路搜索  
  176.         mMKSearch.walkingSearch(null, start, null, end);  
  177.   
  178.         // 公交线路搜索  
  179.         // mMKSearch.transitSearch("上海市", start, end);  
  180.   
  181.     }  
  182.   
  183.     @Override  
  184.     public void onConfigurationChanged(Configuration newConfig) {  
  185.         super.onConfigurationChanged(newConfig);  
  186.     }  
  187.   
  188.     @Override  
  189.     protected void onSaveInstanceState(Bundle outState) {  
  190.         super.onSaveInstanceState(outState);  
  191.         mMapView.onSaveInstanceState(outState);  
  192.     }  
  193.   
  194.     @Override  
  195.     protected void onRestoreInstanceState(Bundle savedInstanceState) {  
  196.         super.onRestoreInstanceState(savedInstanceState);  
  197.         mMapView.onRestoreInstanceState(savedInstanceState);  
  198.     }  
  199.   
  200.     @Override  
  201.     protected void onResume() {  
  202.         mMapView.onResume();  
  203.   
  204.         if (mMapManager != null) {  
  205.             mMapManager.start();  
  206.         }  
  207.   
  208.         super.onResume();  
  209.     }  
  210.   
  211.     @Override  
  212.     protected void onPause() {  
  213.         mMapView.onPause();  
  214.         if (mMapManager != null) {  
  215.             mMapManager.stop();  
  216.         }  
  217.         super.onPause();  
  218.     }  
  219.   
  220.     @Override  
  221.     protected void onDestroy() {  
  222.         mMapView.destroy();  
  223.         if (mMapManager != null) {  
  224.             mMapManager.destroy();  
  225.             mMapManager = null;  
  226.         }  
  227.         super.onDestroy();  
  228.     }  
  229.   
  230. }  

抱歉!评论已关闭.