天天看點

Android 之 高德地圖學習 二 定位

自己做的筆記,沒有深層的東西,請大神繞行~

這篇說說定位,同樣少不了官方文檔和Demo~

其實就是看官方的東西然後自己打一遍,了解一遍,貌似沒啥深層的東西,畢竟我們會用就行了嘛~

學定位之前先學學怎麼移動我們的視圖(我們看見的區域)。

AMap官方介紹是定義AMap 地圖對象的操作方法與接口。我們去看這個類有這樣的幾個方法 :

void

moveCamera(CameraUpdate update)

按照傳入的CameraUpdate 參數移動可視區域。

這個是直接跳到目标位置,沒有動畫.

void

animateCamera(CameraUpdate update)

可視區域動畫是指從目前可視區域轉換到一個指定位置的可視區域的過程。

void

animateCamera(CameraUpdate update, AMap.CancelableCallback paramCancelableCallback)

可視區域動畫是指從目前可視區域轉換到一個指定位置的可視區域的過程,在轉換完成後, 将回調轉入的AMap.CancelableCallback接口。

void

animateCamera(CameraUpdate update, long durationMs, AMap.CancelableCallback paramCancelableCallback)

在指定的持續時間内,動畫地移動地圖到指定的位置,完成時調用可選的回調方法。

第一個是直接跳轉到目标位置有動畫;第二個是跳轉到目标位置有動畫傳回調接口;第三個是可以設定移動時間去移動到目标位置。

怎麼用呢,很簡單啊aMap.moveCamera(update);就可以了。

那麼CameraUpdate對象是什麼呢?

我們去看CameraUpdate :定義了一個可視區域的移動。這個類對象在使用者改變可視區域的時候被調用。如moveCamera(CameraUpdate)。使用CameraUpdateFactory 類可以構造CameraUpdate 對象。

 好吧,工廠模式麼?那我們去看CameraUpdateFactory 類:這是類是建立CameraUpdate對象的工廠類。

看下方法:

static CameraUpdate

changeLatLng(LatLng latLng)

傳回一個CameraUpdate對象,隻改變地圖可視區域中心點,地圖縮放級别不變。

static CameraUpdate

newCameraPosition(CameraPosition cameraPosition)

傳回一個定義了可視區域移動位置CameraUpdate 對象。

static CameraUpdate

newLatLng(LatLng latLng)

傳回一個移動目的地的螢幕中心點的經緯度的CameraUpdate 對象。

static CameraUpdate

newLatLngBounds(LatLngBounds bounds, int padding)

傳回CameraUpdate對象,這個對象包含一個經緯度限制的區域,并且是最大可能的縮放級别。

static CameraUpdate

newLatLngBounds(LatLngBounds bounds, int width, int height, int padding)

傳回CameraUpdate對象,這個對象包含一個經緯度限制的區域這個區域将會放置在螢幕中間, 并且是最大可能的縮放級别。

static CameraUpdate

newLatLngZoom(LatLng latLng, float zoom)

傳回一個CameraUpdate 對象,包括可視區域框移動目标點螢幕中心位置的經緯度以及縮放級别。

static CameraUpdate

scrollBy(float xPixel, float yPixel)

傳回一個CameraUpdate 對象,此對象為改變可視區域的中心的值,機關像素。

static CameraUpdate

zoomBy(float amount)

傳回一個CameraUpdate對象,改變了目前可視區域的zoom 級别。

static CameraUpdate

zoomBy(float amount, Point focus)

傳回一個CameraUpdate 對象改變目前可視區域的縮放級别。

static CameraUpdate

zoomIn()

傳回一個包含縮放級别增大的CameraUpdate 對象,調用此方法一次縮放級别加大一級,也就是螢幕距離地面更近一級。

static CameraUpdate

zoomOut()

傳回一個包含縮放級别減小的CameraUpdate 對象,調用此方法一次縮放級别的減小一級,也就是螢幕距離地面更遠一級。

static CameraUpdate

zoomTo(float zoom)

傳回一個包含縮放級别改變的CameraUpdate 對象。

OK 從字面上看就可以看懂了,但是好像還有點不了解的東西,縮放級别是什麼呢?其實啊  就是我們所說的放大縮小~  高德地圖的縮放級别範圍是3-19,這個級别怎麼來的呢,可以用zoomOut和zoomTo測試出來(不斷放大縮小然後輸出日志),還有一種就是用AMap類的兩個現成的方法:

float

getMaxZoomLevel()

傳回目前可視區域的最大縮放級别。

float

getMinZoomLevel()

傳回目前可視區域的最小縮放級别。

特别說明下:scrollBy(float xPixel, float yPixel)這個方法,這是移動視圖的方法  怎麼移動呢,傳入兩個float參數,這兩個參數你可以想象成二維坐标(其實就是)這個坐标軸的特點是左小右大,上小下大。

舉個例子:    左移

aMap.moveCamera(CameraUpdateFactory.scrollBy(-10, 0));//這個10是我随便設定的長度

右移

aMap.moveCamera(CameraUpdateFactory.scrollBy(10, 0));

上移

aMap.moveCamera(CameraUpdateFactory.scrollBy(0, -10));

下移

aMap.moveCamera(CameraUpdateFactory.scrollBy(0, 10));

好了,剩下的方法慢慢去研究吧,墨迹了一大堆,開始定位吧!

-------------------------定位開始----------------------------

好啦,先看看官方Demo怎麼實作吧,去看Location小藍點功能下的代碼  路徑:/AMap_Android_API_2DMap_Demo_V2.7.0_Location_API_V2.0/src/com/amap/map2d/demo/location/LocationSourceActivity.java

一看,稍微有點暈啊~那咱再看看别的,去看官方文檔吧 http://lbs.amap.com/api/android-sdk/guide/maplayer/#location 貌似寫的有點抽象~ 那怎麼辦呢?  嘿嘿 其實啊 定位這個功能詳細的介紹不在這裡,我們剛剛看的是地圖的SDK(紅色框),高德還有一個專門的定位SDK(綠色框),如圖,好   我們去這裡看下http://lbs.amap.com/api/android-location-sdk/guide/startlocation/

Android 之 高德地圖學習 二 定位

好了,官方介紹很詳細了 我們看下

以下來自官方文檔

第一步,初始化定位用戶端,設定監聽

注:請在主線程中聲明AMapLocationClient類對象,需要傳Context類型的參數。推薦用getApplicationConext()方法擷取全程序有效的context。

//聲明AMapLocationClient類對象
public AMapLocationClient mLocationClient = null;
//聲明定位回調監聽器
public AMapLocationListener mLocationListener = new AMapLocationListener();
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//設定定位回調監聽
mlocationClient.setLocationListener(mLocationListener);
           

第二步,配置定位參數,啟動定位

設定定位參數包括:定位模式(高精度定位模式,低功耗定位模式和僅裝置定位模式),是否傳回位址資訊等。

//聲明mLocationOption對象
public AMapLocationClientOption mLocationOption = null;
//初始化定位參數
mLocationOption = new AMapLocationClientOption();
//設定定位模式為高精度模式,Battery_Saving為低功耗模式,Device_Sensors是僅裝置模式
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
//設定是否傳回位址資訊(預設傳回位址資訊)
mLocationOption.setNeedAddress(true);
//設定是否隻定位一次,預設為false
mLocationOption.setOnceLocation(false);
//設定是否強制重新整理WIFI,預設為強制重新整理
mLocationOption.setWifiActiveScan(true);
//設定是否允許模拟位置,預設為false,不允許模拟位置
mLocationOption.setMockEnable(false);
//設定定位間隔,機關毫秒,預設為2000ms
mLocationOption.setInterval(2000);
//給定位用戶端對象設定定位參數
mlocationClient.setLocationOption(mLocationOption);
//啟動定位
mlocationClient.startLocation();
           

第三步,實作AMapLocationListener接口,擷取定位結果

AMapLocationListener接口隻有onLocationChanged方法可以實作,用于接收異步傳回的定位結果,參數是AMapLocation類型。

public void onLocationChanged(AMapLocation amapLocation) {
    if (amapLocation != null) {
        if (amapLocation.getErrorCode() == 0) {
        //定位成功回調資訊,設定相關消息
        amapLocation.getLocationType();//擷取目前定位結果來源,如網絡定位結果,詳見定位類型表
        amapLocation.getLatitude();//擷取緯度
        amapLocation.getLongitude();//擷取經度
        amapLocation.getAccuracy();//擷取精度資訊
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date(amapLocation.getTime());
        df.format(date);//定位時間
        amapLocation.getAddress();//位址,如果option中設定isNeedAddress為false,則沒有此結果,網絡定位結果中會有位址資訊,GPS定位不傳回位址資訊。
        amapLocation.getCountry();//國家資訊
        amapLocation.getProvince();//省資訊
        amapLocation.getCity();//城市資訊
        amapLocation.getDistrict();//城區資訊
        amapLocation.getStreet();//街道資訊
                amapLocation.getStreetNum();//街道門牌号資訊
        amapLocation.getCityCode();//城市編碼
        amapLocation.getAdCode();//地區編碼
    } else {
              //顯示錯誤資訊ErrCode是錯誤碼,errInfo是錯誤資訊,詳見錯誤碼表。
        Log.e("AmapError","location Error, ErrCode:"
            + amapLocation.getErrorCode() + ", errInfo:"
            + amapLocation.getErrorInfo());
        }
    }
}
           

第四步,關于停止定位

mlocationClient.stopLocation();

//停止定位

銷毀定位用戶端:

銷毀定位用戶端之後,若要重新開啟定位請重新New一個AMapLocationClient對象。

mlocationClient.onDestroy();

//銷毀定位用戶端。

以上來自官方文檔

OK  這回我們在去看Demo  能明白了吧~

定位的這幾個類有什麼方法  具體去看官方http://lbs.amap.com/Public/reference/AMap_Location_API_Doc_V2.3.0_20160112/

特别說明:定位類型屬于3D的 也就是2D的不用寫

AMap.setMyLocationType(int type); 這個方法了

下一篇說 覆寫物