1

我最近构建了一个包含 crossfilter、dc.js 和 Leaflet.markerCluster 的原型数据浏览器的较小版本。小版本(原型仪表板)可以正常工作。我遇到的问题是当我尝试将其扩展到 20k 点或更多时。

图表仍然正确呈现,并且地图可以在缩放或平移时平滑地更新图表,但是当我与其中一个图表交互时,其他图表之间的过渡不再平滑。他们跳到下一个位置,而不是平稳过渡。

我尝试删除地图,这将其他图表之间的转换再次恢复为平滑的转换。

我想知道每次发生交互时重新渲染过程是否会赶上 20k 点。

如果有人对我可以在哪里寻找解决方案有任何建议,我将不胜感激。

4

1 回答 1

0

感谢您发布一个块,这使测试变得更容易。

我通过为您的每一行生成 200 行 ~ 46k 行来模拟更多的点。我在 100x ~ 23k 行(2017 iMac 有大量 RAM)时只看到了一点点卡顿。

Leaflet.markercluster 以超过 10K 点而闻名。Leaflet.markercluster 使用 46k 行大约需要 475 毫秒来清除和添加 Leaflet 层:

markercluster 火焰图

由于 JavaScript 中只有一个线程(除非您使用工作线程),因此 D3 需要requestAnimationFrame每 16 毫秒左右(实际上)获得一次超时以产生流畅的动画。

一种解决方法是将地图重绘延迟 500 毫秒,直到其他人完成:

  dc.override(mapChart, 'redraw', function() {
      window.setTimeout(() => mapChart._redraw(), 500);
  });

使用解决方法分叉您的块

当然,这也使得地图重绘的时间增加了 500 毫秒。而且,如果您单击得足够快,则在尝试绘制图表时,最后一次地图重绘仍将运行。

您也可以尝试分块的 addLayers 选项,但我认为您必须将 chunkedInterval 设置得如此之低,以至于它也会减慢标记集群的速度。

在 JavaScript 中有效地处理这么多数据是可能的——显然交叉过滤器在这里没有问题。我不知道回廊算法是否天生就太昂贵了。有人在这个问题上建议预先汇总这些点,但我认为这意味着您将无法看到单个点。

于 2019-11-08T18:47:13.570 回答