百度地圖API

1、什麼是百度地圖API?

百度地圖移動版API(Android)是一套基於Android設備的應用程序接口,通過該接口,可以輕鬆訪問百度服務和數據,構建功能豐富、交互性強的地圖應用程序。

百度地圖移動版API不僅包含構建地圖的基本接口,還提供了本地搜索、路線規劃、地圖定位等數據服務。

2、百度地圖的三大核心

SDKInitialzer   、  MapView  、  BaiduMap

3、百度地圖使用的準備工作

①獲取API Key    ②建立工程   ③添加地圖引擎到Android工程中  ④添加權限   ⑤初始化地圖引擎   ⑥引入佈局(地圖控件)

需要的權限:

<!--這個權限用於進行網絡定位-->

<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>

<!--這個權限用於訪問GPS定位-->

<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

<!--用於訪問wifi網絡信息,wifi信息會用於進行網絡定位-->

<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>

<!--獲取運營商信息,用於支持提供運營商信息相關的接口-->

<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

<!--這個權限用於獲取wifi的獲取權限,wifi信息會用來進行網絡定位-->

<uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>

<!--用於讀取手機當前的狀態-->

<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"></uses-permission>

<!--寫入擴展存儲,向擴展卡寫入數據,用於寫入離線定位數據-->

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

<!--訪問網絡,網絡定位需要上網-->

<uses-permissionandroid:name="android.permission.INTERNET"/>

<!--SD卡讀取權限,用戶寫入離線定位數據-->

<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>

<!--允許應用讀取低級別的系統日誌文件 -->

<uses-permissionandroid:name="android.permission.READ_LOGS"></uses-permission>

獲取APIKey
–地址:http://developer.baidu.com/map/android-mobile-apply-key.htm
添加引擎到Andoid工程中
–添加jar包: baidumapapi_v3_3_0.jar和locSDK_5.0.jar
–添加.so文件:拷貝libBaiduMapSDK_v3_3_0_15.so、liblocSDK5.so到libs\armeabi目錄下
–注:locSDK_5.0.jar和liblocSDK5.so爲百度定位SDK所使用資源,開發者可根據實際需求自行添加。
4、HelloWorld
 
增加權限重點是處理位置信息權限
Layout中添加MapView控件用於展示地圖
創建管理工具,並初使化
SDKInitializer在initialize時校驗key(permission check error)和網絡狀態(network error),關於狀態碼信息我們可以在SDKInitiali zer查詢
注意:
控制MapView的onResume、onPause、onDestroy ;
SDKInitializer對象創建一個就可以;
必須校驗key,並且key值不能爲空;
Initialize方法接受的參數必須是global Application,不能傳遞Activity。

IntentFilterfilter = newIntentFilter();

filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);

filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);

registerReceiver(receiver,filter);

public void onReceive(Contextcontext,Intent intent) {

Stringresult = intent.getAction();

//判斷網絡

if (result .equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)){

Toast.makeText(getApplicationContext(),"無網絡",0).show();

}

//授權驗證

else if (result.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)){

Toast.makeText(getApplicationContext(),"授權失敗",0).show();

}

}

控制管理
–通過MapView設置縮放控件showZoomControls(false),默認顯示
縮放級別:V2.0之前支持(3-18),V2.0之後多一級(3-19)
默認的縮放級別12
–設置地圖的中心位置

BaiduMapbaiduMap= mapView.getMap();

double latitude = 40.050966;//緯度

double longitude = 116.303128;//經度

LatLnghmPos= new LatLng(latitude,longitude);

BaiduMap:控制地圖移動、縮放、旋轉
–動畫形式移動:animateMapStatus(MapStatusUpdate)
–縮放:MapStatusUpdateFactory:

  zoomOut()—縮小;zoomIn()—放大;zoomTo(float)—指  定縮放級別;zoomBy(float)—按增量縮放級別;

–旋轉:MapStatus
水平方向:rotate(float),旋轉角範圍: 0~ 360 ,單位:度  默認值爲0度,逆時針旋轉爲角度增大方向,通過BaiduMap的getM apStatus() .rotate獲取當前角度
俯視:overlook(float) ,俯角範圍: -45 ~ 0 , 單位:度
–指南針設置:UiSettings().setCompassPosition(new Point(x, y)),座標系原點爲MapView左上頂點 ,指南針在3D模式下自動 顯現,隱藏指南針UiSettings().setCompassEnabled(false)
BaiduMap:處理地圖事件
–setOnMapClickListener(BaiduMap.OnMapClickListenerlistener)

      設置地圖單擊事件監聽者

  setOnMarkerClickListener(BaiduMap.OnMarkerClickListener listener)設置地圖Marker 覆蓋物點擊事件監聽者

  setOnMapDoubleClickListener(BaiduMap.OnMapDoubleClickListener listener)

  設置地圖雙擊事件監聽者

  snapshot(BaiduMap.SnapshotReadyCallback callback)

  發起截圖請求

5、百度地圖加強
1、地圖圖層 2、覆蓋物 3、搜索 4、離線地圖
5.1、地圖圖層
•什麼是地圖圖層
–地圖可以包含一個或多個圖層,每個圖層在每個級別都是由若干個圖塊組成的,它們覆蓋了地圖的整個表面。例如您所看到 包括街道、興趣點、學校、公園等內容的地圖展現就是一個圖層,另外交通流量的展現也是通過圖層來實現的。
•圖層分類
–底圖
•基本的地圖圖層,包括若干個縮放級別,顯示基本的地圖信息,包括道路、街道、學校、公園等內容。
–實時交通信息圖:baiduMap.setTrafficEnabled(true)
–衛星圖:  baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE)
•衛星地圖是衛星拍攝的真實的地理面貌,所以衛星地圖可用來檢測地面的信息,你可以瞭解到地理位置,地形等。 

覆蓋物的層級壓蓋關係,具體如下(從下至上的順序):

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、自定義ViewMapView.addView(View););

5.2、覆蓋物

•所有疊加或覆蓋到地圖的內容,我們統稱爲地圖覆蓋物。如標註、矢量圖形元素(包括:折線和多邊形和圓)、定位圖標等。覆 蓋物擁有自己的地理座標,當您拖動或縮放地圖時,它們會相應的處理。
•覆蓋物包括:本地覆蓋物和搜索覆蓋物
–本地覆蓋物的抽象基類:OverlayOptions(核心類
–圓形覆蓋物:CircleOptions
–文字覆蓋物:TextOptions
–marker覆蓋物: MarkerOptions
–圓點覆蓋物:DotOptions
–ground 覆蓋物:GroundOverlayOptions
–圓點覆蓋物:DotOptions
–多邊形覆蓋物:PolygonOptions
–折線覆蓋物:PolylineOptions
–弧線覆蓋物:ArcOptions
添加覆蓋物:baiduMap.addOverlay(ooCircle);

–搜索覆蓋物抽象類: OverlayManager (核心類
–本地搜索覆蓋物:PoiOverlay
–駕車路線覆蓋物:DrivingRouteOverlay
–步行路線覆蓋物:WalkingRouteOverlay
–換乘路線覆蓋物:TransitOverlay
–公交路線覆蓋物:BusLineOverlay

添加覆蓋物

overlay.setData(result);

overlay.addToMap();

overlay.zoomToSpan();


CircleOptions繪製步驟:

–創建圓形: CircleOptions() 。
–設置圓心座標:center(LatLngcenter)
–設置圓填充顏色:fillColor(int color) ,16進制如:#00ff0000 透明、紅、綠、藍
–設置圓半徑:radius(intradius)
–設置圓邊框信息:stroke(Strokestroke)
–設置圓是否可見:visible(booleanvisible)
–設置圓zIndex(顯示優先級)信息:zIndex(int zIndex),值越大優先級越高

TextOptions繪製步驟:

–創建文字覆蓋物對象, TextOptions()
–設置文字覆蓋物地理座標:position(LatLng position)
–設置文字覆蓋物旋轉角度,逆時針:rotate(float rotate)
–設置文字覆蓋物的文字內容:text(java.lang.String text)
–設置文字覆蓋物字體:typeface(Typefacetypeface)
–設置文字覆蓋物可見性:visible(booleanvisible)
–設置文字覆蓋物 zIndex:zIndex(int zIndex)
–設置文字覆蓋物對齊方式,默認居中對齊:align(int alignX, int alignY)
–設置文字覆蓋物背景顏色:bgColor(intbgColor)
–設置文字覆蓋物額外信息:extraInfo(BundleextraInfo)
–設置文字覆蓋物字體顏色,默認黑色:fontColor(intcolor)
–設置文字覆蓋物字體大小:fontSize(intsize)

MarkerOptions:

某個類型的覆蓋物,包含多個類型相同、顯示方式相同、處理方式相同的項時,使用此類。或者用來標記位置。
開發步驟
–設置 marker覆蓋物的位置座標:position(LatLngposition)
–設置 marker覆蓋物的標題:title(java.lang.String title)
–設置 Marker覆蓋物的圖標:icon(BitmapDescriptor icon)
–設置 marker是否允許拖拽,默認不可拖拽:draggable(booleandraggable)

option= newMarkerOptions().title("向北")

.position(newLatLng(latitude+ 0.001, longitude)).icon(bitmap);

baiduMap.addOverlay(option);

option= newMarkerOptions().title("向東")

.position(newLatLng(latitude,longitude + 0.001)).icon(bitmap);

baiduMap.addOverlay(option);

option= newMarkerOptions().title("向西南")

.position(newLatLng(latitude- 0.001, longitude - 0.001))

.icon(bitmap);

baiduMap.addOverlay(option);

5.3、搜索

百度地圖移動版API集成搜索服務包括:
位置檢索、周邊檢索、範圍檢索、公交檢索、駕乘檢索、步行檢索
核心類: PoiSearch和OnGetPoiSearchResultListener

         RoutePlanSearch和OnGetRoutePlanResultListener

實現思路:
–初始化PoiSearch類,通過setOnGetPoiSearchResultListener方法註冊搜索結果的監聽對象OnGetPoiSearchResultListener ,實現異步搜索服務。
–通過自定義MySearchListener實現類,處理不同的回調方法,獲得搜索結果。
–注意,OnGetPoiSearchResultListener只支持一個,以最後一次設置爲準
結合覆蓋物展示搜索:
–本地搜索覆蓋物:PoiOverlay
–駕車路線覆蓋物:DrivingRouteOverlay
–步行路線覆蓋物:WalkingRouteOverlay
–換乘路線覆蓋物:TransitOverlay
本地搜索:
•POI(Pointof Interest興趣點)搜索有三種方式
–根據範圍和檢索詞發起範圍檢索searchInBound
–周邊檢索searchNearby
–城市poi檢索searchInCity
–poi詳細信息檢索 searchPoiDetail
•結果的展示: PoiOverlay
•查詢加油站信息
–多種查詢方法,但結果的處理都在OnGetPoiSearchResultListener的onGetPoiResult方法中
–處理步驟:
•判斷服務器結果返回
•創建poi覆蓋物
•將服務器返回數據添加到poi覆蓋物中
•添加覆蓋物到地圖addToMap
•縮放地圖,使所有Overlay都在合適的視野內
注意
–POI檢索結果每頁容量默認情況下爲10,可以通過pageCapacity設置,支持1-50(10)
–翻頁功能重新調用通過PoiSearch類的searchInXxx()方法並傳遞頁數角標pageNum來實現,該方法是異步函數,搜索成功 後會調用註冊的事件處理函數onGetPoiResult 返回查詢頁的結果。

路線搜索:

駕車路線查詢
•結果展示: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)

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

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

公交路線詳細信息搜索:

•檢索:BusLineSearch. searchBusLine(BusLineSearchOption option)
•busLineUid信息獲取:公交線路的uid,可以通過poi查詢返回的結果中獲取MKPoiInfo的uid。
–使用poiSearchInCity查詢公交線信息,利用PoiInfo的type可以判斷poi類型,當類型爲公交線路時,記錄當前的PoiInfo中的ui d信息。
–利用獲取的uid信息進行公交線的查詢
–結果處理:在OnGetBusLineSearchResultListener. onGetBusLineResult(BusLineResult result)中進行結果的處理,此時使用 到的覆蓋物是BusLineOverlay

0:普通點 1:公交站 2:公交線路 3:地鐵站 4:地鐵線路


定位:
•LocationClient和BDLocationListener
•首先需要打開定位圖層BaiduMap.setMyLocationEnabled(true);
•設置監聽器LocationClient. registerLocationListener(BDLocationListener)
•設置定位模式baiduMap.setLocationMode(LocationMode)
Hight_Accuracy,高精度定位模式:這種定位模式下,會同時使用網絡定位和GPS定位,優先返回最高精度的定位結果;
Battery_Saving,低功耗定位模式:這種定位模式下,不會使用GPS,只會使用網絡定位(Wi-Fi和基站定位)
Device_Sensors,僅用設備定位模式:這種定位模式下,不需要連接網絡,只使用GPS進行定位,這種模式下不支持室 內環境的定位
•設置定位顯示模式BaiduMap.setMyLocationConfigeration(MyLocationConfiguration)
•定位數據獲取:在BDLocationListener. onReceiveLocation(BDLocation result)方法中設置定位數據,

  baiduMap.setMyLocationData(MyLocationData);


在百度地圖移動版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查詢地理座標如果需要在百度地圖上顯示使用其他座標系統的位置,請發郵件至[email protected]申請座標轉換接口

http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v5-0

mLocationClient = newLocationClient(getApplicationContext());

myListener = newMylocationListener();

mLocationClient.registerLocationListener(myListener);

LocationClientOptionoption = newLocationClientOption();

option.setLocationMode(LocationMode.Hight_Accuracy);//設置定位模式

option.setCoorType("bd09ll");//返回的定位結果是百度經緯度,默認值gcj02

option.setScanSpan(5000);//設置發起定位請求的間隔時間爲5000ms

option.setIsNeedAddress(true);//返回的定位結果包含地址信息

option.setNeedDeviceDirect(true);//返回的定位結果包含手機機頭的方向

mLocationClient.setLocOption(option);

baiduMap.setMyLocationEnabled(true);

baiduMap.setMyLocationConfigeration(newMyLocationConfiguration(

MyLocationConfiguration.LocationMode.COMPASS,true,

BitmapDescriptorFactory.fromResource(R.drawable.icon_geo)));

public void onReceiveLocation(BDLocationresult) {

if (result != null) {

double latitude2 = result.getLatitude();

double longitude2 = result.getLongitude();

MyLocationData data= newMyLocationData.Builder()

.latitude(latitude2).longitude(longitude2).build();

baiduMap.setMyLocationData(data);

}

}

}

@Override

public booleanonKeyDown(intkeyCode,KeyEventevent) {

switch (keyCode){

case KeyEvent.KEYCODE_1:

baiduMap.setMyLocationConfigeration(newMyLocationConfiguration(

MyLocationConfiguration.LocationMode.NORMAL,true,

BitmapDescriptorFactory.fromResource(R.drawable.icon_geo)));

break;


case KeyEvent.KEYCODE_2:

baiduMap.setMyLocationConfigeration(newMyLocationConfiguration(

MyLocationConfiguration.LocationMode.COMPASS,true,

BitmapDescriptorFactory.fromResource(R.drawable.icon_geo)));

break;


case KeyEvent.KEYCODE_3:

baiduMap.setMyLocationConfigeration(newMyLocationConfiguration(

MyLocationConfiguration.LocationMode.FOLLOWING,true,

BitmapDescriptorFactory.fromResource(R.drawable.icon_geo)));

break;

default:

break;

}

return super.onKeyDown(keyCode,event);

}


離線地圖:

•離線文件下載
–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, newMKOfflineMapListener() {

             public void onGetOfflineMapState(inttype, intstate) {

                 switch (type) {

                 case MKOfflineMap.TYPE_DOWNLOAD_UPDATE:

                      {

                          MKOLUpdateElementupdate = mOffline.getUpdateInfo(state);

                          //mText.setText(String.format("%s: %d%%", update.cityName, update.ratio));

                      }

                      break;

                 case MKOfflineMap.TYPE_NEW_OFFLINE:

                      Log.d("OfflineDemo",String.format("addofflinemap num:%d",state));

                      break;

                 case MKOfflineMap.TYPE_VER_UPDATE:

                             Log.d("OfflineDemo",String.format("newofflinemap ver"));

                      break;

                }   

                    }

         }

         );

         /** 離線地圖導入離線包**/

          int num = mOffline.scan();




發佈了8 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章