1概述
所有叠加或覆盖到地图的内容,我们统称为地图覆盖物。如标注、矢量图形元素(包括:折线、多边形和圆)、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动。
百度地图SDK为开发者们提供了如下类型的地图覆盖物:
A. 我的位置图层(MyLocationOverlay):用于显示用户当前位置的图层;
B. Poi搜索结果图层(PoiOverlay):用于显示兴趣点搜索结果的图层;
C. 路线图层(RouteOverlay):公交、步行和驾车线路图层,将公交、步行和驾车出行方案的路线及关键点显示在地图上;
D. 公交换乘图层(TransitOverlay):公交换乘线路图层,将某一特定地区的公交出行方案的路线及换乘位置显示在地图上;
E. 自定义图层(ItemizedOverlay):可将一个或多个兴趣点绘制到地图上,且支持自定义图标;
F. 弹出窗图层(PopupOverlay):在地图上显示一个弹出窗口。
MapView使用一个List管理覆盖物,通过向MapView.getOverlays() add或remove上述类或其基类的实例即可向地图添加或删除覆盖物。在更新地图覆盖物后,需调用MapView.refresh()使更新生效。
2我的位置图层:MyLocationOverlay
将MyLocationOverlay添加到覆盖物中,能够实现在地图上显示当前位置的图标以及指南针:
自2.0.0版本开始,MyLocationOverlay只负责显示我的位置,位置数据可从其他渠道(建议使用百度定位SDK)获取,将获取的位置数据放在一个LocationData结构中并用该结构设置MyLcationOverlay的数据源,即可创建MyLocationOverlay。因此定位图层的使用略有不同,具体参考如下代码:
MyLocationOverlay myLocationOverlay = new MyLocationOverlay(mMapView);
LocationData locData = new LocationData();
//手动将位置源置为,在实际应用中,请使用百度定位SDK获取位置信息,要在SDK中显示一个位置,需要使用百度经纬度坐标(bd09ll)
locData.latitude = 39.945;
locData.longitude = 116.404;
locData.direction = 2.0f;
myLocationOverlay.setData(locData);
mMapView.getOverlays().add(myLocationOverlay);
mMapView.refresh();
mMapView.getController().animateTo(newGeoPoint((int)(locData.latitude*1e6), (int)(locData.longitude* 1e6)));
具体使用方法请参考官方Demo(LocationOverlayDemo.java)。
运行结果如下:
3 Poi搜索结果图层:PoiOverlay
具体使用方法请参考兴趣点搜索部分的相关介绍。
4路线图层:RouteOverlay
具体使用方法请参考路径规划中驾车及步行线路搜索相关部分的内容。
5公交换乘图层:TransitOverlay
具体使用方法请参考路径规划中公交线路搜索部分的内容。
6自定义图层:ItemizedOverlay
在地图上显示一个或一组覆盖物。
从2.0.0版本开始,SDK不支持直接继承Overlay ,用户可通过继承ItemizedOverlay来添加覆盖物。
添加覆盖物的一般流程如下:
1. 创建OverlayItem,准备overlay数据;
2. 继承ItemizedOverlay,至少重写createItem()和 size()方法。若要处理overlay 点击事件,请重写onTap()方法;
3. 调用MapView.getOverlays().add()方法添加overlay到mapview中;
4. 调用MapView.refresh()使Overlay生效。
核心代码如下:
public class OverItem Textends ItemizedOverlay<OverlayItem>{
private List<OverlayItem>GeoList=newArrayList<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(marker);
this.mContext= context;
// 用给定的经纬度构造GeoPoint,单位是微度 (度 * 1E6)
GeoPoint p1 =newGeoPoint((int)(mLat1 * 1E6), (int)(mLon1 * 1E6));
GeoPoint p2 =newGeoPoint((int)(mLat2 * 1E6), (int)(mLon2 * 1E6));
GeoPoint p3 =newGeoPoint((int)(mLat3 * 1E6), (int)(mLon3 * 1E6));
GeoList.add(newOverlayItem(p1, "P1", "point1"));
GeoList.add(newOverlayItem(p2, "P2", "point2"));
GeoList.add(newOverlayItem(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;
}
}
添加到Overlay到MapView的覆盖物中:
Drawable marker =getResources().getDrawable(R.drawable.iconmark);//得到需要标在地图上的资源
mMapView.getOverlays().add(new OverItemT(marker, this));//添加ItemizedOverlay实例到mMapView
mMapView.refresh(); // 刷新地图
点击其中一个图标,运行结果如下:
7 弹出窗口图层:PopupOverlay
PopupOverlay用于快速在特定位置显示一个弹窗,代码示例如下:
在显示一个弹窗:
PopupOverlay pop = new PopupOverlay(mMapView,new PopupClickListener() {
@Override
public void onClickedPopup() {
//在此处理点击事件
}
});
//设置弹窗图片,根据自己的图片资源更改
Drawable marker = getResources().getDrawable(R.drawable.pop); //得到需要标在地图上的资源
BitmapDrawable bd = (BitmapDrawable) marker;
Bitmap popbitmap = bd.getBitmap();
GeoPoint ptTAM = new GeoPoint((int)(39.915 * 1E6), (int) (116.404 * 1E6));
//显示弹窗
pop.showPopup(popbitmap, ptTAM , 32);
//隐藏弹窗
pop.hidePop();
8 如何删除覆盖物?
清除指定覆盖物:参考demo里面的ItemizedOverlayDemo.java,重载protected OverlayItemcreateItem(int i)接口,如果要移除覆盖物,就把自己维护的mGeoList列表删除。
清除所有覆盖物:
mapView.getOverlays().clear();
mapView.refresh(); //2.0.0版本起,清除覆盖物后的刷新仅支持refresh方法