03.(最新版)百度地圖§覆蓋物OverlayOptions

轉載請標明:http://blog.csdn.net/u012637501   
 目前百度地圖SDK所提供的地圖等級爲3-19級,所包含的信息有建築物、道路、河流、學校、公園等內容。所有疊加或覆蓋到地圖的內容,我們統稱爲地圖覆蓋物。如標註、矢量圖形元素(包括:折線、多邊形和圓等)、定位圖標等。覆蓋物擁有自己的地理座標,當您拖動或縮放地圖時,它們會相應的移動。我們可根據自己實際的業務需求,利用標註覆蓋物,在地圖指定的位置上添加標註信息。
一、APIs
1.LatLng類
(1)作用:地理座標基本數據結構,在包com.baidu.mapapi.model.LatLng中。
(2)構造方法與成員變量
    LatLng(double latitude, double longitude) 構造函數
◇final double longitude :經度
◇final double latitude :緯度
2.Overlay類 
(1)作用:地圖覆蓋物基類,已知直接子類Marker, Polygon, Polyline, Text
(2)成員方法
◇Bundle getExtraInfo() :獲取覆蓋物額外信息 
◇int getZIndex() :獲取覆蓋物 zIndex 
◇boolean isVisible() :設置覆蓋物可見性 
◇void remove() :刪除該覆蓋物 
◇void setExtraInfo(Bundle extraInfo) :設置覆蓋物額外信息 
◇void setVisible(boolean visible) :獲取覆蓋物可見性 
◇void setZIndex(int zIndex) :設置覆蓋物 zIndex
3.OverlayOptions類
(1)作用:地圖覆蓋物選型基類,直接已知子類MarkerOptions, PolygonOptions, PolylineOptions, TextOptions
(2)構造方法:OverlayOptions()
4.PolygonOptions類
(1)作用:創建多邊形覆蓋物選項類
(2)構造方法:PolygonOptions() 
(3)常用方法
◇PolygonOptions points(java.util.List<LatLng> points) :設置多邊形座標點列表
◇PolygonOptions stroke(Stroke stroke) :設置多邊形邊框信息
◇PolygonOptions visible(boolean visible) :設置多邊形可見性 
◇PolygonOptions zIndex(int zIndex) :設置多邊形 zIndex,即所在的層級
◇PolygonOptions fillColor(int color) :設置多邊形填充顏色
5.Marker類
(1)作用定義地圖 Marker 覆蓋物基類,繼承於Overlay類
(2)常用方法
◇LatLng getPosition() :獲取 Marker 覆蓋物的位置座標
◇void setDraggable(boolean draggable) :設置 marker 是否允許拖拽,默認不可拖拽
◇void setIcon(BitmapDescriptor icon) :設置 Marker 覆蓋物的圖標,相同圖案的 icon 的 Marker 最好使用同一個 BitmapDescriptor 
                                    對象以節省內存空間
◇void setIcons(java.util.ArrayList<BitmapDescriptor> icons) :設置 Marker 覆蓋物的圖標,相同圖案的 icon 的 marker 最好使用同一個 BitmapDescriptor 對象以節省內存空間。 
◇void setPeriod(int period) :設置多少幀刷新一次圖片資源,Marker動畫的間隔時間,值越小動畫越快 
◇void setPerspective(boolean perspective) :設置是否開啓 Marker 覆蓋物近大遠小效果,默認開啓 
◇void setPosition(LatLng position) :設置 Marker 覆蓋物的位置座標 
◇void setRotate(float rotate) :設置 Marker 覆蓋物旋轉角度,逆時針 
◇void setTitle(java.lang.String title) :設置 Marker 覆蓋物的標題 
◇void setToTop() :設置當前marker在最上面
6.MarkerOptions類
(1)作用:地圖 Marker 覆蓋物實現類 ,繼承於OverlayOptions類
(2)構造方法:MarkerOptions() 
(3)常用方法
MarkerOptions draggable(boolean draggable) :設置 marker 是否允許拖拽,默認不可拖拽 
MarkerOptions period(int period) :設置多少幀刷新一次圖片資源,Marker動畫的間隔時間,值越小動畫越快 
MarkerOptions perspective(boolean perspective) :設置是否開啓 marker 覆蓋物近大遠小效果,默認開啓 
MarkerOptions position(LatLng position) :設置 marker 覆蓋物的位置座標 
MarkerOptions rotate(float rotate) :設置 marker 覆蓋物旋轉角度,逆時針 
MarkerOptions title(java.lang.String title) :設置 marker 覆蓋物的標題 
MarkerOptions visible(boolean visible) :設置 marker 覆蓋物的可見性 
MarkerOptions zIndex(int zIndex) :設置 marker 覆蓋物的 zIndex
7.BitmapDescriptor&BitmapDescriptorFactory類
(1)作用:BitmapDescriptor對象是bitmap (位圖)描述信息;BitmapDescriptorFactory對象是bitmap 描述信息工廠類,在使用該類方法之前請確保已經調用了 SDKInitializer.initialize(Context) 函數以提供全局 Context 信息。
(2)BitmapDescriptorFactory重要方法
    static BitmapDescriptor fromResource(int resourceId) :根據資源 Id 創建 bitmap 描述信息
    static BitmapDescriptor fromBitmap(Bitmap image) :根據 Bitmap 創建描述信息
    static BitmapDescriptor fromAsset(java.lang.String assetName) :根據資源名稱創建bitmap描述信息
8.InfoWindow類
(1)作用:在地圖中顯示一個信息窗口,可以設置一個View作爲該窗口的內容,也可以設置一個 BitmapDescriptor 作爲該窗口的內容。
(2)構造方法
InfoWindow(BitmapDescriptor bd, LatLng position, int yOffset, InfoWindow.OnInfoWindowClickListener listener)
    通過傳入的 bitmap descriptor 構造一個 InfoWindow。
InfoWindow(View view, LatLng position, int yOffset)
    通過傳入的 view 構造一個 InfoWindow, 此時只是利用該view生成一個Bitmap繪製在地圖中。
二、地圖覆蓋物實現方法
1.標註覆蓋物
   我們可根據自己實際的業務需求,利用標註覆蓋物,在地圖指定的位置上添加標註信息。
(1)只顯示不可拖拽(Marker)標註覆蓋物
  1. BaiduMap mBaiduMap = mapView.getMap(); 
  2. //定義Maker座標點    
  3. LatLng point = new LatLng(39.963175116.400244);   
  4. //構建Marker圖標    
  5. BitmapDescriptor bitmap = BitmapDescriptorFactory    
  6.     .fromResource(R.drawable.icon_marka);    
  7. //構建MarkerOption,用於在地圖上添加Marker    
  8. OverlayOptions option = new MarkerOptions()    
  9.     .position(point)    
  10.     .icon(bitmap);    
  11. //在地圖上添加Marker,並顯示    
  12. mBaiduMap.addOverlay(option);  
(2)顯示可拖拽(Marker)標註覆蓋物
    針對已經添加在地圖上的標註,可採用如下方式進行手勢拖拽:  
  第一步,設置可拖拽  
  1. OverlayOptions options = new MarkerOptions()  
  2.     .position(llA)  //設置marker的位置  
  3.     .icon(bdA)  //設置marker圖標  
  4.     .zIndex(9)  //設置marker所在層級  
  5.     .draggable(true);  //設置手勢拖拽  
  6. //將marker添加到地圖上  
  7. marker = (Marker) (mBaiduMap.addOverlay(options));
 第二步,設置監聽方法    
  1. //調用BaiduMap對象的setOnMarkerDragListener方法設置marker拖拽的監聽  
  2. mBaiduMap.setOnMarkerDragListener(new OnMarkerDragListener() {  
  3.     public void onMarkerDrag(Marker marker) {  
  4.         //拖拽中  
  5.     }  
  6.     public void onMarkerDragEnd(Marker marker) {  
  7.         //拖拽結束  
  8.     }  
  9.     public void onMarkerDragStart(Marker marker) {  
  10.         //開始拖拽  
  11.     }  
  12. });
(3)顯示動態(Marker)標註覆蓋物
  1. // 通過marker的icons設置一組圖片,再通過period設置多少幀刷新一次圖片資源  
  2. ArrayList<BitmapDescriptor> giflist = new ArrayList<BitmapDescriptor>();  
  3. giflist.add(bdA);  
  4. giflist.add(bdB);  
  5. giflist.add(bdC);  
  6. OverlayOptions ooD = new MarkerOptions().position(pt).icons(giflist)  
  7.                 .zIndex(0).period(10);    
  8. mMarkerD = (Marker) (mBaiduMap.addOverlay(ooD));
2.幾何圖形覆蓋物
    地圖SDK提供多種結合圖形覆蓋物,利用這些圖形,可幫助您構建更加豐富多彩的地圖應用。目前提供的幾何圖形有:點(Dot)、折線(Polyline)、弧線(Arc)、圓(Circle)、多邊形(Polygon)
  1. //定義多邊形的五個頂點    
  2. LatLng pt1 = new LatLng(39.93923116.357428);    
  3. LatLng pt2 = new LatLng(39.91923116.327428);    
  4. LatLng pt3 = new LatLng(39.89923116.347428);    
  5. LatLng pt4 = new LatLng(39.89923116.367428);    
  6. LatLng pt5 = new LatLng(39.91923116.387428);    
  7. List<LatLng> pts = new ArrayList<LatLng>();    
  8. pts.add(pt1);    
  9. pts.add(pt2);    
  10. pts.add(pt3);    
  11. pts.add(pt4);    
  12. pts.add(pt5);    
  13. //構建用戶繪製多邊形的Option對象    
  14. OverlayOptions polygonOption = new PolygonOptions()    
  15.     .points(pts)    
  16.     .stroke(new Stroke(50xAA00FF00))    
  17.     .fillColor(0xAAFFFF00);    
  18. //在地圖上添加多邊形Option,用於顯示    
  19. mBaiduMap.addOverlay(polygonOption);
3. 文字覆蓋物
    文字,在地圖中也是一種覆蓋物,開發者可利用相關的接口,快速實現在地圖上書寫文字的需求。
  1. //定義文字所顯示的座標點    
  2. LatLng llText = new LatLng(39.86923116.397428);    
  3. //構建文字Option對象,用於在地圖上添加文字    
  4. OverlayOptions textOption = new TextOptions()    
  5.     .bgColor(0xAAFFFF00)    
  6.     .fontSize(24)    
  7.     .fontColor(0xFFFF00FF)    
  8.     .text("百度地圖SDK")    
  9.     .rotate(-30)    
  10.     .position(llText);    
  11. //在地圖上添加該文字對象並顯示    
  12. mBaiduMap.addOverlay(textOption);
4.彈出窗覆蓋物
    彈出窗覆蓋物的實現方式如下,我們可利用此接口,構建具有更強交互性的地圖頁面。 當點擊Marker後彈出InfoWindow的示例圖,我們只需將InfoWindow的顯示方法寫在Maker的點擊事件處理中即可實現該效果。 
  1. //創建InfoWindow展示的view    
  2. Button button = new Button(getApplicationContext());    
  3. button.setBackgroundResource(R.drawable.popup);    
  4. //定義用於顯示該InfoWindow的座標點    
  5. LatLng pt = new LatLng(39.86923116.397428);    
  6. //創建InfoWindow , 傳入 view, 地理座標, y 軸偏移量   
  7. InfoWindow mInfoWindow = new InfoWindow(button, pt, -47);    
  8. //顯示InfoWindow    
  9. mBaiduMap.showInfoWindow(mInfoWindow);
5.刪除覆蓋物
  Marker marker = (Marker)mBaiduMap.addOverlay(option);  
    marker.remove();   //調用Marker對象的remove方法實現指定marker的刪除幾何圖形覆蓋物 
三、源碼實戰
1.src/../MainActivity.java
功能:(1)獲取MapView組件對象,BaiduMap對象,即地圖控制器   (2)管理地圖生命週期
  1. package com.example.baidumap;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.view.View;  
  5. import android.view.View.OnClickListener;  
  6. import android.widget.Button;  
  7.   
  8. import com.baidu.mapapi.SDKInitializer;  
  9. import com.baidu.mapapi.map.BaiduMap;  
  10. import com.baidu.mapapi.map.MapView;  
  11. import com.baidu.mapapi.map.Marker;  
  12. public class MainActivity extends Activity{  
  13.     private MapView mapView = null;  
  14.     private BaiduMap baiduMap = null;  
  15.     private Button iconMarkBtn = null;  
  16.     private Button geMarkBtn = null;  
  17.     private Button textMarkBtn = null;  
  18.     private Button clearBtn = null;  
  19.     private Marker mark = null;  
  20.     private void init()  
  21.     {  
  22.         iconMarkBtn = (Button)findViewById(R.id.iconMarker);  
  23.         geMarkBtn = (Button)findViewById(R.id.geometricMark);  
  24.         textMarkBtn = (Button)findViewById(R.id.textMark);  
  25.         clearBtn = (Button)findViewById(R.id.clearOverlay);  
  26.     }  
  27.     @Override  
  28.     protected void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         //1.在使用SDK組件之間初始化context信息,傳入ApplicationContext  
  31.         SDKInitializer.initialize(getApplicationContext());  
  32.         setContentView(R.layout.main);  
  33.         this.init();        //初始化界面控件  
  34.         //2.獲取地圖控件引用  
  35.         mapView = (MapView)findViewById(R.id.bmapView);  
  36.         baiduMap = mapView.getMap();                //獲取地圖控制器       
  37.         //3.獲取標註覆蓋自定義類,調用相關方法標註類型的覆蓋物  
  38.         final MarkOverlayTest markOverlayTest = new MarkOverlayTest(getApplicationContext(),baiduMap);  //實例化自定義類對象  
  39.         iconMarkBtn.setOnClickListener(new OnClickListener() {  
  40.             public void onClick(View v) {                         
  41.                 mark=markOverlayTest.markIcon();                //調用markOverlay方法標註覆蓋物  
  42.             }  
  43.         });  
  44.         //4.幾何圖形覆蓋  
  45.         geMarkBtn.setOnClickListener(new OnClickListener() {  
  46.             public void onClick(View v) {                 
  47.                 markOverlayTest.markGeometricFigure();              //調用markOverlay方法標註覆蓋物  
  48.             }  
  49.         });  
  50.         //5.文字覆蓋  
  51.         textMarkBtn.setOnClickListener(new OnClickListener() {  
  52.             public void onClick(View v) {                 
  53.                 markOverlayTest.markText();             //調用markOverlay方法標註覆蓋物  
  54.             }  
  55.         });  
  56.        //6.清除標誌物,調用Marker對象的remover方法實現指定marker的刪除  
  57.         clearBtn.setOnClickListener(new OnClickListener() {  
  58.             public void onClick(View v) {  
  59.                 mark.remove();    
  60.             }  
  61.         });  
  62.     }  
  63.     //7.百度地圖聲明週期控制  
  64.     protected void onDestroy() {  
  65.         mapView.onDestroy();    //停止使用百度地圖  
  66.         super.onDestroy();  
  67.     }  
  68.     protected void onResume() {  
  69.         mapView.onResume(); //恢復使用百度地圖  
  70.         super.onResume();  
  71.     }  
  72.     protected void onPause() {  
  73.         mapView.onPause();  //暫停使用百度地圖  
  74.         super.onPause();  
  75.     }  

2.src/.../MarkOverlayTest.java
功能:爲了更能體現面向對象的思想,自己在工程中自定義了一個類,通過定義不同的成員方法來實現不同覆蓋物對地圖的標註。
  1. package com.example.baidumap;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.R.color;  
  7. import android.content.Context;  
  8. import android.widget.Button;  
  9.   
  10. import com.baidu.mapapi.map.BaiduMap;  
  11. import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;  
  12. import com.baidu.mapapi.map.BitmapDescriptor;  
  13. import com.baidu.mapapi.map.BitmapDescriptorFactory;  
  14. import com.baidu.mapapi.map.InfoWindow;  
  15. import com.baidu.mapapi.map.Marker;  
  16. import com.baidu.mapapi.map.MarkerOptions;  
  17. import com.baidu.mapapi.map.OverlayOptions;  
  18. import com.baidu.mapapi.map.PolygonOptions;  
  19. import com.baidu.mapapi.map.Stroke;  
  20. import com.baidu.mapapi.map.TextOptions;  
  21. import com.baidu.mapapi.model.LatLng;  
  22.   
  23. public class MarkOverlayTest {  
  24.     private BaiduMap baiduMap = null;  
  25.     private Marker marker = null;  
  26.     private Context context = null;  
  27.     /*------1.構造方法  :傳遞主Acitivity中的BaiduMap實例----------*/  
  28.     //傳遞主UI上下文對象,BaiduMap實例  
  29.     public MarkOverlayTest(Context context,BaiduMap baiduMap) {  
  30.             this.baiduMap = baiduMap;         
  31.             this.context = context;   
  32.         }  
  33.     /*------2.標註圖片覆蓋物方法--------*/  
  34.     public Marker markIcon()  
  35.     {  
  36.         LatLng point = new LatLng(39.963175116.400244);                                                       //定義Marker座標點  
  37.         /*(1)顯示標誌物(不可拖拽) 
  38.         BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka_red);//構建Marker圖標 
  39.         OverlayOptions option = new MarkerOptions().position(point).icon(bitmap);                  
  40.                                                                          //構建MarkerOption,用於在地圖上添加Marker 
  41.         marker = (Marker)baiduMap.addOverlay(options);//在地圖上添加Marker,並顯示 
  42.         return marker;      */    
  43.           
  44.         /*(2)給Marker增加動畫的能力 
  45.          *      自v3.3版本起,SDK提供了給Marker增加動畫的能力。通過marker的icons設置一組圖片, 
  46.          * 在通過period設置多少幀刷新一次圖片資源   */  
  47.         ArrayList<BitmapDescriptor> giflist = new ArrayList<BitmapDescriptor>();          
  48.         giflist.add(BitmapDescriptorFactory.fromResource(R.drawable.icon_marka_red));  
  49.         giflist.add(BitmapDescriptorFactory.fromResource(R.drawable.icon_marka_blue));  
  50.         OverlayOptions options = new MarkerOptions().position(point).draggable(true).icons(giflist).zIndex(0).period(10);  
  51.         marker = (Marker)baiduMap.addOverlay(options);  //獲取覆蓋物Marker對象  
  52.         baiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {           
  53.             @Override  
  54.             public boolean onMarkerClick(Marker arg0) {  
  55.                 /*--------彈出窗覆蓋物---------*/  
  56.                 //(1)創建InfoWindow展示的view  
  57.                 Button button = new Button(context);  
  58.                 button.setText("北京師範大學");  
  59.                 //(2)定義用於顯示該InfoWindow的座標  
  60.                 LatLng pt = new LatLng(39.993175116.900244);  
  61.                 //(3)創建InfoWindow,傳入VIew,地理座標,y軸偏移量  
  62.                 InfoWindow mInfoWindow = new InfoWindow(button,pt,-47);  
  63.                 //(4)顯示InfoWindow  
  64.                 baiduMap.showInfoWindow(mInfoWindow);  
  65.                 return true;  
  66.             }  
  67.         });  
  68.         return marker;  
  69.           
  70.        /*(3)標誌物可拖拽 
  71.          *  //第一步:設置可拖拽 
  72.         BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka_red);//構建Marker圖標 
  73.         OverlayOptions options = new MarkerOptions() 
  74.                         .position(point)        //設置marker位置 
  75.                         .icon(bitmap)       //設置marker圖標 
  76.                         .zIndex(9)              //設置marker所在的層級 
  77.                         .draggable(true);   //設置手勢拖拽 
  78.         marker = (Marker)baiduMap.addOverlay(options);  //將marker添加到地圖上 
  79.         //第二步:設置監聽方法 
  80.         baiduMap.setOnMarkerDragListener(new OnMarkerDragListener() { 
  81.             public void onMarkerDragStart(Marker arg0) {        //開始拖拽 
  82.  
  83.             } 
  84.             public void onMarkerDragEnd(Marker arg0) {      //拖拽結束 
  85.  
  86.             } 
  87.             public void onMarkerDrag(Marker arg0) {         //拖拽中 
  88.  
  89.             } 
  90.         });  
  91.         return marker;*/      
  92.     }  
  93.       
  94.     /*-------3.標註幾何圖形覆蓋物------*/  
  95.     public void markGeometricFigure()  
  96.     {  
  97.         //(1)定義多邊形的五個頂點    
  98.         LatLng pt1 = new LatLng(39.93923116.357428);    
  99.         LatLng pt2 = new LatLng(39.91923116.327428);    
  100.         LatLng pt3 = new LatLng(39.89923116.347428);    
  101.         LatLng pt4 = new LatLng(39.89923116.367428);    
  102.         LatLng pt5 = new LatLng(39.91923116.387428);   
  103.         List<LatLng> pts = new ArrayList<LatLng>();  
  104.         pts.add(pt1);  
  105.         pts.add(pt2);  
  106.         pts.add(pt3);  
  107.         pts.add(pt4);  
  108.         pts.add(pt5);  
  109.         //(2)構建用戶繪製多邊形(polygon)的Option對象  
  110.         OverlayOptions polygonOptions = new PolygonOptions()  
  111.                                                 .points(pts)  
  112.                                                 .stroke(new Stroke(5,0xAA00FF00))  
  113.                                                 .fillColor(0xAAFFFF00);  
  114.         //(2)在地圖上添加多邊形option,用於顯示  
  115.         baiduMap.addOverlay(polygonOptions);  
  116.     }  
  117.       
  118.     /*-------4.標註文字覆蓋物------*/  
  119.     public void markText()  
  120.     {  
  121.         //(1)定義文字所顯示的座標點  
  122.         LatLng text = new LatLng(39.86923116.397428);  
  123.         OverlayOptions textOptions = new TextOptions()  
  124.                                     .bgColor(0xAAFFFF00)  
  125.                                     .fontSize(24)  
  126.                                     .fontColor(0xFFFF00FF)  
  127.                                     .text("百度地圖文字覆蓋物")  
  128.                                     .rotate(-30)  
  129.                                     .position(text);  
  130.         //(2)在地圖上添加該文字對象並顯示  
  131.         baiduMap.addOverlay(textOptions);                                         
  132.     }    
運行結果:

說明分析:
(1)關於MarkOverlayTest類中的構造方法:
        public MarkOverlayTest(Context context,BaiduMap baiduMap) {  
            this.baiduMap = baiduMap;        
            this.context = context;  
        } 
由於在自定義類中,需要通過BaiduMap地圖控制器實例的addOverLay(option)對地圖添加不同的標註覆蓋物,並且在實現-彈出窗覆蓋物功能添加view時需要傳遞一個上下文Context對象,因此,我們通過類的構造函數將主UI的相關對象傳遞進來,從而實現目的。
(2)如果需要實現:當我們點擊標註覆蓋物或者整個地圖界面的任何地方都彈出窗覆蓋物,可以通過調用BaiduMap的setOnxxxxListener接口實現。圖片標註覆蓋物響應如下:
 baiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {          
            @Override  
            public boolean onMarkerClick(Marker arg0) {  
                /*--------彈出窗覆蓋物---------*/  
                //(1)創建InfoWindow展示的view  
                Button button = new Button(context);  
                button.setText("北京師範大學");  
                //(2)定義用於顯示該InfoWindow的座標  
                LatLng pt = new LatLng(39.993175, 116.900244);  
                //(3)創建InfoWindow,傳入VIew,地理座標,y軸偏移量  
                InfoWindow mInfoWindow = new InfoWindow(button,pt,-47);  
                //(4)顯示InfoWindow  
                baiduMap.showInfoWindow(mInfoWindow);  
                return true;  
            }  
        });  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章