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/



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

以下來自官方文檔

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

注:請在主線程中聲明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); 這個方法了


下一篇說 覆蓋物


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章