Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中級篇之百度地圖SDK v3.5.0-百度地圖定位[超詳細圖解定位基礎]

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

編輯:關於Android編程

超詳細解析定位

坐標—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(); 這個實例沒有被引用,那麼它在堆內存中被視為垃圾,虛擬機不會馬上回收它,但肯定會回收它。

釋放內存

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved