這篇博客我會詳細介紹百度地圖定位的使用,很多人在使用百度地圖定位的時候會出現各種各樣的問題,例如無法定位,定位總是和實際距離偏差很大等。那麼如何避免這些問題的出現,或者說如何優化呢?帶着問題看我這篇博客,多多少少會對你有些啓示的。
使用百度定位需要一個定位包,在上一篇博客中已經做過介紹如何導入,要是不瞭解可以看這篇博客android百度地圖使用一這裏不再贅述。在使用百度定位的時候,首先我們要對百度定位有一個基本瞭解,請看下圖:
在這裏我們得到這麼幾點信息:百度地圖gps定位精度最高,影響因素主要是手機硬件,其次是wifi定位,最後是基站定位。關於gps定位還要說一點的是,這個還取決與手機搜到的衛星數,低於3顆無法完成定位,這也是有的人在使用百度定位的時候無法定位的原因之一。百度地圖每次定位耗費流量0.3k/次,這裏要注意了,定位的時候不光是耗費流量,而且還很耗費電量,因爲百度是在後臺開啓的服務,這就導致了app性能很差。
在開始使用百度定位的時候要了解一下幾個類:
**1. LocationClient 定位服務客戶端,負責開啓和結束服務等,只能在主線程中調用。子線程調用無效
2. LocationClientOption,百度定位客戶端參數設置
3. BDLocationListener,定位回到監聽
4. BDLocation,定位回調的信息,包括經緯度等**
根據上面各個類的作用,我們就可以總結出百度定位的使用步驟了。
第一步:配置客戶端
public void initLocation(){
//初始化客戶端
mLocClient = new LocationClient(this.getApplication());
//註冊監聽回調
mLocClient.registerLocationListener(this);
//配置客戶端參數
LocationClientOption option = new LocationClientOption();
//可選,默認高精度,設置定位模式,高精度,低功耗,僅設備
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
option.setOpenGps(true);//打開gps
option.setAddrType("all");
option.setCoorType("bd09ll");//設置座標類型
option.setScanSpan(1000);
option.setIsNeedAddress(true);//可選,設置是否需要地址信息,默認不需要
option.setLocationNotify(true);//可選,默認false,設置是否當gps有效時按照1S1次頻率輸出GPS結果
option.setIgnoreKillProcess(false);//可選,默認false,定位SDK內部是一個SERVICE,並放到了獨立進程,設置是否在stop的時候殺死這個進程,默認殺死
option.SetIgnoreCacheException(false);//可選,默認false,設置是否收集CRASH信息,默認收集
//易引發異常
mLocClient.setLocOption(option);
mLocClient.start();
}
百度支持三種類行的座標bd09ll(百度座標)、84座標(大地座標)、gcj02(火星座標)在座標時不要使用84或者火星座標,這也是定位不準確的原因之一。
@Override
public void onReceiveLocation(BDLocation bdLocation) {
MyLocationData data = new MyLocationData.Builder()
.accuracy(bdLocation.getRadius())
//此處設置開發者獲取到的方向信息,順時針0-360 .direction(bdLocation.getDirection()).latitude( bdLocation.getLatitude()) .longitude(bdLocation.getLongitude()).build();
mBaiduMap.setMyLocationData(data);
}
MyLocationData這個類可以設置我們定位圖層的信息,但是有的人會說,我明明設置了定位圖層信息,但是地圖上並沒有顯示,這是因爲你忘記了最重要的一步,開啓定位圖層。 mBaiduMap.setMyLocationEnabled(true);
在定位回調的時候,有時候會因爲定位失敗而定到非洲去啦,這個怎麼辦呢?好在百度定位提供了一個判斷定位是否在國內的方法。所以只需要在定位回調加上如下代碼即可避免這個問題。
if (location == null && location.getLocationWhere() != BDLocation.LOCATION_WHERE_IN_CN) {
return;
}
因爲定位是非常耗電的,所以在若app不需要時時獲取位置信息,可以在定一次定位成功的時候調用LocationClient的stop方法來停止定位。在頁面銷燬的時候,我們還要關閉定位圖層。所以在activity的ondestory()方法裏要加上如下代碼:
@Override
protected void onDestroy() {
super.onDestroy();
// unregisterReceiver(receiver);
mLocClient.stop();
mLocClient = null;
mBaiduMap.setMyLocationEnabled(false);
map.onDestroy();
}
以上就是百度地圖定位的使用了,最後說一點,之前有一個朋友想使用百度定位圖層的那個圖標,但是不想開啓定位,這個怎麼辦呢?很簡單MyLocationData這個類也可以單獨拿出來使用,只需要將經緯度設置好就行了。