Android百度地圖 - 在地圖上標註已知GPS緯度經度值的一個或一組覆蓋物 - OPEN 開發經驗庫 - 360安全瀏覽器 8.1

來源:互聯網
上載者:User

標籤:raw   manage   upload   原理   _id   length   als   --   poi   

闡述一個概念,地圖覆蓋物:所有疊加或覆蓋到地圖的內容,我們統稱為地圖覆蓋物。如標註、向量圖形元素(包括:折線和多邊形和圓)、定位元影像標等。覆蓋物擁有自己的地理座標,當您拖動或縮放地圖時,它們會相應的移動。

要實現的需求:假如我們知道北京天安門(建築物)的GPS緯度經度值:39.915,116.404,想要把它在百度地圖上標註出來。

實現上述需求的步驟:

一、準備工作:

         1、建立android工程,並匯入百度地圖需要用到的jar包和so檔案。

         2、在AndroidManifest檔案中添加使用百度地圖SDK所需的許可權及螢幕配置。

         3、在布局檔案layout中添加顯示百度地圖的MapView。

         4、在繼承了Activity類的子類中:

                a. 建立並初始化地圖引擎管理對象;

                b. 通過組件ID擷取代表地圖顯示View的MapView對象,並設定相應屬性。

                  (比如:啟用內建的縮放控制項、設定允許的地圖縮放層級等)

                c. 重寫Activity的生命週期回調方法onResume()、onPause()和onDestroy(),管理地圖引擎管理類對象和顯示對象生命週期。

二、在地圖上標註出北京天安門:

         1、想要在地圖上標註一個建築物,總得有一個標識吧?

               擷取在地圖上標識建築物的表徵圖對象:

       // 擷取用於在地圖上標註一個地理座標點的表徵圖        Drawable drawable = this.getResources().getDrawable(R.drawable.icon_marka);

             2、在基礎圖上添加覆蓋物(添加圖層)

                a. 編寫覆蓋物類,自己定義一個類,繼承自ItemizedOverlay

                註:從2.0.0開始,SDK不支援直接繼承Overlay , 使用者可通過繼承ItemizedOverlay來添加覆蓋物。

                b. 在自訂的覆蓋物類(繼承自ItemizedOverlay)中, 聲明一個用於存放覆蓋物的集合:

/**覆蓋物列表集合*/        private ArrayList

                     聲明double類型的變數儲存北京天安門的緯度、經度值:

 // 聲明double類型的變數儲存北京天安門的緯度、經度值        private double mLat1 = 39.915; // point1緯度        private double mLon1 = 116.404; // point1經度

                   c. 在建構函式中,將GPS緯度經度值轉換成以微度的整數形式儲存的地理座標點

  /*  註:GeoPoint物件建構方法的參數列表:第一個是參數表示緯度,第二個是經度                                    (我們平時都是經緯度這麼叫的,想著應該是經度在前的,呵呵。)                                      在網上查了下,GPS的值官方給的就是緯度經度,也就是說緯度是在前的,以前一直沒太注意。*/            GeoPoint geoPoint1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6));

                       構造OverlayItem對象並添加到mOverlayList集合裡

mOverlayList.add(new OverlayItem(geoPoint1, "point1", "point1"));

                      必須調用的方法:

   /*              * 官方的解釋:在一個新ItemizedOverlay上執行所有操作的工具方法。             * 沒搞明白啥意思,但是必須的調用這個方法,否則程式運行報錯*/            populate();

                   d. 返回的是從指定List集合中,取出的一個OverlayItem對象。

  /*         * 返回的是從指定List集合中,取出的一個OverlayItem對象。         * mOverlayList集合裡一旦有了資料,在調用其之前,         * 一定的在MyOverlayItem的建構函式裡調用這個方法populate();         */        @Override        protected OverlayItem createItem(int index) {            return mOverlayList.get(index);        }

                   e. 擷取當前覆蓋物列表的大小

  @Override        public int size() {            return mOverlayList.size();        }

                  自訂的覆蓋物類的完整代碼:

 /**     * 包含了一個覆蓋物列表的覆蓋物類     * @author android_ls     */    final class MyOverlayItem extends ItemizedOverlay

            建立覆蓋物(MyOverlayItem)對象並添加到覆蓋物列表中:

  mMapView.getOverlays().add(new MyOverlayItem(drawable));

         3、重新整理地圖

mMapView.refresh();

運行如下:



完整代碼:

package com.android.baidu.map;import java.util.ArrayList;import android.app.Activity;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.widget.Toast;import com.baidu.mapapi.BMapManager;import com.baidu.mapapi.MKGeneralListener;import com.baidu.mapapi.map.ItemizedOverlay;import com.baidu.mapapi.map.MKEvent;import com.baidu.mapapi.map.MapController;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.OverlayItem;import com.baidu.platform.comapi.basestruct.GeoPoint;/** * 在地圖上標註已知GPS緯度經度值的建築物 * 情境:假如我們知道北京天安門(建築物)的GPS緯度經度值:39.915,116.404,想要把它在地圖上標註出來。 * @author android_ls * */public class BaiduMapOverlayActivity extends Activity {    /**地圖引擎管理類*/    private BMapManager mBMapManager = null;    /**顯示地圖的View*/    private MapView mMapView = null;    /**     * 經研究發現在申請KEY時:應用程式名稱一定要寫成my_app_應用程式名稱(也就是說"my_app_"是必須要有的)。     * 百度地圖SDK提供的服務是免費的,介面無使用次數限制。您需先申請密鑰(key),才可使用該套SDK。     * */    public static final String BAIDU_MAP_KEY = "07418AEC69BAAB7104C6230A6120C580DFFAEEBB";    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // 注意:請在調用setContentView前初始化BMapManager對象,否則會報錯        mBMapManager = new BMapManager(this.getApplicationContext());        mBMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() {            @Override            public void onGetNetworkState(int iError) {                if (iError == MKEvent.ERROR_NETWORK_CONNECT) {                    Toast.makeText(BaiduMapOverlayActivity.this.getApplicationContext(),                             "您的網路出錯啦!",                            Toast.LENGTH_LONG).show();                }            }            @Override            public void onGetPermissionState(int iError) {                if (iError == MKEvent.ERROR_PERMISSION_DENIED) {                    // 授權Key錯誤:                    Toast.makeText(BaiduMapOverlayActivity.this.getApplicationContext(),                            "請在 DemoApplication.java檔案輸入正確的授權Key!",                            Toast.LENGTH_LONG).show();                }            }        });        setContentView(R.layout.main);        mMapView = (MapView) this.findViewById(R.id.bmapsView);        // 設定啟用內建的縮放控制項        mMapView.setBuiltInZoomControls(true);        // 擷取地圖控制器,可以用它控制平移和縮放        MapController mMapController = mMapView.getController();        // 設定地圖的縮放層級。 這個值的取值範圍是[3,18]。         mMapController.setZoom(13);        // 擷取用於在地圖上標註一個地理座標點的表徵圖        Drawable drawable = this.getResources().getDrawable(R.drawable.icon_marka);        // 建立覆蓋物(MyOverlayItem)對象並添加到覆蓋物列表中        mMapView.getOverlays().add(new MyOverlayItem(drawable));        // 重新整理地圖        mMapView.refresh();    }    /**     * 包含了一個覆蓋物列表的覆蓋物類     * @author android_ls     */    final class MyOverlayItem extends ItemizedOverlay

三、在地圖上標註出北京天安門附近的幾個點:

從2.0.0開始,SDK不支援直接繼承Overlay 。 在地圖上顯示一個或一組覆蓋物,都可以通過繼承ItemizedOverlay來添加覆蓋物。

在上面講解的基礎上,修改覆蓋物類的部分代碼就可以了。直接上代碼:

  class MyOverlayItem extends ItemizedOverlay

對代碼進行最佳化:

GPSPonit 實體類:

package com.android.baidu.map.entity;/**  * 類名: Ponit.java * 功能描述:存放GPS緯度、經度值* @author android_ls* 建立日期: 2013-2-10 下午07:43:47 * @version V1.0  */public class GPSPonit {    private double mLat; // 緯度    private double mLon; // 經度    public double getmLat() {        return mLat;    }    public void setmLat(double mLat) {        this.mLat = mLat;    }    public double getmLon() {        return mLon;    }    public void setmLon(double mLon) {        this.mLon = mLon;    }    public GPSPonit(double mLat, double mLon) {        this.mLat = mLat;        this.mLon = mLon;    }    public GPSPonit() {    }    @Override    public String toString() {        return "Ponit [mLat=" + mLat + ", mLon=" + mLon + "]";    }}

最佳化後的Activity類:

package com.android.baidu.map;import java.util.ArrayList;import android.app.Activity;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.widget.Toast;import com.android.baidu.map.entity.GPSPonit;import com.baidu.mapapi.BMapManager;import com.baidu.mapapi.MKGeneralListener;import com.baidu.mapapi.map.ItemizedOverlay;import com.baidu.mapapi.map.MKEvent;import com.baidu.mapapi.map.MapController;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.OverlayItem;import com.baidu.platform.comapi.basestruct.GeoPoint;/** * 在地圖上標註已知GPS緯度經度值的一組建築物 * @author android_ls * */public class BaiduMapOverlayItemsActivity extends Activity {    /**地圖引擎管理類*/    private BMapManager mBMapManager = null;    /**顯示地圖的View*/    private MapView mMapView = null;    /**     * 經研究發現在申請KEY時:應用程式名稱一定要寫成my_app_應用程式名稱(也就是說"my_app_"是必須要有的)。     * 百度地圖SDK提供的服務是免費的,介面無使用次數限制。您需先申請密鑰(key),才可使用該套SDK。     * */    public static final String BAIDU_MAP_KEY = "07418AEC69BAAB7104C6230A6120C580DFFAEEBB";    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // 注意:請在調用setContentView前初始化BMapManager對象,否則會報錯        mBMapManager = new BMapManager(this.getApplicationContext());        mBMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() {            @Override            public void onGetNetworkState(int iError) {                if (iError == MKEvent.ERROR_NETWORK_CONNECT) {                    Toast.makeText(BaiduMapOverlayItemsActivity.this.getApplicationContext(),                            "您的網路出錯啦!",                             Toast.LENGTH_LONG).show();                }            }            @Override            public void onGetPermissionState(int iError) {                if (iError == MKEvent.ERROR_PERMISSION_DENIED) {                    // 授權Key錯誤:                    Toast.makeText(BaiduMapOverlayItemsActivity.this.getApplicationContext(),                             "請在 DemoApplication.java檔案輸入正確的授權Key!",                             Toast.LENGTH_LONG).show();                }            }        });        setContentView(R.layout.main);        mMapView = (MapView) this.findViewById(R.id.bmapsView);        // 設定啟用內建的縮放控制項        mMapView.setBuiltInZoomControls(true);        // 擷取地圖控制器,可以用它控制平移和縮放        MapController mMapController = mMapView.getController();        // 設定地圖的縮放層級。 這個值的取值範圍是[3,18]。         mMapController.setZoom(13);                //TODO 構建一組資料        GPSPonit gp1 = new GPSPonit(39.90923, 116.397428);        GPSPonit gp2 = new GPSPonit(39.9022, 116.3922);        GPSPonit gp3 = new GPSPonit(39.917723, 116.3722);        GPSPonit gp4 = new GPSPonit(39.915, 116.404);                /**存放GPS緯度、經度值的數組*/        GPSPonit[] mGPSPonit = new GPSPonit[4];        mGPSPonit[0] = gp1;        mGPSPonit[1] = gp2;        mGPSPonit[2] = gp3;        mGPSPonit[3] = gp4;                Drawable drawable = this.getResources().getDrawable(R.drawable.icon_marka);        // 建立覆蓋物(MyOverlayItem)對象並添加到覆蓋物列表中        mMapView.getOverlays().add(new MyOverlayItem(drawable, mGPSPonit));        // 重新整理地圖        mMapView.refresh();    }        final class MyOverlayItem extends ItemizedOverlay

運行如下:

Android百度地圖 - 在地圖上標註已知GPS緯度經度值的一個或一組覆蓋物 - OPEN 開發經驗庫 - 360安全瀏覽器 8.1

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.