You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MarkerClusterer调用clearMarkers时避免地图重渲染?

问题根源与解决方案

为什么clearMarkers({noDraw: true})仍会让标记消失?

clearMarkers方法的noDraw参数仅用于阻止聚类器执行重绘聚类组的逻辑(即重新计算聚类、渲染聚合标记),但该方法本身会遍历所有标记并调用marker.setMap(null),直接将标记从地图上移除——这才是地图变空白的核心原因,和noDraw参数无关。

实现「保留旧标记直到添加新标记」的正确流程

要避免地图空白,需要确保旧标记在新标记渲染完成前一直保留在地图上,具体步骤如下:

  1. 保存旧标记并从聚类器中移除(保留在地图)
    先获取当前聚类器中的标记,逐个从聚类器移除但不删除地图上的显示:

    // 保存旧标记到临时变量
    const oldMarkers = [...clusti.getMarkers()];
    
    // 从聚类器移除旧标记,noDraw: true避免触发重绘
    oldMarkers.forEach(marker => {
      clusti.removeMarker(marker, { noDraw: true });
    });
    
  2. 添加新标记并触发聚类重绘
    将新标记加入聚类器后手动触发渲染:

    // 添加新标记,noDraw: true暂不重绘
    clusti.addMarkers(newMarkers, { noDraw: true });
    
    // 触发聚类器重绘,渲染新标记与聚合组
    clusti.render();
    
  3. 移除旧标记(可选)
    等新标记渲染完成后,再将旧标记从地图上移除:

    oldMarkers.forEach(marker => marker.setMap(null));
    

优化替代方案:使用replaceMarkers

如果需要完全替换标记集合,可以用replaceMarkers简化流程,同样结合临时保留旧标记的逻辑:

const oldMarkers = [...clusti.getMarkers()];

// 替换标记集合,noDraw: true暂不重绘
clusti.replaceMarkers(newMarkers, { noDraw: true });

// 触发重绘
clusti.render();

// 清理旧标记
oldMarkers.forEach(marker => marker.setMap(null));

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:31:12