【轉載】Android端百度地圖API使用詳解

轉載地址:http://www.cnblogs.com/rocomp/p/4994110.htmlphp

百度地圖API簡介

百度地圖移動版API(Android)是一套基於Android設備的應用程序接口,經過該接口,能夠輕鬆的訪問百度服務和數據,構建功能豐富、交互性強的地圖應用程序。
百度地圖移動版API不只包含構建地圖的基本接口,還提供了本地搜索、路線規劃、地圖定位等數據服務html

1、準備工做

  • 1.註冊百度開發者帳號,建立應用,獲取API key
  • 地址:http://lbsyun.baidu.com/apiconsole/key
  • 2.建立應用須要應用的數字簽名SHA1和包名
  • 在Preference中能夠看到Android項目Eclipse默認的數字簽名SHA1java

  • 切換到模擬器安裝目錄下輸入命令命令 "C:\Program Files\Java\jdk1.6.0_45\bin\keytool.exe" -list -v -keystoredebug.keystore默認密碼是android也能獲取數字簽名的SHA1node

  • 獲取建立的API key
  • 3.添加地圖引擎(類庫和.so文件)到工程中
  • 4.添加權限android

<!-- 這個權限用於進行網絡定位--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <!-- 這個權限用於訪問GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <!-- 用於訪問wifi網絡信息,wifi信息會用於進行網絡定位--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <!-- 獲取運營商信息,用於支持提供運營商信息相關的接口--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <!-- 這個權限用於獲取wifi的獲取權限,wifi信息會用來進行網絡定位--> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <!-- 用於讀取手機當前的狀態--> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> <!-- 寫入擴展存儲,向擴展卡寫入數據,用於寫入離線定位數據--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <!-- 訪問網絡,網絡定位須要上網--> <uses-permission android:name="android.permission.INTERNET" /> <!-- SD卡讀取權限,用戶寫入離線定位數據--> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission> <!--容許應用讀取低級別的系統日誌文件 --> <uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
  • 5.在清單文件Application節點下添加
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="33c6iZyFukuzDOg77Wk6wE2t"/>

2、MapView和BaiduMap介紹

public class HelloWorld extends Activity{ private static final String TAG ="HelloWorld"; private MapView mapView; private BaiduMap baiduMap; private double latitude = 40.050966;// 緯度 private double longitude = 116.303128;// 經度 private LatLng hmPos = new LatLng(latitude, longitude);// 座標 private MyBaiduSdkReceiver receiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); intManager(); setContentView(R.layout.common); init(); } private void intManager() { receiver = new MyBaiduSdkReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR); filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR); registerReceiver(receiver, filter); } private void init() { mapView = (MapView) findViewById(R.id.mapView); //BaiduMap管理具體的某一個MapView: 旋轉,移動,縮放,事件。。。 baiduMap = mapView.getMap(); //設置縮放級別,默認級別爲12 MapStatusUpdate mapstatusUpdate = MapStatusUpdateFactory.zoomTo(19);; baiduMap.setMapStatus(mapstatusUpdate); //設置地圖中心點,默認是天安門 MapStatusUpdate mapstatusUpdatePoint = MapStatusUpdateFactory.newLatLng(hmPos); baiduMap.setMapStatus(mapstatusUpdatePoint ); //mapView.showScaleControl(false);//默認是true,顯示縮放按鈕 //mapView.showZoomControls(false);//默認是true,顯示比例尺 } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { //旋轉,移動,縮放 switch (keyCode) { case KeyEvent.KEYCODE_1: //放大地圖縮放級別,每次放大一個級別 baiduMap.setMapStatus(MapStatusUpdateFactory.zoomIn()); break; case KeyEvent.KEYCODE_2: //每次縮小一個級別 baiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut()); break; case KeyEvent.KEYCODE_3: //以一個點爲中心旋轉 //獲取地圖當前的狀態 MapStatus mapStatus = baiduMap.getMapStatus(); float rotate = mapStatus.rotate; Log.d(TAG, "rotate:" + rotate); //旋轉範圍 0-360 MapStatus newRotate = new MapStatus.Builder().rotate(rotate+30).build(); baiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(newRotate)); break; case KeyEvent.KEYCODE_4: //以一條直線爲軸,旋轉 調整俯仰角 overlook //範圍 0-45 float overlook = baiduMap.getMapStatus().overlook; MapStatus overStatus = new MapStatus.Builder().overlook(overlook-5).build(); baiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(overStatus)); break; case KeyEvent.KEYCODE_5: //移動 MapStatusUpdate moveStatusUpdate = MapStatusUpdateFactory.newLatLng(new LatLng(40.065796,116.349868)); //帶動畫的更新地圖狀態,仍是300毫秒 baiduMap.animateMapStatus(moveStatusUpdate); break; default: break; } return super.onKeyDown(keyCode, event); } @Override protected void onDestroy() { //卸載super的先後是沒有卻別的 mapView.onDestroy(); unregisterReceiver(receiver); super.onDestroy(); } @Override protected void onResume() { mapView.onResume(); super.onResume(); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); mapView.onPause(); } class MyBaiduSdkReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) { //網絡錯誤 Toast.makeText(getApplicationContext(), "無網絡", 0).show(); }else if (action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) { //key校驗失敗 Toast.makeText(getApplicationContext(), "校驗失敗", 0).show(); } } } } 

3、地圖圖層

什麼是地圖圖層

  • 地圖能夠包含一個或多個圖層,每一個圖層在每一個級別都是由若干個圖塊組成的,他們覆蓋了地圖的整個表面。例如您所看到的包括街道、興趣點(POI)、學校、公園等內容的地圖展示就是一個圖層,另外交通留香的展示也是經過圖層來實現的。git

    圖層分類

  • 底圖
    • 基本的地圖圖層,包括軟杆個縮放級別,顯示基本的地圖信息,包括道路、街道、學校、公園等內容
  • 實時交通訊息圖baiduMap.setTrafficEnabled(true)
  • 衛星圖baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE)
    • 衛星地圖是衛星拍攝的真實的地理面貌(其實不少都是飛機航拍的,由於衛星拍照貴啊),因此衛星地圖可用來檢測地面的信息api

      覆蓋物的成績壓蓋關係,具體以下(從下至上的順序):
      1.基礎底圖(包括底圖、底圖道路、衛星圖等);
      2.地形圖圖層(GroundOverlay);
      3.熱力圖圖層(HeatMap);
      4.實時路況圖圖層(BaiduMap.setTrafficEnabled(true););
      5.百度城市熱力圖(BaiduMap.setBaiduHeatMapEnabled(true););
      6.底圖標註(指的是底圖上面自帶的那些POI元素);
      7.幾何圖形圖層(點、折線、弧線、圓、多邊形);
      8.標註圖層(Marker),文字繪製圖層(Text);
      9.指南針圖層(當地圖發生旋轉和視角變化時,默認出如今左上角的指南針);
      10.定位圖層(BaiduMap.setMyLocationEnabled(true););
      11.彈出窗圖層(InfoWindow);
      12.自定義View(MapView.addView(View););服務器

  • 切換地圖,交通圖,衛星圖,是否顯示實時交通markdown

@Override public boolean onKeyDown(int keyCode, KeyEvent event) { //切換 地圖、交通圖、 衛星圖 switch (keyCode) { case KeyEvent.KEYCODE_1: //按1 設置顯示底圖 baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); break; case KeyEvent.KEYCODE_2: //衛星圖 baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); break; case KeyEvent.KEYCODE_3: //打開交通圖 baiduMap.setTrafficEnabled(true); break; } return super.onKeyDown(keyCode, event); } 

4、覆蓋物

全部疊加或覆蓋到地圖的內容,咱們琮琤爲地圖覆蓋物。如標註、矢量圖性元素(包括:折現和多邊形和圓),定位圖標等。覆蓋物擁有本身的地理座標,當您拖動或縮放地圖時,他們會嚮應的處理網絡

覆蓋物包括:本地覆蓋物和搜索覆蓋物

#### 本地覆蓋物的抽象基類:OverlayOptions(核心類)

  • 圓形覆蓋物: CircleOptions
  • 文字覆蓋物: TextOptions
  • marker覆蓋物: MarkerOptions
  • 圓點覆蓋物:DotOptions
  • ground 覆蓋物:GroundOverlayOptions
  • 圓點覆蓋物:DotOptions
  • 多邊形覆蓋物:PolygonOptions
  • 折線覆蓋物:PolylineOptions
  • 弧線覆蓋物:ArcOptions

    搜索覆蓋物抽象類: OverlayManager (核心類)

  • 本地搜索覆蓋物:PoiOverlay
  • 駕車路線覆蓋物:DrivingRouteOverlay
  • 步行路線覆蓋物:WalkingRouteOverlay
  • 換乘路線覆蓋物:TransitOverlay
  • 公交路線覆蓋物:BusLineOverlay

    建立覆蓋物的步驟:

  1. 建立本身
  2. 給本身設置數據
  3. 把覆蓋物添加到地圖中
  • 添加圓形覆蓋物
private void draw() { //定義一個圓 : 圓心+半徑 //1.建立本身 CircleOptions circleOptions = new CircleOptions(); //2.給本身設置數據 circleOptions.center(hmPos) //圓心 .radius(1000)//半徑 單位米 .fillColor(0x60ff0000)//填充色 .stroke(new Stroke(2,0x6000ff00));//邊框寬度和顏色 //3.把覆蓋物添加到地圖中 baiduMap.addOverlay(circleOptions); } 
  • 效果

  • 添加文字覆蓋物

private void draw() { TextOptions textOptions = new TextOptions(); textOptions.fontColor(0x60ff0000)//設置字體顏色 .text("無良印品,窗前明月光")//文字內容 .position(hmPos)//位置 .fontSize(24)//字體大小 .typeface(Typeface.SERIF)//字體 .rotate(30);//旋轉 baiduMap.addOverlay(textOptions); } 
  • 效果

  • Marker覆蓋物

public class MarkerOptionsDemo extends BaseActivity { private View pop; private TextView title; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); draw(); //點擊某一個Marker,在腦殼上彈出pop initPop(); } private void draw() { BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.eat_icon); MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(hmPos)//設置位置 .icon(bitmapDescriptor)//設置覆蓋物小圖標 .draggable(true)//設置是否能夠拖拽,默認爲否 .title("中心");//設置標題 baiduMap.addOverlay(markerOptions); markerOptions = new MarkerOptions().title("向北") .position(new LatLng(latitude+0.001, longitude)) .icon(bitmapDescriptor); baiduMap.addOverlay(markerOptions); ArrayList<BitmapDescriptor> bitmaps = new ArrayList<BitmapDescriptor>(); bitmaps.add(bitmapDescriptor); bitmaps.add(BitmapDescriptorFactory.fromResource(R.drawable.icon_geo)); markerOptions = new MarkerOptions().title("向東") .position(new LatLng(latitude, longitude+0.001)) .icons(bitmaps)//圖標設置一個幀動畫,多個圖片來回切換 .period(10);//切換幀的時間間隔 baiduMap.addOverlay(markerOptions); markerOptions = new MarkerOptions().title("向西南") .position(new LatLng(latitude-0.001, longitude-0.001)) .icon(bitmapDescriptor); baiduMap.addOverlay(markerOptions); baiduMap.setOnMarkerClickListener(new OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker result) { //當點擊時,更新pop的位置,設置爲顯示 MapViewLayoutParams layoutParams = new MapViewLayoutParams.Builder() .layoutMode(ELayoutMode.mapMode)//按照經緯度設置位置 .position(result.getPosition())//不能傳null .width(MapViewLayoutParams.WRAP_CONTENT) .height(MapViewLayoutParams.WRAP_CONTENT) .yOffset(-5)//距離position的像素 向下是正值,向上是負值 .build(); mapview.updateViewLayout(pop, layoutParams); pop.setVisibility(View.VISIBLE); title.setText(result.getTitle()); return true; } }); } private void initPop() { //加載pop 添加到mapview,設置爲隱藏 pop = View.inflate(getApplicationContext(), R.layout.pop, null); MapViewLayoutParams layoutParams = new MapViewLayoutParams.Builder() .layoutMode(MapViewLayoutParams.ELayoutMode.mapMode)//按照經緯度設置位置 .position(hmPos)//不能傳null,設置爲mapMode時,必須設置position .width(MapViewLayoutParams.WRAP_CONTENT) .height(MapViewLayoutParams.WRAP_CONTENT) .build(); mapview.addView(pop, layoutParams); pop.setVisibility(View.INVISIBLE); title = (TextView) pop.findViewById(R.id.title); } } 
  • 效果

5、搜索

百度地圖移動版API集成搜索服務,包括位置檢索、周邊檢索、範圍檢索、公交檢索、駕乘檢索、步行檢索

核心類

PoiSearch和OnGetPoiSearchResultListener RoutePlanSearch和OnGetRoutePlanResultListener

實現思路

  • 初始化PoiSearch類,經過setOnGetPoiSearchResultListtener方法註冊搜索結果的監聽對象OnGetPoiSearchResultListener
    ,實現異步搜索服務。
  • 經過自定義MySearchListener實現類,處理不一樣的回調方法,得到搜索結果。
  • 注意,OnGetPoiSearchResultListener只支持一個,一最後一次設置爲準

    結合覆蓋物展現搜索

    本地搜索覆蓋物:PoiOverlay
    駕車路線覆蓋物:DrivingRouteOverlay
    步行路線覆蓋物:WalkingRouteOverlay
    換乘路線覆蓋物:TransitOverlay

    POI(Point of Interest興趣點)搜索有三種方式

    根據範圍和檢索詞發起範圍檢索searchInBound
    周邊檢索searchNearby
    城市poi檢索searchInCity
    poi詳細信息檢索 searchPoiDetail
    結果的展現: PoiOverlay

    在OnGetPoiSearchResultListener的onGetPoiResult方法中處理搜索結果

  • 處理步驟:
  • 判斷服務器結果返回
  • 建立poi覆蓋物
  • 將服務器返回數據添加到poi覆蓋物中
  • 添加覆蓋物到地圖addToMap
  • 縮放地圖,使全部Overlay都在合適的視野內
  • 注意
  • POI檢索結果每頁容量默認狀況下爲10,能夠經過pageCapacity設置,支持1-50(10)
  • 翻頁功能從新調用經過PoiSearch類的searchInXxx()方法並傳遞頁數角標pageNum來實現,該方法是異步函數,搜索成功後會調用註冊的事件處理函數onGetPoiResult 返回查詢頁的結果

  • 在必定範圍內搜索POI

/** * 範圍內搜索 * @author mwp * */ public class PoiSearchInBoundsDemo extends BaseActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); search(); } private void search() { PoiSearch poiSearch = PoiSearch.newInstance(); PoiBoundSearchOption boundSearchOption = new PoiBoundSearchOption(); LatLngBounds latLngBounds = new LatLngBounds.Builder() .include(new LatLng(40.049233, 116.302675))//東北的點 .include(new LatLng(40.050645, 116.303695))//西南的點 .build(); //由東北的點和西南的點兩個點肯定搜索的矩形範圍 boundSearchOption.bound(latLngBounds);//設置搜索範圍 boundSearchOption.keyword("加油站");//搜索關鍵字 poiSearch.searchInBound(boundSearchOption);// 只是把範圍能搜索到的poi設置爲 地圖的中心,同時會搜索到範圍外的poi poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult result) { if (result==null || result.error==ERRORNO.RESULT_NOT_FOUND) { Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show(); return; } //搜索poi的覆蓋物 MyPoiOverlay overlay = new MyPoiOverlay(baiduMap); //把事件分發給overlay,overlay才能處理那個點擊事件 baiduMap.setOnMarkerClickListener(overlay); overlay.setData(result);//設置結果 overlay.addToMap();//把搜索的結果添加到地圖中 overlay.zoomToSpan();//縮放地圖,使全部overlay都在合適的視野內, 注: 該方法只對Marker類型的overlay有效 } @Override public void onGetPoiDetailResult(PoiDetailResult result) { } }); } class MyPoiOverlay extends PoiOverlay{ public MyPoiOverlay(BaiduMap arg0) { super(arg0); } @Override public boolean onPoiClick(int index) { //獲取搜索結果 PoiResult poiResult = getPoiResult(); //獲取點擊的那個poi的信息 PoiInfo poiInfo = poiResult.getAllPoi().get(index); String text = poiInfo.name+","+poiInfo.address; Toast.makeText(getApplicationContext(), text, 0).show(); return super.onPoiClick(index); } } } 
  • 搜索結果

  • 周邊搜索

/**
 * 周邊搜索
 * @author mwp
 *
 */
public class PoiSearchNearByDemo extends BaseActivity{ private PoiSearch poiSearch; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); search(); } private void search() { poiSearch = PoiSearch.newInstance(); PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption(); nearbySearchOption.location(hmPos);//設置中心點 nearbySearchOption.radius(1000);//設置半徑 米 nearbySearchOption.keyword("加油站");//關鍵字 poiSearch.searchNearby(nearbySearchOption); poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult result) { if(result==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==result.error){ Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show(); return; } PoiOverlay overlay = new MyPoiOverlay(baiduMap);// 搜索poi的覆蓋物 baiduMap.setOnMarkerClickListener(overlay);// 把事件分發給overlay,overlay才能處理點擊事件 overlay.setData(result);// 設置結果 overlay.addToMap();// 把搜索的結果添加到地圖中 overlay.zoomToSpan();// 縮放地圖,使全部Overlay都在合適的視野內 注: 該方法只對Marker類型的overlay有效 } @Override public void onGetPoiDetailResult(PoiDetailResult result) { if(result==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==result.error){ Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show(); return; } String text = result.getAddress()+ "::" + result.getCommentNum() + result.getEnvironmentRating(); Toast.makeText(getApplicationContext(), text, 0).show(); } }); } class MyPoiOverlay extends PoiOverlay{ public MyPoiOverlay(BaiduMap arg0) { super(arg0); } @Override public boolean onPoiClick(int index) { PoiResult poiResult = getPoiResult(); PoiInfo poiInfo = poiResult.getAllPoi().get(index);// 獲得點擊的那個poi信息 String text = poiInfo.name + "," + poiInfo.address; Toast.makeText(getApplicationContext(), text, 0).show(); PoiDetailSearchOption detailSearchOption = new PoiDetailSearchOption(); detailSearchOption.poiUid(poiInfo.uid);//設置poi的uid poiSearch.searchPoiDetail(detailSearchOption); return super.onPoiClick(index); } } } 
  • 搜索結果

  • 城市內搜索

/**
 * 城市內搜索
 * @author mwp
 *
 */
public class PoiSearchIncityDemo extends BaseActivity { private PoiSearch poiSearch; private int currentPageIndex = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); poiSearch = PoiSearch.newInstance(); search(); poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult result) { if (result == null || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) { Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show(); return; } String text = "共" + result.getTotalPageNum() + "頁,共" + result.getTotalPoiNum() + "條,當前第" + result.getCurrentPageNum() + "頁,當前頁" + result.getCurrentPageCapacity() + "條"; Toast.makeText(getApplicationContext(), text, 1).show(); baiduMap.clear();//清空地圖全部的Overlay覆蓋物以及InfoWindow PoiOverlay overlay = new MyPoiOverlay(baiduMap); baiduMap.setOnMarkerClickListener(overlay); overlay.setData(result); overlay.addToMap(); overlay.zoomToSpan(); } @Override public void onGetPoiDetailResult(PoiDetailResult arg0) { } }); } private void search() { PoiCitySearchOption citySearchOption = new PoiCitySearchOption(); citySearchOption.city("北京"); citySearchOption.keyword("加油站"); citySearchOption.pageNum(currentPageIndex); poiSearch.searchInCity(citySearchOption); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { //每按一下數字鍵1就顯示下一頁的POI if (keyCode == KeyEvent.KEYCODE_1) { currentPageIndex++; search(); } return super.onKeyDown(keyCode, event); } class MyPoiOverlay extends PoiOverlay{ public MyPoiOverlay(BaiduMap arg0) { super(arg0); } @Override public boolean onPoiClick(int index) { PoiResult poiResult = getPoiResult(); PoiInfo poiInfo = poiResult.getAllPoi().get(index);// 獲得點擊的那個poi信息 String text = poiInfo.name + "," + poiInfo.address; Toast.makeText(getApplicationContext(), text, 0).show(); return super.onPoiClick(index); } } } 
  • 搜索結果

6、路線規劃

自駕路線規劃

結果展現: DrivingRouteOverlay

  • 駕車路線查詢
  • 查詢:RoutePlanSearch.drivingSearch駕乘路線搜索,或者增長途經點.
  • PlanNode內容的設置:可使用經緯度和地名,但不支持模糊查詢,須要輸入準確的名稱
  • 能夠經過DrivingRoutePlanOption.policy (int policy)來設置駕車路線規劃策略
  • 結果處理:OnGetRoutePlanResultListener. onGetDrivingRouteResult(DrivingRouteResult result)

步行路線規劃

步行路線查詢
結果展現: WalkingRouteOverlay
RoutePlanSearch. walkingSearch步行路線搜索.
結果處理: OnGetRoutePlanResultListener. onGetWalkingRouteResult(WalkingRouteResult result)

公交換乘路線規劃

結果展現:TransitRouteOverlay
檢索: RoutePlanSearch. transitSearch
經過TransitRoutePlanOption.policy (int policy) 設置路線規劃策略
結果處理: OnGetRoutePlanResultListener. onGetTransitRouteResult(TransitRouteResult result)

  • 自駕線路規劃(路過特定地點)
/** * 駕車路線 * @author mwp * */ public class DrivingRouteOverlayDemo extends BaseActivity { private RoutePlanSearch routePlanSearch; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); search(); } private void search() { routePlanSearch = RoutePlanSearch.newInstance(); DrivingRoutePlanOption drivingOption = new DrivingRoutePlanOption(); PlanNode from = PlanNode.withLocation(hmPos);//窗前起點 PlanNode to = PlanNode.withLocation(new LatLng(40.065796,116.349868));//建立終點 drivingOption.from(from);//設置起點 drivingOption.to(to);//設置終點 List<PlanNode> nodes = new ArrayList<PlanNode>(); nodes.add(PlanNode.withCityNameAndPlaceName("北京", "天安門")); drivingOption.passBy(nodes); drivingOption.policy(DrivingPolicy.ECAR_DIS_FIRST);//設置策略,駕乘檢索策略常量:最短距離 routePlanSearch.drivingSearch(drivingOption); routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() { @Override public void onGetWalkingRouteResult(WalkingRouteResult arg0) { } @Override public void onGetTransitRouteResult(TransitRouteResult arg0) { } // 自駕搜索結果回調 @Override public void onGetDrivingRouteResult(DrivingRouteResult result) { if (result == null || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) { Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show(); return; } DrivingRouteOverlay drivingOverlay = new MyDrivingOverlay(baiduMap); baiduMap.setOnMarkerClickListener(drivingOverlay); drivingOverlay.setData(result.getRouteLines().get(0));//設置線路爲搜索結果的第一條 drivingOverlay.addToMap(); drivingOverlay.zoomToSpan(); } }); } class MyDrivingOverlay extends DrivingRouteOverlay{ public MyDrivingOverlay(BaiduMap arg0) { super(arg0); } @Override public BitmapDescriptor getStartMarker() { // 覆寫此方法以改變默認起點圖標 return BitmapDescriptorFactory.fromResource(R.drawable.icon_st); } @Override public BitmapDescriptor getTerminalMarker() { // 覆寫此方法以改變默認終點圖標 return BitmapDescriptorFactory.fromResource(R.drawable.icon_en); } } } 
  • 搜索結果

  • 步行線路規劃

/**
 * 步行路線
 * @author mwp
 *
 */
public class WalkingRouteOverlayDemo extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); search(); } private void search() { RoutePlanSearch routePlanSearch = RoutePlanSearch.newInstance(); WalkingRoutePlanOption walkingOption = new WalkingRoutePlanOption(); PlanNode from = PlanNode.withLocation(hmPos);//建立起點 PlanNode to = PlanNode.withLocation(new LatLng(40.065796,116.349868));// 建立終點 walkingOption.from(from); walkingOption.to(to); routePlanSearch.walkingSearch(walkingOption); routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() { @Override public void onGetWalkingRouteResult(WalkingRouteResult result) { if (result == null || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) { Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show(); return; } WalkingRouteOverlay overlay = new WalkingRouteOverlay(baiduMap); baiduMap.setOnMarkerClickListener(overlay); overlay.setData(result.getRouteLines().get(0)); overlay.addToMap(); overlay.zoomToSpan(); } @Override public void onGetTransitRouteResult(TransitRouteResult arg0) { } @Override public void onGetDrivingRouteResult(DrivingRouteResult arg0) { } }); } } 
  • 搜索結果

  • 公交換乘規劃

/** * 公交換乘路線規劃 * @author mwp * */ public class TransitRouteOverlayDemo extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); search(); } private void search() { RoutePlanSearch routePlanSearch = RoutePlanSearch.newInstance(); TransitRoutePlanOption transitOption = new TransitRoutePlanOption(); PlanNode from = PlanNode.withLocation(hmPos);// 建立起點 PlanNode to = PlanNode.withLocation(new LatLng(40.065796,116.349868));// 建立終點 transitOption.from(from); transitOption.to(to); transitOption.city("北京");//公交換乘只能在一個城市中,不能跨城市 transitOption.policy(TransitPolicy.EBUS_WALK_FIRST);//公交檢索策略常量:最少步行距離 routePlanSearch.transitSearch(transitOption); routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() { @Override public void onGetWalkingRouteResult(WalkingRouteResult arg0) { } @Override public void onGetTransitRouteResult(TransitRouteResult result) { if (result == null || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) { Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show(); return; } TransitRouteOverlay overlay = new TransitRouteOverlay(baiduMap); baiduMap.setOnMarkerClickListener(overlay); overlay.setData(result.getRouteLines().get(0)); overlay.addToMap(); overlay.zoomToSpan(); } @Override public void onGetDrivingRouteResult(DrivingRouteResult arg0) { } }); } class MyDrivingOverlay extends DrivingRouteOverlay{ public MyDrivingOverlay(BaiduMap arg0) { super(arg0); } @Override public BitmapDescriptor getStartMarker() { //覆寫此方法以改變默認起點圖標 return BitmapDescriptorFactory.fromResource(R.drawable.icon_st); } @Override public BitmapDescriptor getTerminalMarker() { //覆寫此方法以改變默認終點圖標 return BitmapDescriptorFactory.fromResource(R.drawable.icon_en); } } } 
  • 規劃結果

7、地址解析服務

GeoCoder.geocode(GeoCodeOption option)
根據地址名獲取地址信息 異步函數,返回結果在OnGetGeoCoderResultListener裏的onGetGeoCodeResult方法通知
GeoCoder.reverseGeoCode(ReverseGeoCodeOption option)
根據地理座標點獲取地址信息 異步函數,返回結果在OnGetGeoCoderResultListener裏的onGetReverseGeoCodeResult方法通知

8、聯想詞檢索

SuggestionSearch . requestSuggestion(SuggestionSearchOption option)
查詢一系列與指定key相關的內容,結果中包括城市及包含key的名稱
結果處理OnGetSuggestionResultListener . onGetSuggestionResult(SuggestionResult result)

9、定位

在百度地圖移動版API中,提供一個重要的特點功能:定位,經過這個功能,能獲取到用戶當前所在位置。
在程序中,若是使用此功能,必須註冊GPS和網絡的使用權限。
在獲取用戶位置時,優先使用GPS進行定位;若是GPS定位沒有打開或者沒有可用位置信息,則會經過判斷網絡是否鏈接(即確認手機是否能上網,不管是鏈接 2G/3G或Wi-Fi網絡),若是是,則經過請求百度網絡定位服務,返回網絡定位結果。爲了使得到的網絡定位結果更加精確,請打開手機的Wi-Fi開 關。
目前系統自帶的網絡定位服務精度低,且服務不穩定、精度低,而且從將來的趨勢看,基站定位是不可控的(移動公司隨時可能更改基站編號以壟判定位服務),而 Wi-Fi定位則否則,它是一種精度更高、不受管制的定位方法。國內其它使用Wi-Fi定位的地圖軟件,Wi-Fi定位基本不可用,百度的定位服務量化指 標優秀,網絡接口返回速度快(服務端每次定位響應時間50毫秒之內),平均精度70米,其中Wi-Fi精度40米左右,基站定位精度200米左右,覆蓋率 98%,在國內處於一枝獨秀的地位。
注意
關於經緯度的說明:該經緯度信息是通過加密處理,因此在其它地圖工具中測得的經緯度 信息不適合百度的座標系統。
使用百度經緯度座標,能夠經過http://api.map.baidu.com/lbsapi/getpoint/index.html查詢地理座標若是須要在百度地圖上顯示使用其餘座標系統的位置,請發郵件至mapapi@baidu.com申請座標轉換接口http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v5-0

/** * 定位 * * @author mwp * */ public class LocationDemo extends BaseActivity { private LocationClient locationClient; private BitmapDescriptor geo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); lacate(); } private void lacate() { locationClient = new LocationClient(getApplicationContext()); LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationMode.Hight_Accuracy);// 設置定位模式 option.setCoorType("bd0911");// 返回的定位結果是百度經緯度,默認值gcj02 option.setScanSpan(5000);// 設置發起定位請求的間隔時間爲5000ms option.setIsNeedAddress(true);// 返回的定位結果包含地址信息 option.setNeedDeviceDirect(true);// 返回的定位結果包含手機機頭的方向 locationClient.setLocOption(option); locationClient.registerLocationListener(new BDLocationListener() { @Override public void onReceiveLocation(BDLocation result) { if (result != null) { MyLocationData data = new MyLocationData.Builder() .latitude(result.getLatitude()) .longitude(result.getLongitude()).build(); baiduMap.setMyLocationData(data); } } }); geo = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo); MyLocationConfiguration configuration = new MyLocationConfiguration( MyLocationConfiguration.LocationMode.FOLLOWING, true, geo); baiduMap.setMyLocationConfigeration(configuration);// 設置定位模式 baiduMap.setMyLocationEnabled(true);// 打開定位圖層 } @Override protected void onStart() { locationClient.start(); super.onStart(); } @Override protected void onPause() { locationClient.stop(); super.onPause(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_1: //正常 baiduMap.setMyLocationConfigeration(new MyLocationConfiguration( MyLocationConfiguration.LocationMode.NORMAL, true, geo)); break; case KeyEvent.KEYCODE_2: //羅盤 baiduMap.setMyLocationConfigeration(new MyLocationConfiguration( MyLocationConfiguration.LocationMode.COMPASS, true, geo)); break; case KeyEvent.KEYCODE_3: //跟隨 baiduMap.setMyLocationConfigeration(new MyLocationConfiguration( MyLocationConfiguration.LocationMode.FOLLOWING, true, geo)); break; default: break; } return super.onKeyDown(keyCode, event); } } 

10、離線地圖

離線文件下載
http://shouji.baidu.com/map/map.html?from=3052,指定機型和城市下載對應的離線地圖

  • 2.0以上版本處理步驟
  • 將下載好的離線地圖包解壓縮。
  • 找到解壓出的"BaiduMap"文件夾,把它放入手機存儲卡根目錄。在上述過程當中如遇提示「是否須要覆蓋文件」,點擊肯定便可。
  • 斷開與電腦鏈接,打開百度手機地圖(如已打開請重啓),系統會提示導入成功。
  • 提示:下載多個城市包時,經解壓後,這些城市數據都會被同時解壓到BaiduMap文件夾中,不一樣城市不會出現被覆蓋的狀況。
  • 1.X版本處理步驟
  • 將離線地圖加壓,把Mapdata文件夾拷入SD卡根目錄下的BaiduMapSdk下
  • 利用MKOfflineMap在初始化(init)後調用scan()掃描本地地圖資源
/** 離線地圖初始化 **/ mOffline = new MKOfflineMap(); mOffline.init(mBMapMan, new MKOfflineMapListener() { public void onGetOfflineMapState(int type, int state) { switch (type) { case MKOfflineMap.TYPE_DOWNLOAD_UPDATE: { MKOLUpdateElement update = mOffline.getUpdateInfo(state); //mText.setText(String.format("%s : %d%%", update.cityName, update.ratio)); } break; case MKOfflineMap.TYPE_NEW_OFFLINE: Log.d("OfflineDemo", String.format("add offlinemapnum:%d", state)); break; case MKOfflineMap.TYPE_VER_UPDATE: Log.d("OfflineDemo", String.format("new offlinemapver")); break; } } } ); /** 離線地圖導入離線包 **/ intnum = mOffline.scan();
相關文章
相關標籤/搜索