Android 位置服務——BaiduMap的使用

  現在大多數應用的位置服務都是使用百度地圖和高德地圖提供的API了,今天我們也來看看百度地圖的使用。
  

如何獲得BaiduMap SDK

  要使用百度地圖,首先我們要獲得baidu的Sdk,那麼如何去獲得呢?首先你要先有一個Baidu的賬號,這裏胡藏劍賬號不再描述。如何equest獲取Baidu地圖開發工具,看下面步驟:
  
1. 首先進入百度地圖API的官網。

這裏寫圖片描述

2. 點擊“開發——>百度地圖SDK”。

這裏寫圖片描述

3. 點擊右側邊框中的“相關下載”,然後點擊”一鍵下載”。這樣會將百度地圖的SDK,示例等一塊下載下來。

這裏寫圖片描述

這裏寫圖片描述

  這樣我們就獲得了Baidu地圖開發的相關工具了。

如何使用BaiduMap

  百度其實已經爲我們提供了幫助文檔,可以通過點擊右側邊框中的開發指南來獲得Baidu地圖的使用幫助:

這裏寫圖片描述

  在開發指南中我們首先可以閱讀簡介來了解Baidu SDK的基本功能,然後可以申請祕鑰, 申請祕鑰之後配置開發環境。然後通過提供的Hello BaiduMap使用示例來講解Baidu 地圖的基本使用。然後可以通過逐步的閱讀,構建自己應用中Map的功能。

這裏寫圖片描述

  下面來看博主的小小練習……

讓Map顯示出來

   基本的配置在之前已經說了,可以參照Baidu “開發指南”上的說明文檔,很清楚的。我們下面之間看博主自己的使用。

1. 首先導入jar包和so包。
  java的jar包,放置在libs文件夾下,so庫放置在main文件夾新建的jniLibs文件夾下。 so庫時C語言寫的一些邏輯,不需要關注。需要用到一些機制JNI java native interface。so導入的原因是爲了不同手機系統進行編譯。

這裏寫圖片描述

  然後講如下四個放置so的文件夾拷貝到jniLibs中:
  
這裏寫圖片描述

2. 通過Android Studio “File——>Project Structure——>Dependencies”中的File Dependency將我們剛纔拷貝的那兩個jar包導入。

3. 設置祕鑰。將”開發者 key”替換成自己在百度上申請的Ak。

<application>  
    <meta-data  
        android:name="com.baidu.lbsapi.API_KEY"  
        android:value="開發者 key" />  
</application>

這裏寫圖片描述

4. 添加權限。

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" />

5. 在佈局xml文件中添加地圖控件。

<com.baidu.mapapi.map.MapView  
    android:id="@+id/bmapView"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:clickable="true" />

6. 在應用程序創建時初始化 SDK引用的Context 全局變量,並創建地圖Activity,管理地圖生命週期。

public class MainActivity extends Activity {
    MapView mMapView = null;//地圖視圖

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //使用BaiduMap  SDK
        //在使用SDK各組件之前初始化context信息,傳入ApplicationContext
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);

        //獲取地圖控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);//獲得地圖視圖的對象

    }
    /*
    Activity關閉時將地圖關閉
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理
        mMapView.onDestroy();
    }
    /*
    ActivityonResume時,將地圖onResume。
     */
    @Override
    protected void onResume() {
        super.onResume();
        //在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理
        mMapView.onResume();
    }
    /*
    ActivityonPause時,將地圖onPause。
     */
    @Override
    protected void onPause() {
        super.onPause();
        //在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理
        mMapView.onPause();
    }
}

  這樣我們的地圖即可即基本顯示了……

這裏寫圖片描述

讓地址轉化爲緯度精度

  在BaiduMap中,給我們提供了將具體地址轉換爲緯度經度,將緯度經度轉化爲具體地址的一個功能。我們參照Baidu給我們提供的Demo來學習具體地址轉緯度經度:

public class MainActivity extends Activity implements View.OnClickListener {

    private Button mButtonOne;//獲取地址一按鈕
    private Button mButtonTwo;//獲取地址二按鈕
    MapView mMapView = null;//地圖視圖
    BaiduMap mBaiduMap;//地圖對象
    //通過地址獲得經緯度
    GeoCoder mSearch = null; // 搜索模塊,也可去掉地圖模塊獨立使用
    public LocationClient mLocationClient = null;
    public BDLocationListener myListener = new MyLocationListener();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //使用BaiduMap  SDK
        //在使用SDK各組件之前初始化context信息,傳入ApplicationContext
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        //獲取地圖控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);//獲得地圖視圖的對象
        mBaiduMap = mMapView.getMap();//獲得地圖對象
        //初始化搜索模塊,註冊事件監聽
        mSearch = GeoCoder.newInstance();//獲得搜索的對象
        mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
            @Override
            public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
                if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
                    Toast.makeText(MainActivity.this, "抱歉,未能找到結果", Toast.LENGTH_LONG)
                            .show();
                    return;
                }
                mBaiduMap.addOverlay(new MarkerOptions().position(geoCodeResult.getLocation())
                        .icon(BitmapDescriptorFactory
                                .fromResource(R.mipmap.icon_marka)));
                mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(geoCodeResult
                        .getLocation()));
                String strInfo = String.format("緯度:%f 經度:%f",
                        geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);
                Log.d("data", strInfo);
                Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();
            }
            @Override
            public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
            }
        });

        //獲取佈局中的各個控件對象
        mButtonOne = (Button) findViewById(R.id.button_one);
        mButtonTwo = (Button) findViewById(R.id.button_two);
        //設置點擊事件
        mButtonOne.setOnClickListener(this);
        mButtonTwo.setOnClickListener(this);
    }

    /*
    Activity關閉時將地圖關閉
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理
        mMapView.onDestroy();
    }

    /*
    ActivityonResume時,將地圖onResume。
     */
    @Override
    protected void onResume() {
        super.onResume();
        //在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理
        mMapView.onResume();
    }

    /*
    ActivityonPause時,將地圖onPause。
     */
    @Override
    protected void onPause() {
        super.onPause();
        //在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理
        mMapView.onPause();
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button_one:
                //獲得天安門的地址
                mSearch.geocode(new GeoCodeOption().city("北京市").address("海淀區中關村海龍大廈"));
                break;
            case R.id.button_two:
                //獲得中關村的地址
                mSearch.geocode(new GeoCodeOption().city("北京市").address("西城區西便門"));
                break;         
        }
    }
}

通過“北京市海淀區中關村海龍大廈”地址獲得的緯度經度定位:

這裏寫圖片描述

通過“北京市西城區西便門”地址獲得的緯度經度定位:

這裏寫圖片描述

在Map上繪製連線

public class MainActivity extends Activity implements View.OnClickListener {

    private Button mButtonOne;//獲取地址一按鈕
    private Button mButtonTwo;//獲取地址二按鈕
    private Button mButtonLine;//劃線按鈕

    MapView mMapView = null;//地圖視圖
    BaiduMap mBaiduMap;//地圖對象
    //連線點的集合
    private List<LatLng> points = new ArrayList<LatLng>();
    //通過地址獲得經緯度
    GeoCoder mSearch = null; // 搜索模塊,也可去掉地圖模塊獨立使用
    public LocationClient mLocationClient = null;
    public BDLocationListener myListener = new MyLocationListener();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);      
        //使用BaiduMap  SDK
        //在使用SDK各組件之前初始化context信息,傳入ApplicationContext
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        //獲取地圖控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);//獲得地圖視圖的對象
        mBaiduMap = mMapView.getMap();//獲得地圖對象
        //初始化搜索模塊,註冊事件監聽
        mSearch = GeoCoder.newInstance();//獲得搜索的對象
        mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
            @Override
            public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
                if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
                    Toast.makeText(MainActivity.this, "抱歉,未能找到結果", Toast.LENGTH_LONG)
                            .show();
                    return;
                }
                mBaiduMap.addOverlay(new MarkerOptions().position(geoCodeResult.getLocation())
                        .icon(BitmapDescriptorFactory
                                .fromResource(R.mipmap.icon_marka)));
                mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(geoCodeResult.getLocation()));
                //添加點
                LatLng p = new LatLng(geoCodeResult.getLocation().latitude,geoCodeResult.getLocation().longitude);
                points.add(p);
                String strInfo = String.format("緯度:%f 經度:%f",
                        geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);
                Log.d("data", strInfo);
                Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();
            }
            @Override
            public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
            }
        });

        //獲取佈局中的各個控件對象
        mButtonOne = (Button) findViewById(R.id.button_one);
        mButtonTwo = (Button) findViewById(R.id.button_two);
        mButtonLine = (Button) findViewById(R.id.button_three);
        //設置點擊事件
        mButtonOne.setOnClickListener(this);
        mButtonTwo.setOnClickListener(this);
        mButtonLine.setOnClickListener(this);    
    }

    /*
    Activity關閉時將地圖關閉
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理
        mMapView.onDestroy();
    }

    /*
    ActivityonResume時,將地圖onResume。
     */
    @Override
    protected void onResume() {
        super.onResume();
        //在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理
        mMapView.onResume();
    }

    /*
    ActivityonPause時,將地圖onPause。
     */
    @Override
    protected void onPause() {
        super.onPause();
        //在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理
        mMapView.onPause();
    } 
    @Override
    public void onClick(View v) {
        switch (v.getId()) {         
            case R.id.button_one:
                //獲得中關村海龍大廈的地址
                mSearch.geocode(new GeoCodeOption().city("北京市").address("海淀區中關村海龍大廈"));
                break;
            case R.id.button_two:
                //獲得便門的地址
                mSearch.geocode(new GeoCodeOption().city("北京市").address("西城區西便門"));
                break;
            case R.id.button_three:
                //獲得當地的地址
                // 添加折線
                OverlayOptions ooPolyline = new PolylineOptions().width(10).color(0xAAFF0000).points(points);
                mBaiduMap.addOverlay(ooPolyline);
                break;
        }
    }
}

  添加折線使用我們首先要獲得我們要連接的點:

//傳入經度和緯度
LatLng point = new LatLng(geoCodeResult.getLocation().latitude,geoCodeResult.getLocation().longitude);

  然後將這些點保存在集合中:

//聲明一個全局變量,創建點的集合
private List<LatLng> points = new ArrayList<LatLng>();
//在確定點的位置,將點添加到集合中
points.ass(point);

  在點擊按鈕處,將點連接成線:

// 添加折線
OverlayOptions ooPolyline = new PolylineOptions().width(10).color(0xAAFF0000).points(points);
mBaiduMap.addOverlay(ooPolyline);

這裏寫圖片描述

發佈了134 篇原創文章 · 獲贊 134 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章