使用 JavaScript 绘制超过 10 万个节点的组织结构图的最佳方法

2024-01-12

谁能建议我如何绘制超过 100k 个节点的组织结构图,而不会遇到浏览器崩溃或无响应页面错误的问题。

注意:它是二叉树图表,因此每个父节点只有两个子节点

到目前为止我已经做了什么:

1) 使用 google Charts API 绘制图表:

失败:即使我在每个 ajax 调用上加载 5k 节点,节点限制超过 20k 左右时也会失败

2)画布和svg:

  • 使用 d3.js :当节点大小约为 50-100 时它工作正常,但当加载 20k 或更多时失败。虽然它使用 SVG 构建图表,但主要缺点是管理节点路径

所以请有人帮我弄清楚,所有 js、canvas、svg 对于小数据都可以正常工作,但对于大数据都失败了

这就是大数据应该如何绘制图表。


下面是渲染 100K 个项目但仅渲染可见项目的示例。您的图表应该执行类似的操作,其中您的视图区域比图表更小,并且仅渲染您正在查看的部分。

update添加了 x、y 偏移量以显示渲染区域。

var can = document.getElementById('can');
var ctx = can.getContext('2d');
var n = 100000;

var t_x = 0;
var t_y = 0;
t_x_incr = 2;
t_y_incr = 2;


var frames = 0
var fps = "- fps";

setInterval(function() {
  fps = frames + " fps";
  frames = 0;
}, 1000);

function render() {
  frames++;
  ctx.save();
  ctx.fillStyle = "#eeeeee";
  ctx.fillRect(0, 0, can.width, can.height);
  ctx.fillStyle = "black";
  ctx.translate(-t_x, -t_y);
  var x = 0;
  var y = 0;

  var w = 100;
  var h = 20;

  var chart_w = w * 3000;
  var chart_h = Math.ceil((n / 3000) * h);

  var min_x = t_x - w;
  var min_y = t_y - h;
  var max_x = t_x + can.width;
  var max_y = t_y + can.height;

  for (var i = 0; i < n; i++) {

    // only draw when visible
    if (x >= min_x && x <= max_x && y >= min_y && y <= max_y) {
      ctx.strokeRect(x, y, w, h);
      ctx.fillText(i, x + 5, y + 13);
    }

    x += w;
    if (x >= chart_w) x = 0, y += h;
  }
  t_x += t_x_incr;
  t_y += t_y_incr;
  if (t_x >= chart_w || t_x <= 0) t_x_incr *= -1;
  if (t_y >= chart_h || t_y <= 0) t_y_incr *= -1;
  ctx.restore();
  ctx.fillStyle = "white";
  ctx.fillRect(7, 2, 80, 20);
  ctx.fillStyle = "red";
  ctx.fillText(fps, 10, 10);
  ctx.fillText("x: " + t_x + ", y: " + t_y, 10,20);
  requestAnimationFrame(render);
}

render();
<canvas id="can" width="300" height="200"></canvas>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JavaScript 绘制超过 10 万个节点的组织结构图的最佳方法 的相关文章

随机推荐