(根据老罗视频整理)
如何在地图上标注多个建筑物
当某个类型的覆盖物,包含多个类型相同、显示方式相同、处理方式相同的项时可以使用ItemizedOverlay类进行处理。
ItemizedOverlay类,是一个抽象类,是Overlay的一个子类,包含了一个OverlayItem列表。从南到北的处理item,用于绘制、创建平移边界、为每一个点绘制标记点,和维护一个焦点选中的item,同时也负责把一个屏幕点击匹配到item上去,分发焦点改变事件给备选的监听器。
draw(...):在每一个item上绘制一个标记点。
getCenter():默认情况下,返回第一个item的坐标点
getLatSpanE6()
getLonSpanE6()
onTap(GeoPoint p,MapView mapView):点击某个建筑物时的点击事件
size():OverlayItem数量。
实战项案例:在地图上标注多个建筑物
import java.util.ArrayList; import java.util.List; import com.android.android_baidu_muloverlayitem.R; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.GeoPoint; import com.baidu.mapapi.ItemizedOverlay; import com.baidu.mapapi.MKGeneralListener; import com.baidu.mapapi.MapActivity; import com.baidu.mapapi.MapController; import com.baidu.mapapi.MapView; import com.baidu.mapapi.OverlayItem; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.widget.Toast; public class MainActivity extends MapActivity { //添加百度地图的相关控件 private MapView mapView; //加载地图的引擎 private BMapManager bMapManager; //百度地图的key private String KeyString = "8C426377B3526B6BF3672C9BA3BB544D1E8289CD"; //在百度地图上添加一些控件,比如是放大或者缩小的控件 private MapController mapController; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mapView = (MapView) this.findViewById(R.id.bmapView); bMapManager = new BMapManager(MainActivity.this ); //必须要加载key bMapManager.init(KeyString, new MKGeneralListener() { public void onGetPermissionState(int arg0) { if(arg0==300){ Toast.makeText(MainActivity.this, "输入的key有错,请核实!!", 1).show(); } } public void onGetNetworkState(int arg0) { } }); this.initMapActivity(bMapManager); //表示可以设置缩放功能 mapView.setBuiltInZoomControls(true); mapController = mapView.getController(); //设置缩放级别是12个级别 mapController.setZoom(12); Drawable drawable = getResources().getDrawable(R.drawable.icon_marka); mapView.getOverlays().add(new MyOverLayItem(drawable)); } public class MyOverLayItem extends ItemizedOverlay<OverlayItem>{ private List<OverlayItem> list = new ArrayList<OverlayItem>(); //以double类型定义一组坐标 private double mLat1 = 39.90923;//表示为纬度 private double mLon1 = 116.397428;//表示经度 private double mLat2 = 39.9022;//表示为纬度 private double mLon2 = 116.3922;//表示经度 private double mLat3 = 39.9033;//表示为纬度 private double mLon3 = 116.3933;//表示经度 //用于在地图上标识坐标,用一个图片标注 public MyOverLayItem(Drawable arg0) { super(arg0); //第一组数据在地图上的标注点 GeoPoint geoPoint1 = new GeoPoint((int)(mLat1*1E6),(int)(mLon1*1E6)); //第二组数据在地图上的标注点 GeoPoint geoPoint2 = new GeoPoint((int)(mLat2*1E6),(int)(mLon2*1E6)); //第三组数据在地图上的标注点 GeoPoint geoPoint3 = new GeoPoint((int)(mLat3*1E6),(int)(mLon3*1E6)); //标注点,标题,片段 list.add(new OverlayItem(geoPoint1,"point1","point1")); list.add(new OverlayItem(geoPoint2,"point2","point2")); list.add(new OverlayItem(geoPoint3,"point3","point3")); populate();//实现了地图刷新的功能 } //返回指定的list集合中每一个坐标 @Override protected OverlayItem createItem(int arg0) { return list.get(arg0); } //返回list集合中坐标的个数 @Override public int size() { return list.size(); } @Override public boolean onTap(int i) { Toast.makeText(MainActivity.this, list.get(i).getSnippet(), 1).show(); return true; } } @Override protected void onDestroy() { super.onDestroy(); if(bMapManager!=null){ bMapManager.destroy(); bMapManager = null; } } @Override protected void onResume() { super.onResume(); if(bMapManager!=null){ bMapManager.start(); } } @Override protected void onPause() { super.onPause(); if(bMapManager!=null){ bMapManager.stop(); } } @Override protected boolean isRouteDisplayed() { return false; } }