热力图数据更新后图层不刷新怎么办
在用Leaflet+Heatmap.js做实时热力图时遇到个怪问题:后端返回的新数据能正确接收,但调用heatmap.setData(newData).redraw()后图层完全没变化,只能刷新整个页面才更新。之前初始化的时候是这样写的:
var heatmap = L.heatLayer([], {radius:20}).addTo(map);
function updateHeat(data) {
heatmap.setData(data);
heatmap.redraw();
}
尝试过把redraw改成map.invalidateSize()也不行,控制台没有任何报错,数据长度显示正常。是不是图层需要重新添加到地图上才能刷新?这样操作会不会影响性能?
var heatmap = L.heatLayer([], {radius:20}).addTo(map);
function updateHeat(data) {
heatmap.setLatLngs([]);
heatmap.setLatLngs(data);
}
搞定,这样就不用重新添加图层了,性能也比移除重建好。别问我怎么知道的,踩过坑。
这样每次更新数据的时候会重新创建图层,虽然看起来有点暴力,但能保证热力图正确刷新。性能方面不用担心,Leaflet处理这种操作还是挺快的。
如果数据更新频率特别高,建议加个防抖处理,比如用lodash的debounce包一下updateHeat函数。我之前也被这问题坑过,就这样解决的。