之前在项目中需要用到百度地图的点聚合,看了百度提供的demo之后,稍微读了一些源码就能达到需求了,所以并未深入解读源码。
最近有空就把百度实现点聚合的源码从里到外仔细研究了一遍受益良多,在此分享一下。
为了方便研究我把百度demo中点聚合相关的类抽出来,新建了个工程,有需要可以下载来研究。ClusterDemo
整个源码分析过程我分为三个部分:
1.整体结构分析
2.核心算法分析
3.实现点聚合
本篇为上篇,主要分析1,2部分。之后还会有个下篇,着重分析具体如何实现marker点聚合以及一些动画处理,这一部分百度处理的非常精妙。
废话少说,进入正文。
1.整体结构
先上一张思维导图:
根据上图我们可以知道,要实现点聚合功能主要分为两部分:
一个是ClusterItem接口,需要我们提供一个实现类,此类主要用来生成地图最终显示的marker,所以包含了经纬度坐标,marker的icon图标,
以及一些其他我们需要保存在marker中的信息。
看代码,这是demo实现的一个ClusterItem的实现类
/**
* 每个Marker点,包含Marker点坐标以及图标
*/
public class MyItem implements ClusterItem {
private final LatLng mPosition;
public MyItem(LatLng latLng) {
mPosition = latLng;
}
@Override
public LatLng getPosition() {
return mPosition;
}//返回marker的坐标
@Override
public BitmapDescriptor getBitmapDescriptor() {//返回marker的图标
return BitmapDescriptorFactory
.fromResource(R.drawable.icon_gcoding);
}
}
比较简单,就不多说了。
另一个是ClusterManager,从图中可以看到它实现了两个百度地图的接口,一个是监听地图状态变化(地图缩放时,执行点聚合),另一个是监听marker的点击事件。
所以在Demo中给地图设置监听接口时&#x