Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 百度地圖API

百度地圖API

編輯:關於Android編程

1、什麼是百度地圖API?

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

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

2、百度地圖的三大核心

SDKInitialzer 、 MapView 、 BaiduMap

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

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

需要的權限:

"android.permission.ACCESS_COARSE_LOCATION">

"android.permission.ACCESS_FINE_LOCATION">

"android.permission.ACCESS_WIFI_STATE">

"android.permission.ACCESS_NETWORK_STATE">

"android.permission.CHANGE_WIFI_STATE">

"android.permission.READ_PHONE_STATE">

"android.permission.WRITE_EXTERNAL_STORAGE">

"android.permission.INTERNET"/>

"android.permission.MOUNT_UNMOUNT_FILESYSTEMS">

"android.permission.READ_LOGS">
獲取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、自定義View(MapView.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 (intpolicy) 來設置駕車路線規劃策略 –結果處理:OnGetRoutePlanResultListener. onGetDrivingRouteResult(DrivingRouteResult result)   ?步行路線查詢 ?結果展示: WalkingRouteOverlay –RoutePlanSearch. walkingSearch步行路線搜索. –結果處理: OnGetRoutePlanResultListener. onGetWalkingRouteResult(WalkingRouteResult result)   換乘路線: ?僅公交路線搜索 ?結果展示:TransitRouteOverlay ?檢索:RoutePlanSearch. transitSearch ?通過TransitRoutePlanOption.policy (intpolicy) 設置路線規劃策略 ?結果處理: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();

 

 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved