Android百度地图点聚合功能

来源:互联网 发布:地下城组队网络冲突 编辑:程序博客网 时间:2024/05/22 15:32

在百度地图的开发说明中有描述到点聚合功能:

点聚合功能

自v3.6.0版本起,新增点聚合功能,可通过缩小地图层级,将定义范围内的多个标注点,聚合显示成一个标注点,并在MarkerClusterDemo中开放源码,方便开发者自行修改。

 // 初始化点聚合管理类ClusterManager mClusterManager = new ClusterManager<>(this, mBaiduMap);// 向点聚合管理类中添加Marker实例LatLng llA = new LatLng(39.963175, 116.400244);List<MyItem> items = new ArrayList<>();items.add(new MyItem(llA));mClusterManager.addItems(items);

具体源码请在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);


4、添加坐标点

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



0 6