超詳細解析定位
-
坐标—LatLng
定位中用得最多的是坐标(也就是經緯度),那麼我們首先搞清楚什麼是坐标:
LatLng 類:地理坐标基本資料結構。
字段詳細資料描述 方法名 構造函數 LatLng(double latitude, double longitude) 提醒:經緯度我經常搞錯,不知道為什麼,大家特别在操作坐标的時候要格外注意。經緯度的資料類型是描述 字段名 定義 緯度 latitude public final double latitude 經度 longitude public final double longitude
類型的。double
-
坐标拾取系統
百度的坐标拾取系統
每次大家想知道一個地方的坐标或者想拿幾個示例坐标,那麼就可以用這個。滑鼠點選地圖上任意一處地方就會得到該地點的坐标(顯示在右上角方框裡);效果圖(重點看一下紅框裡的内容):
Android中級篇之百度地圖SDK v3.5.0-百度地圖定位[超詳細圖解定位基礎]超詳細解析定位 -
地理範圍資料結構—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(, ); LatLng southwest = new LatLng(, ); LatLngBounds llb = new LatLngBounds.Builder().include(northeast).include(southwest).build(); boolean isHas = llb.contains(new LatLng(, )); Log.v("此功能地圖加載完畢的時候調用", "有還是沒有" + isHas + ",東北:" + llb.northeast + "西南:" + llb.southwest); } });
Android中級篇之百度地圖SDK v3.5.0-百度地圖定位[超詳細圖解定位基礎]超詳細解析定位 -
簡單定位
建立
:activity_location.xml
編寫<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.baidu.mapapi.map.MapView android:id="@+id/location_bdmap" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true"></com.baidu.mapapi.map.MapView> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginTop="80dp" android:background="#9e9e9e" android:minWidth="100dp" android:orientation="vertical" android:padding="2dp"> <RadioGroup android:id="@+id/location_rg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="定位ICON"> <RadioButton android:id="@+id/location_rb_defaulticon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:clickable="true" android:text="預設圖示" /> <RadioButton android:id="@+id/location_rb_customicon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="自定義圖示" /> </RadioGroup> </LinearLayout> <Button android:id="@+id/location_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginRight="25dp" android:layout_marginTop="10dp" /> </RelativeLayout>
類繼承自 BaseActivity:LocationDemo
/** * 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();//設定請求間隔時間 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() .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; } }
Android中級篇之百度地圖SDK v3.5.0-百度地圖定位[超詳細圖解定位基礎]超詳細解析定位 -
配置定位圖層顯示方式—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;
如果Android中級篇之百度地圖SDK v3.5.0-百度地圖定位[超詳細圖解定位基礎]超詳細解析定位
,也就是stu=null
這個執行個體沒有被引用,那麼它在堆記憶體中被視為垃圾,虛拟機不會馬上回收它,但肯定會回收它。new Student();
Android中級篇之百度地圖SDK v3.5.0-百度地圖定位[超詳細圖解定位基礎]超詳細解析定位