介绍

当地图上需要展示的marker过多,可能会导致界面上marker出现压盖,展示不全,并导致整体性能变差,用户使用卡顿的显现。针对此类问题,推出点聚合能力,将大量maker通过聚合的方式进行展示。

使用产品

Android 地图 SDK(点聚合功能已经整合到地图SDK中)


核心类说明

ClusterManager:点聚合管理类


示例核心点讲解

1、为了实现聚合功能,需要对ClusterManager进行初始化

  // 实例化点聚合管理者
    mClusterManager = new ClusterManager<MarkerClusterItem>(this, tencentMap);

 // 默认聚合策略,调用时不必添加,如果需要其他聚合策略可以按以下代码修改
    NonHierarchicalDistanceBasedAlgorithm<MarkerClusterItem> ndba = new NonHierarchicalDistanceBasedAlgorithm<>(this);
 // 设置点聚合生效距离,以dp为单位
    ndba.setMaxDistanceAtZoom(35);
 // 设置策略
    mClusterManager.setAlgorithm(ndba);

 // 设置聚合渲染器,默认使用的是DefaultClusterRenderer,可以不调用下列代码
    DefaultClusterRenderer<MarkerClusterItem> renderer = new DefaultClusterRenderer<>(this, tencentMap, mClusterManager);
 // 设置最小聚合数量,默认为4,这里设置为2,即有2个以上不包括2个marker才会聚合
    renderer.setMinClusterSize(2);
 // 定义聚合的分段,当超过5个不足10个的时候,显示5+,其他分段同理
    renderer.setBuckets(new int[]{5, 10, 20, 50});
    mClusterManager.setRenderer(renderer);

2 、要使用腾讯地图提供的聚合功能,需要实现 ClusterItem 接口

public class MarkerClusterItem implements ClusterItem {
    private final LatLng mLatLng;

    // 自定义实例化方法
    public MarkerClusterItem(double latitude, double longitude) {
        // TODO Auto-generated constructor stub
        mLatLng = new LatLng(latitude, longitude);
    }

    @Override
    public LatLng getPosition() {
        // TODO Auto-generated method stub
        return mLatLng;
    }
}

3、添加聚合数据

List<TencentMapItem> items = new ArrayList<TencentMapItem>();
items.add(new TencentMapItem(39.984059116.307621));
items.add(new TencentMapItem(39.981954116.304703));
items.add(new TencentMapItem(39.984355116.312256));
items.add(new TencentMapItem(39.980442116.315346));
items.add(new TencentMapItem(39.981527116.308994));
items.add(new TencentMapItem(39.979751116.310539));
items.add(new TencentMapItem(39.977252116.305776));
items.add(new TencentMapItem(39.984026116.316419));
items.add(new TencentMapItem(39.976956116.314874));
items.add(new TencentMapItem(39.978501116.311827));
items.add(new TencentMapItem(39.980277116.312814));
items.add(new TencentMapItem(39.980236116.369022));
items.add(new TencentMapItem(39.978838116.368486));
items.add(new TencentMapItem(39.977161116.367488));
items.add(new TencentMapItem(39.915398116.396713));
items.add(new TencentMapItem(39.937645116.455421));
items.add(new TencentMapItem(39.896304116.321182));
items.add(new TencentMapItem(31.254487121.452827));
items.add(new TencentMapItem(31.225133121.485443));
items.add(new TencentMapItem(31.216912121.442528));
items.add(new TencentMapItem(31.251552121.500893));
items.add(new TencentMapItem(31.249204121.455917));
items.add(new TencentMapItem(22.546885114.042892));
items.add(new TencentMapItem(22.538086113.999805));
items.add(new TencentMapItem(22.534756114.082031));
mClusterManager.addItems(items);

4、设置聚合

tencentMap.setOnCameraChangeListener(mClusterManager);

注意点

添加聚合点数据和视图之后,需要在合适的地方调用聚合管理者的 cluster 方法来刷新聚合,调用如下:

 //移除聚合管理者
 mClusterManager.clearItems();
 //重新聚合时调用,如更改聚合配置或刷新地图状态
 mClusterManager.cluster();
下载源代码