Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android百度地圖實現在地圖上標注已知GPS緯度經度值的一個或一組覆蓋物示例

Android百度地圖實現在地圖上標注已知GPS緯度經度值的一個或一組覆蓋物示例

編輯:Android開發實例

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

要實現的需求:假如我們知道北京天安門(建築物)的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(),管理地圖引擎管理類對象和顯示對象生命周期。

          5、詳細的請閱讀上一篇:Android 百度地圖SDK (v2.0.0)初探

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

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

               獲取在地圖上標識建築物的圖標對象:

       // 獲取用於在地圖上標注一個地理坐標點的圖標
        Drawable drawable = this.getResources().getDrawable(R.drawable.icon_marka);

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

                a. 編寫覆蓋物類,自己定義一個類,繼承自ItemizedOverlay<OverlayItem>類,需要重寫父類的構造函數、createItem(int index)和size()方法。

                注:從2.0.0開始,SDK不支持直接繼承Overlay , 用戶可通過繼承ItemizedOverlay來添加覆蓋物。

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

  1. /**覆蓋物列表集合*/ 
  2.         private ArrayList<OverlayItem> mOverlayList = new ArrayList<OverlayItem>(); 

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

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

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

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

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

 

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

                      必須調用的方法:

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

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

  1. /*  
  2.        * 返回的是從指定List集合中,取出的一個OverlayItem對象。  
  3.        * mOverlayList集合裡一旦有了數據,在調用其之前,  
  4.        * 一定的在MyOverlayItem的構造函數裡調用這個方法populate();  
  5.        */ 
  6.       @Override 
  7.       protected OverlayItem createItem(int index) {  
  8.           return mOverlayList.get(index);  
  9.       }  

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

 

  1. @Override 
  2.       public int size() {  
  3.           return mOverlayList.size();  
  4.       }  

                  自定義的覆蓋物類的完整代碼:

  1. /**  
  2.     * 包含了一個覆蓋物列表的覆蓋物類  
  3.     * @author android_ls  
  4.     */ 
  5.    final class MyOverlayItem extends ItemizedOverlay<OverlayItem> {  
  6.  
  7.        /**覆蓋物列表集合*/ 
  8.        private ArrayList<OverlayItem> mOverlayList = new ArrayList<OverlayItem>();  
  9.  
  10.        // 聲明double類型的變量存儲北京天安門的緯度、經度值  
  11.        private double mLat1 = 39.915; // point1緯度  
  12.  
  13.        private double mLon1 = 116.404; // point1經度  
  14.  
  15.        // 傳進來的Drawable對象用於在地圖上標注一個地理坐標點  
  16.        public MyOverlayItem(Drawable drawable) {  
  17.            super(drawable);  
  18.  
  19.            // 將GPS緯度經度值轉換成以微度的整數形式存儲的地理坐標點  
  20.  
  21.            /*  注:GeoPoint對象構造方法的參數列表:第一個是參數表示緯度,第二個是經度  
  22.                                    (我們平時都是經緯度這麼叫的,想著應該是經度在前的,呵呵。)  
  23.                                      在網上查了下,GPS的值官方給的就是緯度經度,也就是說緯度是在前的,以前一直沒太注意。*/ 
  24.            GeoPoint geoPoint1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6));  
  25.  
  26.            // 構造OverlayItem對象並添加到mOverlayList集合裡  
  27.            mOverlayList.add(new OverlayItem(geoPoint1, "point1", "point1"));  
  28.  
  29.            /*   
  30.             * 官方的解釋:在一個新ItemizedOverlay上執行所有操作的工具方法。  
  31.             * 沒搞明白啥意思,但是必須的調用這個方法,否則程序運行報錯*/ 
  32.            populate();  
  33.        }  
  34.  
  35.        /*  
  36.         * 返回的是從指定List集合中,取出的一個OverlayItem對象。  
  37.         * mOverlayList集合裡一旦有了數據,在調用其之前,  
  38.         * 一定的在MyOverlayItem的構造函數裡調用這個方法populate();  
  39.         */ 
  40.        @Override 
  41.        protected OverlayItem createItem(int index) {  
  42.            return mOverlayList.get(index);  
  43.        }  
  44.  
  45.        @Override 
  46.        public int size() {  
  47.            return mOverlayList.size();  
  48.        }  
  49.  
  50.    }  

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

 

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

         3、刷新地圖

  1. mMapView.refresh(); 

運行效果圖如下:



完整代碼:

  1. package com.android.baidu.map;  
  2.  
  3. import java.util.ArrayList;  
  4.  
  5. import android.app.Activity;  
  6. import android.graphics.drawable.Drawable;  
  7. import android.os.Bundle;  
  8. import android.widget.Toast;  
  9.  
  10. import com.baidu.mapapi.BMapManager;  
  11. import com.baidu.mapapi.MKGeneralListener;  
  12. import com.baidu.mapapi.map.ItemizedOverlay;  
  13. import com.baidu.mapapi.map.MKEvent;  
  14. import com.baidu.mapapi.map.MapController;  
  15. import com.baidu.mapapi.map.MapView;  
  16. import com.baidu.mapapi.map.OverlayItem;  
  17. import com.baidu.platform.comapi.basestruct.GeoPoint;  
  18.  
  19. /**  
  20.  * 在地圖上標注已知GPS緯度經度值的建築物  
  21.  * 場景:假如我們知道北京天安門(建築物)的GPS緯度經度值:39.915,116.404,想要把它在地圖上標注出來。  
  22.  * @author android_ls  
  23.  *  
  24.  */ 
  25. public class BaiduMapOverlayActivity extends Activity {  
  26.  
  27.     /**地圖引擎管理類*/ 
  28.     private BMapManager mBMapManager = null;  
  29.  
  30.     /**顯示地圖的View*/ 
  31.     private MapView mMapView = null;  
  32.  
  33.     /**  
  34.      * 經研究發現在申請KEY時:應用名稱一定要寫成my_app_應用名(也就是說"my_app_"是必須要有的)。  
  35.      * 百度地圖SDK提供的服務是免費的,接口無使用次數限制。您需先申請密鑰(key),才可使用該套SDK。  
  36.      * */ 
  37.     public static final String BAIDU_MAP_KEY = "07418AEC69BAAB7104C6230A6120C580DFFAEEBB";  
  38.  
  39.     @Override 
  40.     public void onCreate(Bundle savedInstanceState) {  
  41.         super.onCreate(savedInstanceState);  
  42.  
  43.         // 注意:請在調用setContentView前初始化BMapManager對象,否則會報錯  
  44.         mBMapManager = new BMapManager(this.getApplicationContext());  
  45.         mBMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() {  
  46.  
  47.             @Override 
  48.             public void onGetNetworkState(int iError) {  
  49.                 if (iError == MKEvent.ERROR_NETWORK_CONNECT) {  
  50.                     Toast.makeText(BaiduMapOverlayActivity.this.getApplicationContext(),   
  51.                             "您的網絡出錯啦!",  
  52.                             Toast.LENGTH_LONG).show();  
  53.                 }  
  54.             }  
  55.  
  56.             @Override 
  57.             public void onGetPermissionState(int iError) {  
  58.                 if (iError == MKEvent.ERROR_PERMISSION_DENIED) {  
  59.                     // 授權Key錯誤:  
  60.                     Toast.makeText(BaiduMapOverlayActivity.this.getApplicationContext(),  
  61.                             "請在 DemoApplication.java文件輸入正確的授權Key!",  
  62.                             Toast.LENGTH_LONG).show();  
  63.                 }  
  64.             }  
  65.         });  
  66.  
  67.         setContentView(R.layout.main);  
  68.  
  69.         mMapView = (MapView) this.findViewById(R.id.bmapsView);  
  70.         // 設置啟用內置的縮放控件  
  71.         mMapView.setBuiltInZoomControls(true);  
  72.  
  73.         // 獲取地圖控制器,可以用它控制平移和縮放  
  74.         MapController mMapController = mMapView.getController();  
  75.         // 設置地圖的縮放級別。 這個值的取值范圍是[3,18]。   
  76.         mMapController.setZoom(13);  
  77.  
  78.         // 獲取用於在地圖上標注一個地理坐標點的圖標  
  79.         Drawable drawable = this.getResources().getDrawable(R.drawable.icon_marka);  
  80.  
  81.         // 創建覆蓋物(MyOverlayItem)對象並添加到覆蓋物列表中  
  82.         mMapView.getOverlays().add(new MyOverlayItem(drawable));  
  83.  
  84.         // 刷新地圖  
  85.         mMapView.refresh();  
  86.  
  87.     }  
  88.  
  89.     /**  
  90.      * 包含了一個覆蓋物列表的覆蓋物類  
  91.      * @author android_ls  
  92.      */ 
  93.     final class MyOverlayItem extends ItemizedOverlay<OverlayItem> {  
  94.  
  95.         /**覆蓋物列表集合*/ 
  96.         private ArrayList<OverlayItem> mOverlayList = new ArrayList<OverlayItem>();  
  97.  
  98.         // 聲明double類型的變量存儲北京天安門的緯度、經度值  
  99.         private double mLat1 = 39.915; // point1緯度  
  100.  
  101.         private double mLon1 = 116.404; // point1經度  
  102.  
  103.         // 傳進來的Drawable對象用於在地圖上標注一個地理坐標點  
  104.         public MyOverlayItem(Drawable drawable) {  
  105.             super(drawable);  
  106.  
  107.             // 將GPS緯度經度值轉換成以微度的整數形式存儲的地理坐標點  
  108.  
  109.             /* 注:GeoPoint對象構造方法的參數列表:第一個是參數表示緯度,  
  110.              * 第二個是經度(我們平時都是經緯度這麼叫的,想著應該是經度在前的,呵呵。)  
  111.              * 在網上查了下,GPS的值官方給的就是緯度經度,也就是說緯度是在前的,以前一直沒太注意。*/ 
  112.             GeoPoint geoPoint1 = new GeoPoint(  
  113.                     (int) (mLat1 * 1E6),   
  114.                     (int) (mLon1 * 1E6));  
  115.  
  116.             // 構造OverlayItem對象並添加到mOverlayList集合裡  
  117.             mOverlayList.add(new OverlayItem(geoPoint1, "point1", "point1"));  
  118.  
  119.             /*   
  120.              * 官方的解釋:在一個新ItemizedOverlay上執行所有操作的工具方法。  
  121.              * 沒搞明白啥意思,但是必須的調用這個方法,否則程序運行報錯*/ 
  122.             populate();  
  123.         }  
  124.  
  125.         /*  
  126.          * 返回的是從指定List集合中,取出的一個OverlayItem對象。  
  127.          * mOverlayList集合裡一旦有了數據,在調用其之前,  
  128.          * 一定的在MyOverlayItem的構造函數裡調用這個方法populate();  
  129.          */ 
  130.         @Override 
  131.         protected OverlayItem createItem(int index) {  
  132.             return mOverlayList.get(index);  
  133.         }  
  134.  
  135.         @Override 
  136.         public int size() {  
  137.             return mOverlayList.size();  
  138.         }  
  139.  
  140.     }  
  141.  
  142.     // 重寫以下方法,管理API  
  143.     @Override 
  144.     protected void onResume() {  
  145.         mMapView.onResume();  
  146.         if (mBMapManager != null) {  
  147.             mBMapManager.start();  
  148.         }  
  149.         super.onResume();  
  150.     }  
  151.  
  152.     @Override 
  153.     protected void onPause() {  
  154.         mMapView.onPause();  
  155.         if (mBMapManager != null) {  
  156.             mBMapManager.stop();  
  157.         }  
  158.         super.onPause();  
  159.     }  
  160.  
  161.     @Override 
  162.     protected void onDestroy() {  
  163.         mMapView.destroy();  
  164.         if (mBMapManager != null) {  
  165.             mBMapManager.destroy();  
  166.             mBMapManager = null;  
  167.         }  
  168.         super.onDestroy();  
  169.     }  
  170. }  

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

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

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

  1. class MyOverlayItem extends ItemizedOverlay<OverlayItem> {  
  2.  
  3.       /**覆蓋物列表集合*/ 
  4.       private ArrayList<OverlayItem> mOverlayList = new ArrayList<OverlayItem>();  
  5.  
  6.       // 場景:假如我們有一組建築物的GPS經緯度值,想要把這些建築物在地圖上標注出來。  
  7.  
  8.       private double mLat1 = 39.90923; // point1緯度  
  9.  
  10.       private double mLon1 = 116.397428; // point1經度  
  11.  
  12.       private double mLat2 = 39.9022;// point2緯度  
  13.  
  14.       private double mLon2 = 116.3922; // point2經度  
  15.  
  16.       private double mLat3 = 39.917723; // point3緯度  
  17.  
  18.       private double mLon3 = 116.3722; // point3緯度  
  19.  
  20.       private double mLat4 = 39.915; // point4緯度  
  21.  
  22.       private double mLon4 = 116.404; // point4經度  
  23.         
  24.       // 傳進來的Drawable對象用於在地圖上標注一個地理坐標點  
  25.       public MyOverlayItem(Drawable drawable) {  
  26.           super(drawable);  
  27.  
  28.           // 將GPS緯度經度值轉換成以微度的整數形式存儲的地理坐標點  
  29.  
  30.           /*  注:GeoPoint對象構造方法的參數列表:第一個是參數表示緯度,第二個是經度  
  31.                                   (我們平時都是經緯度這麼叫的,想著應該是經度在前的,呵呵。)  
  32.                                     在網上查了下,GPS的值官方給的就是緯度經度,也就是說緯度是在前的,以前一直沒太注意。*/ 
  33.           GeoPoint geoPoint1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6));  
  34.           GeoPoint geoPoint2 = new GeoPoint((int) (mLat2 * 1E6), (int) (mLon2 * 1E6));  
  35.           GeoPoint geoPoint3 = new GeoPoint((int) (mLat3 * 1E6), (int) (mLon3 * 1E6));  
  36.           GeoPoint geoPoint4 = new GeoPoint((int) (mLat4 * 1E6), (int) (mLon4 * 1E6));  
  37.  
  38.           // 構造OverlayItem對象並添加到mOverlayList集合裡  
  39.           mOverlayList.add(new OverlayItem(geoPoint1, "point1", "point1"));  
  40.           mOverlayList.add(new OverlayItem(geoPoint2, "point2", "point2"));  
  41.           mOverlayList.add(new OverlayItem(geoPoint3, "point3", "point3"));  
  42.           mOverlayList.add(new OverlayItem(geoPoint4, "point4", "point4"));  
  43.  
  44.           // 必須的調用這個方法,否則程序運行報錯  
  45.           populate();  
  46.       }  
  47.  
  48.       /*  
  49.        * 返回的是從指定List集合中,取出的一個OverlayItem對象。  
  50.        * mOverlayList集合裡一旦有了數據,在調用其之前,  
  51.        * 一定的在MyOverlayItem的構造函數裡調用這個方法populate();  
  52.        */ 
  53.       @Override 
  54.       protected OverlayItem createItem(int index) {  
  55.           return mOverlayList.get(index);  
  56.       }  
  57.  
  58.       @Override 
  59.       public int size() {  
  60.           return mOverlayList.size();  
  61.       }  
  62.  
  63.   }  

對代碼進行優化:

GPSPonit 實體類:

  1. package com.android.baidu.map.entity;  
  2.  
  3. /**    
  4. * 類名: Ponit.java   
  5. * 功能描述:存放GPS緯度、經度值  
  6. * @author android_ls  
  7. * 創建日期: 2013-2-10 下午07:43:47   
  8. * @version V1.0    
  9. */ 
  10. public class GPSPonit {  
  11.  
  12.     private double mLat; // 緯度  
  13.  
  14.     private double mLon; // 經度  
  15.  
  16.     public double getmLat() {  
  17.         return mLat;  
  18.     }  
  19.  
  20.     public void setmLat(double mLat) {  
  21.         this.mLat = mLat;  
  22.     }  
  23.  
  24.     public double getmLon() {  
  25.         return mLon;  
  26.     }  
  27.  
  28.     public void setmLon(double mLon) {  
  29.         this.mLon = mLon;  
  30.     }  
  31.  
  32.     public GPSPonit(double mLat, double mLon) {  
  33.         this.mLat = mLat;  
  34.         this.mLon = mLon;  
  35.     }  
  36.  
  37.     public GPSPonit() {  
  38.     }  
  39.  
  40.     @Override 
  41.     public String toString() {  
  42.         return "Ponit [mLat=" + mLat + ", mLon=" + mLon + "]";  
  43.     }  
  44.  
  45. }  

優化後的Activity類:

  1. package com.android.baidu.map;  
  2.  
  3. import java.util.ArrayList;  
  4.  
  5. import android.app.Activity;  
  6. import android.graphics.drawable.Drawable;  
  7. import android.os.Bundle;  
  8. import android.widget.Toast;  
  9.  
  10. import com.android.baidu.map.entity.GPSPonit;  
  11. import com.baidu.mapapi.BMapManager;  
  12. import com.baidu.mapapi.MKGeneralListener;  
  13. import com.baidu.mapapi.map.ItemizedOverlay;  
  14. import com.baidu.mapapi.map.MKEvent;  
  15. import com.baidu.mapapi.map.MapController;  
  16. import com.baidu.mapapi.map.MapView;  
  17. import com.baidu.mapapi.map.OverlayItem;  
  18. import com.baidu.platform.comapi.basestruct.GeoPoint;  
  19.  
  20. /**  
  21.  * 在地圖上標注已知GPS緯度經度值的一組建築物  
  22.  * @author android_ls  
  23.  *  
  24.  */ 
  25. public class BaiduMapOverlayItemsActivity extends Activity {  
  26.  
  27.     /**地圖引擎管理類*/ 
  28.     private BMapManager mBMapManager = null;  
  29.  
  30.     /**顯示地圖的View*/ 
  31.     private MapView mMapView = null;  
  32.  
  33.     /**  
  34.      * 經研究發現在申請KEY時:應用名稱一定要寫成my_app_應用名(也就是說"my_app_"是必須要有的)。  
  35.      * 百度地圖SDK提供的服務是免費的,接口無使用次數限制。您需先申請密鑰(key),才可使用該套SDK。  
  36.      * */ 
  37.     public static final String BAIDU_MAP_KEY = "07418AEC69BAAB7104C6230A6120C580DFFAEEBB";  
  38.  
  39.     @Override 
  40.     public void onCreate(Bundle savedInstanceState) {  
  41.         super.onCreate(savedInstanceState);  
  42.  
  43.         // 注意:請在調用setContentView前初始化BMapManager對象,否則會報錯  
  44.         mBMapManager = new BMapManager(this.getApplicationContext());  
  45.         mBMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() {  
  46.  
  47.             @Override 
  48.             public void onGetNetworkState(int iError) {  
  49.                 if (iError == MKEvent.ERROR_NETWORK_CONNECT) {  
  50.                     Toast.makeText(BaiduMapOverlayItemsActivity.this.getApplicationContext(),  
  51.                             "您的網絡出錯啦!",   
  52.                             Toast.LENGTH_LONG).show();  
  53.                 }  
  54.             }  
  55.  
  56.             @Override 
  57.             public void onGetPermissionState(int iError) {  
  58.                 if (iError == MKEvent.ERROR_PERMISSION_DENIED) {  
  59.                     // 授權Key錯誤:  
  60.                     Toast.makeText(BaiduMapOverlayItemsActivity.this.getApplicationContext(),   
  61.                             "請在 DemoApplication.java文件輸入正確的授權Key!",   
  62.                             Toast.LENGTH_LONG).show();  
  63.                 }  
  64.             }  
  65.         });  
  66.  
  67.         setContentView(R.layout.main);  
  68.  
  69.         mMapView = (MapView) this.findViewById(R.id.bmapsView);  
  70.         // 設置啟用內置的縮放控件  
  71.         mMapView.setBuiltInZoomControls(true);  
  72.  
  73.         // 獲取地圖控制器,可以用它控制平移和縮放  
  74.         MapController mMapController = mMapView.getController();  
  75.         // 設置地圖的縮放級別。 這個值的取值范圍是[3,18]。   
  76.         mMapController.setZoom(13);  
  77.           
  78.         //TODO 構建一組數據  
  79.         GPSPonit gp1 = new GPSPonit(39.90923, 116.397428);  
  80.         GPSPonit gp2 = new GPSPonit(39.9022, 116.3922);  
  81.         GPSPonit gp3 = new GPSPonit(39.917723, 116.3722);  
  82.         GPSPonit gp4 = new GPSPonit(39.915, 116.404);  
  83.           
  84.         /**存放GPS緯度、經度值的數組*/ 
  85.         GPSPonit[] mGPSPonit = new GPSPonit[4];  
  86.         mGPSPonit[0] = gp1;  
  87.         mGPSPonit[1] = gp2;  
  88.         mGPSPonit[2] = gp3;  
  89.         mGPSPonit[3] = gp4;  
  90.           
  91.         Drawable drawable = this.getResources().getDrawable(R.drawable.icon_marka);  
  92.         // 創建覆蓋物(MyOverlayItem)對象並添加到覆蓋物列表中  
  93.         mMapView.getOverlays().add(new MyOverlayItem(drawable, mGPSPonit));  
  94.  
  95.         // 刷新地圖  
  96.         mMapView.refresh();  
  97.     }  
  98.       
  99.     final class MyOverlayItem extends ItemizedOverlay<OverlayItem> {  
  100.  
  101.         /**覆蓋物列表集合*/ 
  102.         private ArrayList<OverlayItem> mOverlayList = new ArrayList<OverlayItem>();  
  103.  
  104.         // 場景:假如我們有一組建築物的GPS經緯度值,想要把這些建築物在地圖上標注出來。  
  105.           
  106.         // 傳進來的Drawable對象用於在地圖上標注一個地理坐標點  
  107.         public MyOverlayItem(Drawable drawable, GPSPonit[] gPSPonit) {  
  108.             super(drawable);  
  109.  
  110.            for(int i = 0; i < gPSPonit.length; i++){  
  111.                GPSPonit gpp = gPSPonit[i];  
  112.                  
  113.                GeoPoint geoPoint = new GeoPoint(  
  114.                        (int) (gpp.getmLat() * 1E6),  
  115.                        (int) (gpp.getmLon() * 1E6));  
  116.                  
  117.                mOverlayList.add(new OverlayItem(geoPoint, "point"+i, "point1"+i));  
  118.            }  
  119.              
  120.             // 必須的調用這個方法,否則程序運行報錯  
  121.             populate();  
  122.         }  
  123.  
  124.         /*  
  125.          * 返回的是從指定List集合中,取出的一個OverlayItem對象。  
  126.          * mOverlayList集合裡一旦有了數據,在調用其之前,  
  127.          * 一定的在MyOverlayItem的構造函數裡調用這個方法populate();  
  128.          */ 
  129.         @Override 
  130.         protected OverlayItem createItem(int index) {  
  131.             return mOverlayList.get(index);  
  132.         }  
  133.  
  134.         @Override 
  135.         public int size() {  
  136.             return mOverlayList.size();  
  137.         }  
  138.  
  139.     }  
  140.  
  141.     // 重寫以下方法,管理API  
  142.     @Override 
  143.     protected void onResume() {  
  144.         mMapView.onResume();  
  145.         if (mBMapManager != null) {  
  146.             mBMapManager.start();  
  147.         }  
  148.         super.onResume();  
  149.     }  
  150.  
  151.     @Override 
  152.     protected void onPause() {  
  153.         mMapView.onPause();  
  154.         if (mBMapManager != null) {  
  155.             mBMapManager.stop();  
  156.         }  
  157.         super.onPause();  
  158.     }  
  159.  
  160.     @Override 
  161.     protected void onDestroy() {  
  162.         mMapView.destroy();  
  163.         if (mBMapManager != null) {  
  164.             mBMapManager.destroy();  
  165.             mBMapManager = null;  
  166.         }  
  167.         super.onDestroy();  
  168.     }  
  169. }  

運行效果圖如下:

 轉自:http://blog.csdn.net/android_ls/article/details/8578044

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