百度地圖從零學起(四)地圖覆蓋物
地圖覆蓋物概述
所有疊加或覆蓋到地圖的內容,我們統稱為地圖覆蓋物。如標註、向量圖形元素(包括:折線和多邊形和圓)、定點陣圖標等。覆蓋物擁有自己的地理座標,當您拖動或縮放地圖時,它們會相應的移動。
地圖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());
執行結果如下:
當前位置: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);
執行結果如下:
分條目覆蓋物: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
點選其中一個圖示,執行結果如下:
本地搜尋覆蓋物:PoiOverlay
詳見在POI搜尋及PoiOverlay。
駕車路線覆蓋物:RouteOverlay
公交換乘路線覆蓋物:TransitOverlay
詳見在公交換乘路線搜尋及TransitOverlay。
如何刪除覆蓋物?
清除指定覆蓋物: 參考demo裡面的ItemizedOverlayDemo.java,過載protected OverlayItem createItem(int i) 介面,如果要移除覆蓋物,就把自己維護的mGeoList列表刪除。
清除所有覆蓋物:mapView.getOverlays().clear();