Android百度地图 - 在地图上标注已知GPS纬度经度值的一个或一组覆盖物

阐述一个概念,地图覆盖物:所有叠加或覆盖到地图的内容,我们统称为地图覆盖物。如标注、矢量图形元素(包括:折线和多边形和圆)、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动。

要实现的需求:假如我们知道北京天安门(建筑物)的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、想要在地图上标注一个建筑物,总得有一个标识吧?

               获取在地图上标识建筑物的图标对象:

[java]  view plain copy
  1. // 获取用于在地图上标注一个地理坐标点的图标  
  2.  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>)中, 声明一个用于存放覆盖物的集合:

[java]  view plain copy
  1. /**覆盖物列表集合*/  
  2.         private ArrayList<OverlayItem> mOverlayList = new ArrayList<OverlayItem>();  

                     声明double类型的变量存储北京天安门的纬度、经度值:

[java]  view plain copy
  1. // 声明double类型的变量存储北京天安门的纬度、经度值  
  2.        private double mLat1 = 39.915// point1纬度  
  3.   
  4.        private double mLon1 = 116.404// point1经度  

                   c. 在构造函数中,将GPS纬度经度值转换成以微度的整数形式存储的地理坐标点

[java]  view plain copy
  1. /*  注:GeoPoint对象构造方法的参数列表:第一个是参数表示纬度,第二个是经度 
  2.                                   (我们平时都是经纬度这么叫的,想着应该是经度在前的,呵呵。) 
  3.                                     在网上查了下,GPS的值官方给的就是纬度经度,也就是说纬度是在前的,以前一直没太注意。*/  
  4.           GeoPoint geoPoint1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6));  

                       构造OverlayItem对象并添加到mOverlayList集合里

[java]  view plain copy
  1. mOverlayList.add(new OverlayItem(geoPoint1, "point1""point1"));  

                      必须调用的方法:

[java]  view plain copy
  1. /*  
  2.           * 官方的解释:在一个新ItemizedOverlay上执行所有操作的工具方法。 
  3.           * 没搞明白啥意思,但是必须的调用这个方法,否则程序运行报错*/  
  4.          populate();  

                   d. 返回的是从指定List集合中,取出的一个OverlayItem对象。

[java]  view plain copy
  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. 获取当前覆盖物列表的大小

[java]  view plain copy
  1. @Override  
  2.       public int size() {  
  3.           return mOverlayList.size();  
  4.       }  

                  自定义的覆盖物类的完整代码:

[java]  view plain copy
  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)对象并添加到覆盖物列表中:

[java]  view plain copy
  1. mMapView.getOverlays().add(new MyOverlayItem(drawable));  

         3、刷新地图

[java]  view plain copy
  1. mMapView.refresh();  

运行效果图如下:

Android百度地图 - 在地图上标注已知GPS纬度经度值的一个或一组覆盖物_第1张图片

完整代码:

[java]  view plain copy
  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来添加覆盖物。

在上面讲解的基础上,修改覆盖物类的部分代码就可以了。直接上代码:

[java]  view plain copy
  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 实体类:

[java]  view plain copy
  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类:

[java]  view plain copy
  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.90923116.397428);  
  80.         GPSPonit gp2 = new GPSPonit(39.9022116.3922);  
  81.         GPSPonit gp3 = new GPSPonit(39.917723116.3722);  
  82.         GPSPonit gp4 = new GPSPonit(39.915116.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. }  

运行效果图如下:

Android百度地图 - 在地图上标注已知GPS纬度经度值的一个或一组覆盖物_第2张图片


你可能感兴趣的:(Android百度地图 - 在地图上标注已知GPS纬度经度值的一个或一组覆盖物)