首先介绍一下地图数据聚合的功能,当功能需求在地图上添加几百几千个marker时,如果加载完成后在移动地图的时候其实是存在卡顿的情况的。而且从用户层级来讲,缩放地图的时候marker会存在互相干扰,且也不需要这么细致的展示。于是可以做成一下这种效果:
当缩放到最大时,显示具体的每一个marker:
当缩放等级减小时直接聚合为一个点,显示这里有多少个marker:
这下在缩放和移动的时候可以明显减少卡顿,同时也让用户的体验更直观。
具体实现方法可以在网上查一下很容易查到,这里直说我遇到的问题。
1.由于点聚合的接口是如下进行的,必须在onMapStatusChangeListener实现,也就是说地图状态发生变化才会自动触发聚合。
//定义点聚合管理类ClusterManager
mClusterManager = new ClusterManager<MapLockItem>(getActivity(), mBaiduMap);
// 设置地图监听,当地图状态发生改变时,进行点聚合运算
mBaiduMap.setOnMapStatusChangeListener(mClusterManager);
// 设置maker点击时的响应
mBaiduMap.setOnMarkerClickListener(mClusterManager);
这就导致进入地图界面是不会自动聚合的,即使调用了mClusterManager.cluster()方法 ,也不会发生聚合。
目前的解决方案是地图加载完毕后通过代码手动移动了一下地图或者切换到地图自动缩放一下。
2.关于分区聚合,比如武侯区聚合一个数据,金牛区聚合一个数据,这种解决的方案,暂时是这样解决的,当缩放到了每个区的时候,直接清除掉地图上所有的marker,同时给每个区添加自己的聚合marker,数据从服务器api获得;当缩放小于区时启动百度地图的数据点聚合。