MarkerCluster之百度地图版

在《Marker Cluster面面观》一文中我描述了Marker Cluster的用处:用来解决加载大量点要素到地图上产生覆盖现象的问题,并提高性能。文中列举了那时(2009年)的一些厂商解决方案,并给了图示和链接。在《BMSL:自定义Cluster》一文中,简述并图示了最简单的聚合算法,给了一套针对Bing MapC#算法简要版。在国内地图/GIS厂商中,超图软件和高德/MapABC都有自己类似的解决方案。

算法的原理还是老样子,打格子,计算,聚合。平移或缩放后,也即地图可视区域发生变化,重新计算。事实上,还可以有更复杂的处理方法,在计算距离聚合时采用不同的方案,就会有不同的结果。比如,可以根据每个点标记的某项属性信息,赋予该点一些权重,使得最终聚合起来的那个“大点”的落脚位置,依据权重有所不同。再比如,不纯粹以距离为标准来聚合,再附件一条标准,落在给定的省份范围内,(也即同时在一个省份的边界多边形内的点标记)才可以聚合到一块等等。SuperMap iClient提供了不少这样的参数来确定。

本文则主要把基于Google Maps的扩展库MarkerClusterer迁移到百度地图API上来,参考了v2v3的源码,但做了不少改动。比如抽象出来了ClusterMarker这个自定义覆盖物类,使其不依赖于MarkerClusterer的算法,可单独加以使用。删除了MarkerClustererOverlay的继承关系,因为根本不必要。最终结果图示如下,在线示例链接。(源码你找得到)

MarkerCluster之百度地图版_第1张图片

解释一下源码和重要接口。MarkerClusterer类,也即“标记聚合器”类,其实是个“管理器”,负责把根据一定的参数设置,把地图上的点标记,按照算法进行聚合,并加载到地图上呈现出来。ClusterMarker类,也即“聚合标记”类,是一种自定义覆盖物,一种复杂的标记,类似Marker,可参考前面铺垫的文章“自定义覆盖物”。而Cluster类,则联系二者,起一个桥梁的作用,一个Cluster含有多个聚合在一起的Marker,最终在地图上的表现形式就是一个ClusterMarker

构造函数:MarkerClusterer(map, opt_markers, opt_options): map的描述略。

opt_markers 就是往地图上添加的诸多点标记,之所以定位可选参数,是因为还提供了addMarkeraddMarkers等方法动态添加标记的接口。对应的,还有removeMarkerremoveMarkersclearMarkers等删除和清除点标记的接口。不管是动态的添加还是删除,会默认的重新进行Cluster的计算,除非对可算参数强制声明则不加以重新计算。还附件提供了getMarkersgetMarkersCount的方法方便使用。

Opt_options里有gridSize来控制点聚合的像素范围,默认是60maxZoom是控制聚合的最大缩放级别,也即到哪一级就全部散开了,默认是18,就是百度地图支持的最大级别。averageCenter则是控制聚合到一块的这些Marker,聚成一个后的位置,是否取所有点标记的位置的平均数,否的话直接取第一个的位置,默认falseminClusterSize控制最小Cluster包含的数量,也就是说小于这个数,就不能组成为一个Cluster,默认是2styles则是控制CluserMarker的样式外观。基本上都有对应的get/set方法来控制。但动态改变后,需调用刷新接口来自动重绘。

其他的还有getClustersCount来获取当前视图下的Cluster数量。由于为了提高性能,不在视图内的点标记,是不参与聚合计算的。因此这个ClustersCount不仅与缩放级别有关,就是在平移地图,改变地图视野的情况下,也会发生变化。(原文链接

你可能感兴趣的:(cluster)