Android中級篇之百度地圖SDK v3.5.0-百度地圖定位[超詳細圖解定位基礎]

來源:互聯網
上載者:User

Android中級篇之百度地圖SDK v3.5.0-百度地圖定位[超詳細圖解定位基礎]
超詳細解析定位座標—LatLng

定位中用得最多的是座標(也就是經緯度),那麼我們首先搞清楚什麼是座標:

LatLng 類:地理座標基本資料結構。

描述 方法名
建構函式 LatLng(double latitude, double longitude)

欄位詳細資料

描述 欄位名 定義
緯度 latitude public final double latitude
經度 longitude public final double longitude

提醒:經緯度我經常搞錯,不知道為什麼,大家特別在操作座標的時候要格外注意。經緯度的資料類型是double類型的。

座標拾取系統

百度的座標拾取系統

每次大家想知道一個地方的座標或者想拿幾個樣本座標,那麼就可以用這個。滑鼠點擊地圖上任意一處地方就會得到該地點的座標(顯示在右上方方框裡);(重點看一下紅框裡的內容):

地理範圍資料結構—LatLngBounds

地理範圍資料結構,由西南以及東北座標點確認。雖然說用的不多,但它和座標有點親屬關係,所以使不使用我們都介紹。

一般有XXX.Builder的希望大家多多使用,盡量不要new,當然了,有的類是有構造方法的有的沒有;嵌套類概要:

限定符和類型 說明
static class LatLngBounds.Builder 地理範圍構造器

欄位概要:

限定符和類型 欄位 說明
LatLng northeast 該地理範圍東北座標
LatLng southwest 該地理範圍西南座標

方法概要:

限定符和類型 方法 說明
boolean contains(LatLng point) 判斷該地理範圍是否包含一個地理位置
LatLng getCenter() 擷取該地理範圍的中心地理座標

方法詳細資料:

public boolean contains(LatLng point)判斷該地理範圍是否包含一個地理位置參數:    point - 被判斷的地理位置返回:    該地理範圍是否包含一個地理位置
public LatLng getCenter()擷取該地理範圍的中心地理座標返回:    該地理範圍的中心地理座標
地理範圍構造器—LatLngBounds.Builder

構造器概要 :

構造器 說明
LatLngBounds.Builder() 建構函式

方法概要:

限定符和類型 方法 說明
LatLngBounds build() 建立地理範圍對象
LatLngBounds.Builder include(LatLng point) 讓該地理範圍包含一個地理位置座標

方法詳細資料:

public LatLngBounds build()建立地理範圍對象返回:    建立出的地理範圍對象
public LatLngBounds.Builder include(LatLng point)讓該地理範圍包含一個地理位置座標參數:    point - 地理位置座標返回:    該構造器對象

使用範例:

mBDMap.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() {        @Override        public void onMapLoaded() {            //座標範圍            LatLng northeast = new LatLng(121.445541, 31.192286);            LatLng southwest = new LatLng(121.441624, 31.189922);            LatLngBounds llb = new LatLngBounds.Builder().include(northeast).include(southwest).build();            boolean isHas = llb.contains(new LatLng(121.443564, 31.190795));            Log.v(此功能地圖載入完畢的時候調用, 有還是沒有 + isHas + ,東北: + llb.northeast + 西南: + llb.southwest);        }   });

簡單定位

建立 activity_location.xml :

                                                        

編寫LocationDemo 類繼承自 BaseActivity

/** * Activity基類 */public class BaseActivity extends FragmentActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //在使用SDK各組件之前初始化context資訊,傳入ApplicationContext        //注意該方法要再setContentView方法之前實現        SDKInitializer.initialize(getApplicationContext());    }}
public class LocationDemo extends BaseActivity implements View.OnClickListener, RadioGroup.OnCheckedChangeListener, BDLocationListener {    private MapView mMapView;    private BaiduMap mBDMap;    //定位    private Button requestLocBtn;    //定位元影像層顯示方式    private MyLocationConfiguration.LocationMode mCurrentMode;    //使用者自訂定位元影像標    private BitmapDescriptor mCurrentMarker;    //選項按鈕組    private RadioGroup rg;    //定位相關    private LocationClient mLocClient;    //是否第一次定位    private boolean isFirstLoc = true;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_location);        initView();    }    private void initView() {        //請求定位        requestLocBtn = (Button) findViewById(R.id.location_btn);        //定位元影像層顯示方式        mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;        requestLocBtn.setText(普通);        requestLocBtn.setOnClickListener(this);        //選項按鈕組        rg = (RadioGroup) findViewById(R.id.location_rg);        rg.setOnCheckedChangeListener(this);        //地圖初始化        mMapView = (MapView) findViewById(R.id.location_bdmap);        mBDMap = mMapView.getMap();        //開啟定位元影像層        mBDMap.setMyLocationEnabled(true);        //定位初始化        mLocClient = new LocationClient(this);        mLocClient.registerLocationListener(this);        LocationClientOption option = new LocationClientOption();        option.setOpenGps(true);//開啟GPS        option.setCoorType(bd09ll);//設定座標類型        option.setScanSpan(1000);//佈建要求間隔時間        mLocClient.setLocOption(option);//載入配置        mLocClient.start();//開始定位    }    //定位按鈕點擊事件    @Override    public void onClick(View v) {        switch (mCurrentMode) {            //普通態:更新定位元據時不對地圖做任何操作            case NORMAL:                requestLocBtn.setText(跟隨);                mCurrentMode = MyLocationConfiguration.LocationMode.FOLLOWING;                break;            //羅盤態,顯示定位方向圈,保持定位元影像標在地圖中心            case COMPASS:                requestLocBtn.setText(普通);                mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;                break;            //跟隨態,保持定位元影像標在地圖中心            case FOLLOWING:                requestLocBtn.setText(羅盤);                mCurrentMode = MyLocationConfiguration.LocationMode.COMPASS;                break;        }        //配置定位元影像層顯示方式        mBDMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));        //開始定位        mLocClient.start();    }    //單選事件    @Override    public void onCheckedChanged(RadioGroup group, int checkedId) {        switch (checkedId) {            case R.id.location_rb_defaulticon:                //傳入null則恢複預設表徵圖                mCurrentMarker = null;                break;            case R.id.location_rb_customicon:                //修改為自訂的Marker                mCurrentMarker = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);                break;        }        //配置定位元影像層顯示方式        mBDMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));    }    //定位監聽    @Override    public void onReceiveLocation(BDLocation bdLocation) {        //如果bdLocation為空白或mapView銷毀後不再處理新資料接收的位置        if (bdLocation == null || mMapView == null) {            return;        }        //定位元據        MyLocationData data = new MyLocationData.Builder()                //精度(半徑)                .accuracy(bdLocation.getRadius())                        //此處設定開發人員擷取到的方向資訊,順時針0-360                .direction(100)                .latitude(bdLocation.getLatitude())                .longitude(bdLocation.getLongitude()).build();        //設定定位元據        mBDMap.setMyLocationData(data);        //是否是第一次定位        if (isFirstLoc) {            isFirstLoc = false;            LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());            MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(ll);            mBDMap.animateMapStatus(msu);        }    }    @Override    protected void onResume() {        super.onResume();        mMapView.onResume();    }    @Override    protected void onPause() {        super.onPause();        mMapView.onPause();    }    @Override    protected void onDestroy() {        super.onDestroy();        //退出時銷毀定位        mLocClient.stop();        //關閉定位元影像層        mBDMap.setMyLocationEnabled(false);        mMapView.onDestroy();        mMapView = null;    }}

運行:

配置定位元影像層顯示方式—MyLocationConfiguration

構造器概要:

構造器 說明
MyLocationConfiguration(MyLocationConfiguration.LocationMode mode, boolean enableDirection, BitmapDescriptor customMarker) 建構函式

構造器詳細資料:

public MyLocationConfiguration(MyLocationConfiguration.LocationMode mode,                       boolean enableDirection,                       BitmapDescriptor customMarker)建構函式參數:    mode - 定位元影像層顯示方式, 預設為 LocationMode.NORMAL 普通態    enableDirection - 是否允許顯示方向資訊    customMarker - 設定使用者自訂定位元影像標,可以為 null    updateTimeEscap - 圖層重新整理頻率,單位ms,若使用預設值,輸入0即可,預設為100ms

嵌套類概要 :

限定符和類型 說明
static class MyLocationConfiguration.LocationMode 定位元影像層顯示方式

欄位概要:

限定符和類型 欄位 說明
BitmapDescriptor customMarker 使用者自訂定位元影像標
boolean enableDirection 是否允許顯示方向資訊
MyLocationConfiguration.LocationMode locationMode 定位元影像層顯示方式
定位元影像層顯示方式—MyLocationConfiguration.LocationMode

枚舉常量概要 :

枚舉常量 說明
COMPASS 羅盤態,顯示定位方向圈,保持定位元影像標在地圖中心
FOLLOWING 跟隨態,保持定位元影像標在地圖中心
NORMAL 普通態: 更新定位元據時不對地圖做任何操作

方法概要:

限定符和類型 說明
static MyLocationConfiguration.LocationMode valueOf(java.lang.String name) 返回帶有指定名稱的該類型的枚舉常量
static MyLocationConfiguration.LocationMode[] values() 按照聲明該枚舉類型的常量的順序, 返回包含這些常量的數組

方法詳細資料:

public static MyLocationConfiguration.LocationMode[] values()按照聲明該枚舉類型的常量的順序, 返回 包含這些常量的數組。該方法可用於迭代 常量, 如下所示:for (MyLocationConfiguration.LocationMode c : MyLocationConfiguration.LocationMode.values())    System.out.println(c);返回:    按照聲明該枚舉類型的常量的順序, 返回 包含這些常量的數組
public static MyLocationConfiguration.LocationMode valueOf(java.lang.String name)返回帶有指定名稱的該類型的枚舉常量。 字串必須與用於聲明該類型的枚舉常量的 標識符完全符合。(不允許有多餘 的空白字元。)參數:    name - 要返回的枚舉常量的名稱。返回:    返回帶有指定名稱的枚舉常量拋出:    如果該枚舉類型沒有帶有指定名稱的常量, - 則拋出 IllegalArgumentException    如果參數為空白值, - 則拋出 NullPointerException
定位元據—MyLocationData

嵌套類概要 :

限定符和類型 說明
static class MyLocationData.Builder 定位元據建造器

欄位概要:

限定符和類型 欄位 說明
float accuracy 定位精度
float direction GPS定位時方向角度
double latitude 百度緯度座標
double longitude 百度經度座標
int satellitesNum GPS定位時衛星數目
float speed GPS定位時速度
定位元據建造器—MyLocationData.Builder

構造器概要:

構造器 說明
MyLocationData.Builder() 建構函式

方法概要 :

限定符和類型 方法 說明
MyLocationData.Builder accuracy(float accuracy) 設定定位元據的精度資訊,單位:米
MyLocationData build() 構建產生定位元據對象
MyLocationData.Builder direction(float direction) 設定定位元據的方向資訊
MyLocationData.Builder latitude(double lat) 設定定位元據的緯度
MyLocationData.Builder longitude(double lng) 設定定位元據的經度
MyLocationData.Builder satellitesNum(int num) 設定定位元據的衛星數目
MyLocationData.Builder speed(float speed) 設定定位元據的速度

方法詳細資料:

public MyLocationData.Builder latitude(double lat)設定定位元據的緯度參數:    lat - 緯度返回:    該構造器對象
public MyLocationData.Builder longitude(double lng)設定定位元據的經度參數:    lng - 經度返回:    該構造器對象
public MyLocationData.Builder speed(float speed)設定定位元據的速度參數:    speed - 速度返回:    該構造器對象
public MyLocationData.Builder direction(float direction)設定定位元據的方向資訊參數:    direction - 方向返回:    該構造器對象
public MyLocationData.Builder accuracy(float accuracy)設定定位元據的精度資訊,單位:米參數:    accuracy - 精度資訊,單位:米返回:    該構造器對象
public MyLocationData.Builder satellitesNum(int num)設定定位元據的衛星數目參數:    num - 衛星數目返回:    該構造器對象
public MyLocationData build()構建產生定位元據對象返回:    產生定位元據對象
銷毀說明

看我們的最後一個方法[onDestroy()] :

    @Override    protected void onDestroy() {        super.onDestroy();        //退出時銷毀定位        mLocClient.stop();        //關閉定位元影像層        mBDMap.setMyLocationEnabled(false);        mMapView.onDestroy();        mMapView = null;    }

這裡我們在編寫的時候一定要注意代碼順序,其次一定要mMapView = null;釋放記憶體;這裡涉及到一個記憶體回收的知識點:

如果 stu=null ,也就是 new Student(); 這個執行個體沒有被引用,那麼它在堆記憶體中被視為垃圾,虛擬機器不會馬上回收它,但肯定會回收它。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.