天天看點

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

超詳細解析定位

  • 坐标—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>
               
    編寫

    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();//設定請求間隔時間
            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-百度地圖定位[超詳細圖解定位基礎]超詳細解析定位