1. 程式人生 > >百度地圖從零學起(四)地圖覆蓋物

百度地圖從零學起(四)地圖覆蓋物

地圖覆蓋物概述

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

地圖API提供瞭如下幾種覆蓋物:

  • Overlay:覆蓋物的抽象基類,所有的覆蓋物均繼承此類的方法,實現使用者自定義圖層顯示。
  • MyLocationOverlay:一個負責顯示使用者當前位置的Overlay。
  • ItemizedOverlay<Item extends OverlayItem>:Overlay的一個基類,包含了一個OverlayItem列表,相當於一組分條的Overlay,通過繼承此類,將一組興趣點顯示在地圖上。

  • PoiOverlay:本地搜尋圖層,提供某一特定地區的位置搜尋服務,比如在北京市搜尋“公園”,通過此圖層將公園顯示在地圖上。

  • RouteOverlay:步行、駕車導航線路圖層,將步行、駕車出行方案的路線及關鍵點顯示在地圖上。

  • TransitOverlay:公交換乘線路圖層,將某一特定地區的公交出行方案的路線及換乘位置顯示在地圖上。

覆蓋物的抽象基類:Overlay

一般來說,在MapView中新增一個Overlay需要經過以下步驟:

自定義類繼承Overlay,並Override其draw()方法,如果需要點選、按鍵、觸控等互動操作,還需Override onTap()等方法。

    public class MyOverlay extends Overlay {
    GeoPoint geoPoint = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));
    Paint paint = new Paint();
     
    @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {
    //在天安門的位置繪製一個String
    Point point = mMapView.getProjection().toPixels(geoPoint, null);
    canvas.drawText("★這裡是天安門", point.x, point.y, paint);
    }
    }

新增到MapView的覆蓋物中:
mMapView.getOverlays().add(new MyOverlay());

執行結果如下:app_myoverlay.png

當前位置:MyLocationOverlay

將MyLocationOverlay新增到覆蓋物中,能夠實現在地圖上顯示當前位置的圖示以及指南針:

初始化Location模組

    // 初始化Location模組
    mLocationManager = mBMapMan.getLocationManager();
    // 通過enableProvider和disableProvider方法,選擇定位的Provider
    // mLocationManager.enableProvider(MKLocationManager.MK_NETWORK_PROVIDER);
    // mLocationManager.disableProvider(MKLocationManager.MK_GPS_PROVIDER);
    // 新增定點陣圖層
    MyLocationOverlay mylocTest = new MyLocationOverlay(this, mMapView);
    mylocTest.enableMyLocation(); // 啟用定位
    mylocTest.enableCompass(); // 啟用指南針
    mMapView.getOverlays().add(mylocTest);

執行結果如下:app_mylocation.png

分條目覆蓋物:ItemizedOverlay

某個型別的覆蓋物,包含多個型別相同、顯示方式相同、處理方式相同的項時,使用此類:

自定義類繼承ItemizedOverlay,並Override其draw()方法,如果需要點選、按鍵、觸控等互動操作,還需Override onTap()等方法。

    class OverItemT extends ItemizedOverlay<OverlayItem> {
    private List<OverlayItem> GeoList = new ArrayList<OverlayItem>();
    private Context mContext;
     
    private double mLat1 = 39.90923;//39.9022; // point1緯度
    private double mLon1 = 116.397428;//116.3822; // point1經度
     
    private double mLat2 = 39.9022;
    private double mLon2 = 116.3922;
     
    private double mLat3 = 39.917723;
    private double mLon3 = 116.3722;
     
    public OverItemT(Drawable marker, Context context) {
    super(boundCenterBottom(marker));
     
    this.mContext = context;
     
    // 用給定的經緯度構造GeoPoint,單位是微度 (度 * 1E6)
    GeoPoint p1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6));
    GeoPoint p2 = new GeoPoint((int) (mLat2 * 1E6), (int) (mLon2 * 1E6));
    GeoPoint p3 = new GeoPoint((int) (mLat3 * 1E6), (int) (mLon3 * 1E6));
     
    GeoList.add(new OverlayItem(p1, "P1", "point1"));
    GeoList.add(new OverlayItem(p2, "P2", "point2"));
    GeoList.add(new OverlayItem(p3, "P3", "point3"));	
    populate(); //createItem(int)方法構造item。一旦有了資料,在呼叫其它方法前,首先呼叫這個方法
    }
     
    @Override
    protected OverlayItem createItem(int i) {
    return GeoList.get(i);
    }
     
    @Override
    public int size() {
    return GeoList.size();
    }
     
    @Override
    // 處理當點選事件
    protected boolean onTap(int i) {
    Toast.makeText(this.mContext, GeoList.get(i).getSnippet(),
    Toast.LENGTH_SHORT).show();
    return true;
    }
    }

新增到MapView的覆蓋物中:
    Drawable marker = getResources().getDrawable(R.drawable.iconmark); //得到需要標在地圖上的資源
    mMapView.getOverlays().add(new OverItemT(marker, this)); //新增ItemizedOverlay例項到mMapView

點選其中一個圖示,執行結果如下:app_myitemizedoverlay.png

本地搜尋覆蓋物:PoiOverlay

詳見在POI搜尋及PoiOverlay。

駕車路線覆蓋物:RouteOverlay


公交換乘路線覆蓋物:TransitOverlay

詳見在公交換乘路線搜尋及TransitOverlay。

如何刪除覆蓋物?

清除指定覆蓋物: 參考demo裡面的ItemizedOverlayDemo.java,過載protected OverlayItem createItem(int i) 介面,如果要移除覆蓋物,就把自己維護的mGeoList列表刪除。

清除所有覆蓋物:mapView.getOverlays().clear();