package overlay; import java.util.ArrayList; import java.util.List; import com.amap.api.maps.AMap; import com.amap.api.maps.CameraUpdateFactory; import com.amap.api.maps.model.BitmapDescriptor; import com.amap.api.maps.model.LatLng; import com.amap.api.maps.model.LatLngBounds; import com.amap.api.maps.model.Marker; import com.amap.api.maps.model.MarkerOptions; import com.amap.api.services.core.PoiItem; /** * Poi图层类。在高德地图API里,如果要显示Poi,可以用此类来创建Poi图层。如不满足需求,也可以自己创建自定义的Poi图层。 * @since V2.1.0 */ public class PoiOverlay { private List mPois; private AMap mAMap; private ArrayList mPoiMarks = new ArrayList(); /** * 通过此构造函数创建Poi图层。 * @param amap 地图对象。 * @param pois 要在地图上添加的poi。列表中的poi对象详见搜索服务模块的基础核心包(com.amap.api.services.core)中的类 PoiItem。 * @since V2.1.0 */ public PoiOverlay(AMap amap, List pois) { mAMap = amap; mPois = pois; } /** * 添加Marker到地图中。 * @since V2.1.0 */ public void addToMap() { try{ for (int i = 0; i < mPois.size(); i++) { Marker marker = mAMap.addMarker(getMarkerOptions(i)); marker.setObject(i); mPoiMarks.add(marker); } }catch(Throwable e){ e.printStackTrace(); } } /** * 去掉PoiOverlay上所有的Marker。 * @since V2.1.0 */ public void removeFromMap() { for (Marker mark : mPoiMarks) { mark.remove(); } } /** * 移动镜头到当前的视角。 * @since V2.1.0 */ public void zoomToSpan() { try{ if (mPois != null && mPois.size() > 0) { if (mAMap == null) return; if(mPois.size()==1){ mAMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(mPois.get(0).getLatLonPoint().getLatitude(), mPois.get(0).getLatLonPoint().getLongitude()), 18f)); }else{ LatLngBounds bounds = getLatLngBounds(); mAMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 5)); } } }catch(Throwable e){ e.printStackTrace(); } } private LatLngBounds getLatLngBounds() { LatLngBounds.Builder b = LatLngBounds.builder(); for (int i = 0; i < mPois.size(); i++) { b.include(new LatLng(mPois.get(i).getLatLonPoint().getLatitude(), mPois.get(i).getLatLonPoint().getLongitude())); } return b.build(); } private MarkerOptions getMarkerOptions(int index) { return new MarkerOptions() .position( new LatLng(mPois.get(index).getLatLonPoint() .getLatitude(), mPois.get(index) .getLatLonPoint().getLongitude())) .title(getTitle(index)).snippet(getSnippet(index)) .icon(getBitmapDescriptor(index)); } /** * 给第几个Marker设置图标,并返回更换图标的图片。如不用默认图片,需要重写此方法。 * @param index 第几个Marker。 * @return 更换的Marker图片。 * @since V2.1.0 */ protected BitmapDescriptor getBitmapDescriptor(int index) { return null; } /** * 返回第index的Marker的标题。 * @param index 第几个Marker。 * @return marker的标题。 * @since V2.1.0 */ protected String getTitle(int index) { return mPois.get(index).getTitle(); } /** * 返回第index的Marker的详情。 * @param index 第几个Marker。 * @return marker的详情。 * @since V2.1.0 */ protected String getSnippet(int index) { return mPois.get(index).getSnippet(); } /** * 从marker中得到poi在list的位置。 * @param marker 一个标记的对象。 * @return 返回该marker对应的poi在list的位置。 * @since V2.1.0 */ public int getPoiIndex(Marker marker) { for (int i = 0; i < mPoiMarks.size(); i++) { if (mPoiMarks.get(i).equals(marker)) { return i; } } return -1; } /** * 返回第index的poi的信息。 * @param index 第几个poi。 * @return poi的信息。poi对象详见搜索服务模块的基础核心包(com.amap.api.services.core)中的类 PoiItem。 * @since V2.1.0 */ public PoiItem getPoiItem(int index) { if (index < 0 || index >= mPois.size()) { return null; } return mPois.get(index); } }