百度地图MarkerClusterer点过多时卡顿问题

问题原因:由于百度地图不断渲染DOM的原因导致点过多时,会出现地图卡顿问题

卡顿代码:

    /**
     * 向该聚合添加一个标记。
     * @param {Marker} marker 要添加的标记。
     * @return 无返回值。
     */
Cluster.prototype.addMarker = function(marker){
    if(this.isMarkerInCluster(marker)){
            return false;
        }//也可用marker.isInCluster判断,外面判断OK,这里基本不会命中
    
        if (!this._center){
            this._center = marker.getPosition();
            this.updateGridBounds();//
        } else {
            if(this._isAverageCenter){
                var l = this._markers.length + 1;
                var lat = (this._center.lat * (l - 1) + marker.getPosition().lat) / l;
                var lng = (this._center.lng * (l - 1) + marker.getPosition().lng) / l;
                this._center = new BMap.Point(lng, lat);
                this.updateGridBounds();
            }//计算新的Center
        }
    
        marker.isInCluster = true;
        this._markers.push(marker);
        
        /* 卡顿代码 */
        var len = this._markers.length;
        if(len < this._minClusterSize ){     
            this._map.addOverlay(marker);
            //this.updateClusterMarker();
            return true;
        } else if (len === this._minClusterSize) {
            for (var i = 0; i < len; i++) {
                this._markers[i].getMap() && this._map.removeOverlay(this._markers[i]);
            }
            
        } 
        this._map.addOverlay(this._clusterMarker);
        this._isReal = true;
        this.updateClusterMarker();
        return true;
        /* 卡顿代码 */
    };
};

如代码所示,注释位置正是罪魁祸首,会在创建marker时不断渲染DOM

解决方法:

1.将注释位置分离出来重新给cluster类加一个方法,计算完成后在进行操作

Cluster.prototype.render = function(){
    var len = this._markers.length;
         
    if (len < this._minClusterSize) {
            for (var i = 0; i < len; i++) {
                this._map.addOverlay(this._markers[i]);
            }
    } else {
            this._map.addOverlay(this._clusterMarker);
            this._isReal = true;
            this.updateClusterMarker();
    }
}

2.render方法使用位置,修改方法_createClusters 

/**
     * 根据所给定的标记,创建聚合点,并且遍历所有聚合点
     * @return 无返回值
     */
    MarkerClusterer.prototype._createClusters = function(){
        var mapBounds = this._map.getBounds();
        var extendedBounds = getExtendedBounds(this._map, mapBounds, this._gridSize);
        for(var i = 0, marker; marker = this._markers[i]; i++){
            if(!marker.isInCluster && extendedBounds.containsPoint(marker.getPosition()) ){
                this._addToClosestCluster(marker);
            }
        }

        var len = this._markers.length;
        for (var i = 0; i < len; i++) {
            if(this._clusters[i]){
                this._clusters[i].render();
            }
        }
    };

最后附上修改后的源码,可直接复制使用

/**
 * @fileoverview MarkerClusterer标记聚合器用来解决加载大量点要素到地图上产生覆盖现象的问题,并提高性能。
 * 主入口类是<a href="symbols/BMapLib.MarkerClusterer.html">MarkerClusterer</a>,
 * 基于Baidu Map API 1.2。
 *
 * @author Baidu Map Api Group
 * @version 1.2
 */


/**
 * @namespace BMap的所有library类均放在BMapLib命名空间下
 */
var BMapLib = window.BMapLib = BMapLib || {};
(function(){

    /**
     * 获取一个扩展的视图范围,把上下左右都扩大一样的像素值。
     * @param {Map} map BMap.Map的实例化对象
     * @param {BMap.Bounds} bounds BMap.Bounds的实例化对象
     * @param {Number} gridSize 要扩大的像素值
     *
     * @return {BMap.Bounds} 返回扩大后的视图范围。
     */
    var getExtendedBounds = function(map, bounds, gridSize){
        bounds = cutBoundsInRange(bounds);
        var pixelNE = map.pointToPixel(bounds.getNorthEast());
        var pixelSW = map.pointToPixel(bounds.getSouthWest());
        pixelNE.x += gridSize;
        pixelNE.y -= gridSize;
        pixelSW.x -= gridSize;
        pixelSW.y += gridSize;
        var newNE = map.pixelToPoint(pixelNE);
        var newSW &#
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
百度地图海量标注点顿可能是由于以下几个原因导致的: 1. 数据量过大:当标注点数量过多时,地图加载和渲染的速度会变慢,从而导致顿。这可能是因为您在地图上添加了大量的标注点,超出了地图的处理能力。 2. 硬件性能不足:如果您的设备硬件性能较低,例如内存不足或者处理器速度较慢,也会导致地图顿。在这种情况下,建议您尝试在性能更好的设备上使用百度地图。 3. 网络问题:如果您的网络连接不稳定或者速度较慢,地图数据加载的速度会受到影响,从而导致顿。请确保您的网络连接良好,并尝试在网络环境较好的情况下使用百度地图。 解决这个问题的方法有以下几种: 1. 数据分批加载:如果您需要展示大量的标注点,可以考虑将数据进行分批加载,只加载当前视图范围内的标注点,而不是一次性加载全部数据。 2. 使用聚合功能:百度地图提供了标注点聚合功能,可以将附近的标注点合并成一个聚合点,从而减少标注点的数量,提高地图的加载和渲染速度。 3. 优化代码逻辑:检查您的代码逻辑是否存在性能瓶颈或者不必要的计算操作,尽量减少不必要的操作,优化代码性能。 4. 更新设备或网络环境:如果您的设备硬件性能较低或者网络环境较差,考虑升级设备或者改善网络环境,以提高地图的加载和渲染速度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值