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