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>
–地址: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所使用資源,開發者可根據實際需求自行添加。
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();
}
}
控制管理BaiduMapbaiduMap= mapView.getMap();
double latitude = 40.050966;//緯度
double longitude = 116.303128;//經度
LatLnghmPos= new LatLng(latitude,longitude);
zoomOut()—縮小;zoomIn()—放大;zoomTo(float)—指 定縮放級別;zoomBy(float)—按增量縮放級別;
設置地圖單擊事件監聽者
setOnMarkerClickListener(BaiduMap.OnMarkerClickListener listener)設置地圖Marker 覆蓋物點擊事件監聽者
setOnMapDoubleClickListener(BaiduMap.OnMapDoubleClickListener listener)
設置地圖雙擊事件監聽者
snapshot(BaiduMap.SnapshotReadyCallback callback)
發起截圖請求
5、百度地圖加強覆蓋物的層級壓蓋關係,具體如下(從下至上的順序):
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、覆蓋物添加覆蓋物
overlay.setData(result);
overlay.addToMap();
overlay.zoomToSpan();
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、搜索
RoutePlanSearch和OnGetRoutePlanResultListener
0:普通點 1:公交站 2:公交線路 3:地鐵站 4:地鐵線路,
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);
}
離線地圖:
/** 離線地圖初始化 **/ 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();