本篇文章主要介绍如何在百度地图上添加Overlay(即图层或覆盖物)。
最新的百度API请进入:http://developer.baidu.com/map/sdkandev-6.htm#.E7.AE.80.E4.BB.8B3
Overlay简介
Overlay通常被译为“图层”或“覆盖物”。所有叠加或覆盖到地图的内容,我们统称为地图覆盖物。如标注、矢量图形元素(包括:折线、多边形和圆)、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动。 目前百度地图SDK支持多种类型的覆盖物,可以满足用户的各种需求。用户可根据自己的实际需求自由添加各种类型的覆
盖物,且不会产生冲突。此外,用户可以根据添加图层的顺序来控制覆盖物显示的顺序(图片图层除外)。
百度地图SDK为开发者们提供了如下类型的地图覆盖物:
-
我的位置图层(MyLocationOverlay):用于显示用户当前位置的图层(支持自定义位置图标);
-
Poi搜索结果图层(PoiOverlay):用于显示兴趣点搜索结果的图层;
-
路线图层(RouteOverlay):公交、步行和驾车线路图层,将公交、步行和驾车出行方案的路线及关键点显示在地图上(起、终点图标用户可自定义);
-
公交换乘图层(TransitOverlay):公交换乘线路图层,将某一特定地区的公交出行方案的路线及换乘位置显示在地图上(起、终点图标用户可自定义);
-
自定义图层(ItemizedOverlay):可将一个或多个兴趣点绘制到地图上,且支持自定义图标(支持动态更新Item位置、图标);
-
弹出窗图层(PopupOverlay):在地图上显示一个弹出窗口;
-
几何图形绘制图层(GraphicsOverlay):用于绘制点、线、圆、矩形、凸多边形等几何图形的图层;
-
文字绘制图层(TextOverlay):用于绘制文字的图层。
-
图片图层(GroundOverlay):用于展示用户传入图片的图层。
注:除弹出窗图层外,其他各个图层均已实现多实例。
MapView使用一个List管理覆盖物,通过向MapView.getOverlays() add或remove上述类或其基类的实例即可向地图添加或删除覆盖物。在更新地图覆盖物后,需调用MapView.refresh() 使更新生效。
.自定义图层编程方法:ItemizedOverlay
自v2.1.2开始,自定义图层支持动态更新Item位置、图标。
在地图上显示一个或一组覆盖物。
从2.0.0版本开始,SDK不支持直接继承Overlay , 用户可通过继承ItemizedOverlay来添加覆盖物。
添加覆盖物的一般流程如下:
1. 创建OverlayItem,准备overlay数据;
2. 创建ItemizedOverlay实例,调用 addItem(OverlayItem) 接口添加overlay。
3. 调用MapView.getOverlays().add()方法添加overlay到mapview中。
4. 调用MapView.refresh() 使Overlay生效
/*
* 要处理overlay点击事件时需要继承ItemizedOverlay
* 不处理点击事件时可直接生成ItemizedOverlay.
*/
class OverlayTest extends ItemizedOverlay<OverlayItem> {
//用MapView构造ItemizedOverlay
public OverlayTest(Drawable mark,MapView mapView){
super(mark,mapView);
}
protected boolean onTap(int index) {
//在此处理item点击事件
System.out.println("item onTap: "+index);
return true;
}
public boolean onTap(GeoPoint pt, MapView mapView){
//在此处理MapView的点击事件,当返回 true时
super.onTap(pt,mapView);
return false;
}
// 自2.1.1 开始,使用 add/remove 管理overlay , 无需重写以下接口
/*
@Override
protected OverlayItem createItem(int i) {
return mGeoList.get(i);
}
@Override
public int size() {
return mGeoList.size();
}
*/
}
/**
* 在想要添加Overlay的地方使用以下代码,
* 比如Activity的onCreate()中
*/
//准备要添加的Overlay
double mLat1 = 39.90923;
double mLon1 = 116.397428;
double mLat2 = 39.9022;
double mLon2 = 116.3922;
double mLat3 = 39.917723;
double mLon3 = 116.3722;
// 用给定的经纬度构造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));
//准备overlay图像数据,根据实情情况修复
Drawable mark= getResources().getDrawable(R.drawable.icon_marka);
//用OverlayItem准备Overlay数据
OverlayItem item1 = new OverlayItem(p1,"item1","item1");
//使用setMarker()方法设置overlay图片,如果不设置则使用构建ItemizedOverlay时的默认设置
OverlayItem item2 = new OverlayItem(p2,"item2","item2");
item2.setMarker(mark);
OverlayItem item3 = new OverlayItem(p3,"item3","item3");
//创建IteminizedOverlay
OverlayTest itemOverlay = new OverlayTest(mark, mMapView);
//将IteminizedOverlay添加到MapView中
mMapView.getOverlays().clear();
mMapView.getOverlays().add(itemOverlay);
//现在所有准备工作已准备好,使用以下方法管理overlay.
//添加overlay, 当批量添加Overlay时使用addItem(List<OverlayItem>)效率更高
itemOverlay.addItem(item1);
itemOverlay.addItem(item2);
itemOverlay.addItem(item3);
mMapView.refresh();
//删除overlay .
//itemOverlay.removeItem(itemOverlay.getItem(0));
//mMapView.refresh();
//清除overlay
// itemOverlay.removeAll();
// mMapView.refresh();