感谢您发布一个块,这使测试变得更容易。
我通过为您的每一行生成 200 行 ~ 46k 行来模拟更多的点。我在 100x ~ 23k 行(2017 iMac 有大量 RAM)时只看到了一点点卡顿。
Leaflet.markercluster 以超过 10K 点而闻名。Leaflet.markercluster 使用 46k 行大约需要 475 毫秒来清除和添加 Leaflet 层:
由于 JavaScript 中只有一个线程(除非您使用工作线程),因此 D3 需要requestAnimationFrame
每 16 毫秒左右(实际上)获得一次超时以产生流畅的动画。
一种解决方法是将地图重绘延迟 500 毫秒,直到其他人完成:
dc.override(mapChart, 'redraw', function() {
window.setTimeout(() => mapChart._redraw(), 500);
});
使用解决方法分叉您的块。
当然,这也使得地图重绘的时间增加了 500 毫秒。而且,如果您单击得足够快,则在尝试绘制图表时,最后一次地图重绘仍将运行。
您也可以尝试分块的 addLayers 选项,但我认为您必须将 chunkedInterval 设置得如此之低,以至于它也会减慢标记集群的速度。
在 JavaScript 中有效地处理这么多数据是可能的——显然交叉过滤器在这里没有问题。我不知道回廊算法是否天生就太昂贵了。有人在这个问题上建议预先汇总这些点,但我认为这意味着您将无法看到单个点。