天天看點

百度地圖:加強篇(定位)

1、實作目的:

MyLocationOverlay

一個負責顯示使用者目前位置的Overlay。

自2.0.0版本開始,MyLocationOverlay隻負責顯示我的位置,位置資料請使用百度定位SDK擷取,将擷取的位置資料放在一個LocationData結構中并用該結構設定MyLcationOverlay的資料源,即可建立MyLocationOverlay。

LocationData資料擷取

建立監聽器:當擷取到位置資訊時,将資訊添加到LocationData中,監聽器需要實作BDLocationListener接口,

兩個方法需要實作:

1.接收異步傳回的定位結果,參數是BDLocation類型參數。

2.接收異步傳回的POI查詢結果,參數是BDLocation類型參數。

監聽的設定:

建立LocationClient對象,注冊監聽registerLocationListener

設定定位參數(LocationClientOption):定位模式(單次定位,定時定位),傳回坐标類型,是否打開GPS等等。

通過LocationClient的start、stop控制定位資訊擷取,在做中間可以手動發起定位的請求requestLocation

前期準備:

離線檔案下載下傳,指定機型和城市下載下傳對應的離線地圖

2.0以上版本處理步驟

1、将下載下傳好的離線地圖包解壓縮。

2、找到解壓出的”BaiduMap”檔案夾,把它放入手機存儲卡根目錄。在上述過程中如遇提示“是否需要覆寫檔案”,點選确定即可。

斷開與電腦連接配接,打開百度手機地圖(如已打開請重新開機),系統會提示導入成功。

提示:下載下傳多個城市包時,經解壓後,這些城市資料都會被同時解壓到BaiduMap檔案夾中,不同城市不會出現被覆寫的情況。

1.X版本處理步驟

1、将離線地圖加壓,把Mapdata檔案夾拷入SD卡根目錄下的BaiduMapSdk下

2、利用MKOfflineMap在初始化(init)後調用scan()掃描本地地圖資源。

實作過程:

百度開發者中心的相關文檔http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/getloc

實作效果:

百度地圖:加強篇(定位)

MyLocationOverlayDemo .java

package huaxa.it.map;

import android.os.Bundle;
import android.os.Handler;
import android.util.Log;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.LocationData;
import com.baidu.mapapi.map.MyLocationOverlay;
import com.baidu.platform.comapi.basestruct.GeoPoint;

/**
 * @項目名: BaiduMap
 * @包名: huaxa.it.map
 * @類名: MyLocationOverlayDemo
 * @建立者: 黃夏蓮
 * @建立時間: 2016年12月3日 ,下午2:32:14
 * 
 * @描述: TODO
 */
public class MyLocationOverlayDemo extends BaseActivity
{

    public LocationClient       mLocationClient;
    public BDLocationListener   myListener;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        location();
    }

    private void location()
    {
        // ①發起定位請求
        mLocationClient = new LocationClient(getApplicationContext()); // 聲明LocationClient類
        // ②參數設定
        LocationClientOption option = new LocationClientOption();
        option.setCoorType("bd09ll");// 可選,預設gcj02,設定傳回的定位結果坐标系
        int span = ;
        option.setScanSpan(span);// 可選,預設0,即僅定位一次,設定發起定位請求的間隔需要大于等于1000ms才是有效的
        option.setOpenGps(true);// 可選,預設false,設定是否使用gps
        option.setLocationNotify(true);// 可選,預設false,設定是否當GPS有效時按照1S/1次頻率輸出GPS結果
        mLocationClient.setLocOption(option);
        // MyLocationClient myLocationClient = new MyLocationClient();
        // myLocationClient.start();
        myListener = new MyListener();
        mLocationClient.registerLocationListener(myListener); // 注冊監聽函數
        // ③設定響應,結果處理

    }

    // class MyLocationClient extends Handler implements Runnable
    // {
    //
    // @Override
    // public void run()
    // {
    // // ②參數設定
    // LocationClientOption option = new LocationClientOption();
    // option.setCoorType("bd09ll");// 可選,預設gcj02,設定傳回的定位結果坐标系
    // int span = 1000;
    // option.setScanSpan(span);// 可選,預設0,即僅定位一次,設定發起定位請求的間隔需要大于等于1000ms才是有效的
    // option.setOpenGps(true);// 可選,預設false,設定是否使用gps
    // option.setLocationNotify(true);// 可選,預設false,設定是否當GPS有效時按照1S/1次頻率輸出GPS結果
    // mLocationClient.setLocOption(option);
    //
    // post(this);
    //
    // }
    //
    // public void start()
    // {
    // post(this);
    //
    // }
    //
    // }

    class MyListener implements BDLocationListener
    {

        @Override
        public void onReceiveLocation(BDLocation location)
        {
            if (location == null)
                return;
            MyLocationOverlay overlay = new MyLocationOverlay(mapView);
            LocationData locData = new LocationData();
            locData.latitude = location.getLatitude();
            locData.longitude = location.getLongitude();
            overlay.setData(locData);
            mapView.getOverlays().clear();
            mapView.getOverlays().add(overlay);
            mapView.refresh();
            // 地圖移動
            controller.animateTo(new GeoPoint(
                    (int) (locData.latitude*),(int)(locData.longitude*))); 
        }

        @Override
        public void onReceivePoi(BDLocation location)
        {

        }

    }

    /**
     * GPS很耗費資源,為了減少資源
     */
    @Override
    protected void onResume()
    {
        // TODO Auto-generated method stub
        super.onResume();
        mLocationClient.start();
    }

    @Override
    protected void onPause()
    {
        // TODO Auto-generated method stub
        super.onPause();
        mLocationClient.stop();
    }

}