一种简单的地图聚合算法

百度地图的聚合算法

这段百度算法的描述来自博客:https://blog.csdn.net/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 = createBoundsFromSpan(candidate.getPoint(), zoomSpecificSpan);//这个就是我们说的,根据给定距离生成一个框框
                Collection<QuadItem<T>> clusterItems;
    
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Redis是一款基于内存的NoSQL数据库,具有高速读写、支持多种数据结构、分布式等优点。Redis地图聚合数据示例代码是一种使用Redis实现的网格聚合算法,能够对经纬度数据进行聚合,实现地图上的数据可视化和统计。 具体实现步骤如下: 1. 创建Redis数据结构:使用Redis的有序集合(set)数据结构,将经纬度数据转化为定点数,并保存在有序集合中,同时将数据的ID作为有序集合中的分值。 2. 确定网格大小:根据地图的缩放级别和网格聚合算法的需要,确定每个网格的大小(宽度和高度)。可以根据经纬度数据的分布情况和需要展示的精度等因素灵活调节。 3. 确定网格对应的键名:为每个网格赋予一个唯一的键名。可以使用类似“grid:row:column”的格式,并采用哈希表(hash)数据结构进行存储。 4. 数据聚合:将有序集合中的经纬度数据依次进行聚合。对每个数据点计算其所在的网格的行数和列数,通过拼接键名,得到网格对应的哈希键值,将数据ID和分值存入哈希表中。 5. 数据展示:网格聚合算法可以实现在地图上显示聚合数据的热力图效果。可以使用类似Google Maps APIs的地图API,在前端实现聚合数据的可视化效果。 此外还可以根据具体应用需要,添加更多的功能和优化,如动态聚合、异步存储等。 通过使用Redis地图聚合数据示例代码的方式,可以快速、简便地实现大数据量的经纬度数据聚合,支持多种应用场景,如人流、车流、商业活动等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值