百度地图的聚合算法
这段百度算法的描述来自博客:https://blog.youkuaiyun.com/javine/article/details/51195014
总结如下:
百度地图把整个地球是按照一个平面来展开,把整个地球按照平面来展开之后,我们就能算出这个地球平面的宽度,也就是世界宽度。
计算公式是这样的:256*(zoom^2) == worldWidth
其中zoom就是地图的层级,我们缩放地图也是根据zoom的变化来判断是放大还是缩小的。这样可以把不利于计算的经纬度position转换成我们熟悉的二维坐标point。
而一个二维坐标中有若干个点,把它们按照一个给定的distance来进行分组。
迭代所有的QuadItem,以此QuadItem为中心画一个框框,框框里面的点就算是一个cluster簇,
也就是可以聚合成一个点的QuadItems。框框的大小就是我们定义的可以执行聚合的距离。
当然,这话其实并不准确,会有些点同时被好多个框框给框住,那就算距离最小的那个cluster里面的点。
/**
* cluster算法核心
* @param zoom map的级别
* @return
*/
@Override
public Set<? extends Cluster<T>> getClusters(double zoom) {
final int discreteZoom = (int) zoom;
final double zoomSpecificSpan = MAX_DISTANCE_AT_ZOOM / Math.pow(2, discreteZoom) / 256;//定义的可进行聚合的距离
final Set<QuadItem<T>> visitedCandidates = new HashSet<QuadItem<T>>(); //遍历QuadItem时保存被遍历过的Item
final Set<Cluster<T>> results = new HashSet<Cluster<T>>(); //保存要返回的cluster簇,每个cluster中包含若干个MyItem对象
final Map<QuadItem<T>, Double> distanceToCluster = new HashMap<QuadItem<T>, Double>(); //Item --> 此Item与所属的cluster中心点的距离
final Map<QuadItem<T>, mapapi.clusterutil.clustering.algo.StaticCluster<T>> itemToCluster =
new HashMap<QuadItem<T>, mapapi.clusterutil.clustering.algo.StaticCluster<T>>(); //Item对象 --> 此Item所属的cluster
synchronized (mQuadTree) {
for (QuadItem<T> candidate : mItems) {<span style="white-space:pre"> </span>//遍历所有的QuadItem
if (visitedCandidates.contains(candidate)) {<span style="white-space:pre"> </span>//如果此Item已经被别的cluster框住了,就不再处理它
continue;
}
Bounds searchBounds = createBoundsFromSpa