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(); 這個執行個體沒有被引用,那麼它在堆記憶體中被視為垃圾,虛擬機器不會馬上回收它,但肯定會回收它。