所有叠加或覆盖到地图的内容,我们统称为地图覆盖物。如标注、矢量图形元素(包括:折线、多边形和圆)、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动。
百度地图SDK为开发者们提供了如下类型的地图覆盖物:
A. 我的位置图层(MyLocationOverlay):用于显示用户当前位置的图层;
B. Poi搜索结果图层(PoiOverlay):用于显示兴趣点搜索结果的图层;
C. 路线图层(RouteOverlay):公交、步行和驾车线路图层,将公交、步行和驾车出行方案的路线及关键点显示在地图上;
D. 公交换乘图层(TransitOverlay):公交换乘线路图层,将某一特定地区的公交出行方案的路线及换乘位置显示在地图上;
E. 自定义图层(ItemizedOverlay):可将一个或多个兴趣点绘制到地图上,且支持自定义图标;
F. 弹出窗图层(PopupOverlay):在地图上显示一个弹出窗口。
MapView使用一个List管理覆盖物,通过向MapView.getOverlays() add或remove上述类或其基类的实例即可向地图添加或删除覆盖物。在更新地图覆盖物后,需调用MapView.refresh()使更新生效。
将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(new GeoPoint((int)(locData.latitude*1e6), (int)(locData.longitude* 1e6)));
具体使用方法请参考官方Demo(LocationOverlayDemo.java)。
运行结果如下:
具体使用方法请参考兴趣点搜索部分的相关介绍。
具体使用方法请参考路径规划中驾车及步行线路搜索相关部分的内容。
具体使用方法请参考路径规划中公交线路搜索部分的内容。
在地图上显示一个或一组覆盖物。
从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 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(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; } }
添加到Overlay到MapView的覆盖物中:
Drawable marker = getResources().getDrawable(R.drawable.iconmark);//得到需要标在地图上的资源 mMapView.getOverlays().add(new OverItemT(marker, this));//添加ItemizedOverlay实例到mMapView mMapView.refresh(); // 刷新地图
点击其中一个图标,运行结果如下:
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();
清除指定覆盖物:参考demo里面的ItemizedOverlayDemo.java,重载protected OverlayItemcreateItem(int i)接口,如果要移除覆盖物,就把自己维护的mGeoList列表删除。
清除所有覆盖物:
mapView.getOverlays().clear(); mapView.refresh(); //2.0.0版本起,清除覆盖物后的刷新仅支持refresh方法
更多详细信息请登录百度地图API官方网站:http://developer.baidu.com/map/
百度地图API论坛:http://bbs.lbsyun.baidu.com/