在百度地图的开发说明中有描述到点聚合功能:
点聚合功能
自v3.6.0版本起,新增点聚合功能,可通过缩小地图层级,将定义范围内的多个标注点,聚合显示成一个标注点,并在MarkerClusterDemo中开放源码,方便开发者自行修改。
具体源码请在MarkerClusterDemo中查看。
到该功能并不在SDK里面,需要自己导入源码。
下载最新百度地图SDK全包:BaiduMap_AndroidSDK_All_V3.7.1,将API Demo里面的clusterutil整个目录拷贝到自己的工程里面:
还有需要用到的res资源也拷贝过去,具体需要拷贝哪些忘了记了, 通过编译可以发现缺哪些,对应拷贝就是。
整个代码的逻辑还没细看,下面是自己项目中有修改到的内容
1、创建实现ClusterItem 接口的类,该类用于表示地图上的一个标记的点,后续将这些标记点的对象添加到聚合地图的管理容器里面,实现点聚合功能。
public class SwitBdItem implements ClusterItem {
// 可以添加自己的属性,比较该标记点关联到一个设备,可以添加一个设备的引用,在地图上点击这个点时可以显示出设备名称
private Context context;
private final LatLng mPosition;
public SwitBdItem(LatLng latLng) {
mPosition = latLng;
}
<span style="white-space:pre"> </span>
// 返回标记点的坐标<span style="white-space:pre"> </span>
@Override
public LatLng getPosition() {
return mPosition;
}
// 返回标记点的标记图标,可以自定义一个View上面叠加自己的内容
@Override
public BitmapDescriptor getBitmapDescriptor() {
View view;
view = LayoutInflater.from(context).inflate(R.layout.item_blue, null);
TextView textView = (TextView) view.findViewById(R.id.icon_title);
textView.setText(title + "");
return BitmapDescriptorFactory.fromView(view);
}
}
2、定义一个聚合功能的管理容器,表示这个点聚合的地图管理容器上要标注SwitBdItem类型的点
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span>
private ClusterManager<SwitBdItem> mClusterManager;
mClusterManager = new ClusterManager<SwitBdItem>(context, mBaiduMap); // mBaiMap是百度地图结构
3、设置点击图标时的事件,在我的项目里面需要实现点击地图点时,显示出相关信息,所以需要设置捕获点击图标事件。
要使该侦听事件生效,需要设置mClusterManager侦听地图的setOnMarkerClick事件
mClusterManager.setOnClusterItemClickListener(new SwitOnClusterItemClickListener());
mBaiduMap.setOnMarkerClickListener(mClusterManager);
SwitBdItem bdItem = new SwitBdItem(ll);
mClusterManager.addItem(bdItem);
通过以上配置后,发现在点击地图上的标记点时,并不会触发SwitOnClusterItemClickLister函数,通过查看源码发现:
mClusterManager.setOnClusterItemClickListener(new SwitOnClusterItemClickListener());
ClusterManager类:
public void setOnClusterItemClickListener(OnClusterItemClickListener<T> listener) {
mOnClusterItemClickListener = listener;
mRenderer.setOnClusterItemClickListener(listener);
}
DefaultClusterRenderer类:
public void setOnClusterItemClickListener(ClusterManager.OnClusterItemClickListener<T> listener) {
mItemClickListener = listener;
}
点击地图点时,调用的是ClusterManager的onMarkerClick方法,但是该方法在目前实现中是直接返回false,需要修改为:
@Override
public boolean onMarkerClick(Marker marker) {
return mMarkerManager.onMarkerClick(marker);
另外可通过修改DefaultClusterRenderer类里面的MIN_CLUSTER_SIZE参数来设置当几个点叠在一起时,要进行聚合,默认是4