javascript - 如何在 Canvas 上使用 d3 放大 map ?

标签 javascript d3.js canvas

一些背景: 我已经绘制了一张 map ,上面有大约 35k 个圆圈,缩放和工具提示在 SVG 上运行良好。但是,由于需要绘制的圆圈数量(并且可能不是最好的编写代码;我是初学者),我在让页面运行时遇到了性能问题。 因此,我想在 Canvas 上尝试相同的页面以提高性能。

问题: 我让 map 本身在 Canvas 上工作,但我一直在尝试添加缩放功能,但没有成功。任何帮助解决这个问题的帮助将不胜感激。

带有 SVG 的示例 - https://bl.ocks.org/sharad-vm/af74ae5932de1bcf5a39b0f3f849d847

我的 Canvas 代码如下:

        //Width and height
        var w = 700;
        var h = 600;

          //Create Canvas element
        var canvas = d3.select('#map')
                      .append('canvas')
                      .attr('width', w)
                      .attr('height', h);

        var context = canvas.node().getContext('2d');

        //Define map projection
        var projection = d3.geo.mercator()
                               .translate([w/2, h/1.72])
                               .scale([100]);


        //Define path generator
        var path = d3.geo.path()
                         .projection(projection)
                         .context(context);

        var init = 0;

        canvas.call(zoom);

        var zoom = d3.behavior.zoom()
                    .translate([0, 0])
                    .scale(1)
                    .scaleExtent([1, 30])
                    .on("zoom", zoomed);

        //function to zoom
        function zoomed() {
         context.save();
         context.clearRect(0, 0, w, h);
         context.translate(d3.event.transform.x, d3.event.transform.y);
         context.scale(d3.event.transform.k, d3.event.transform.k);
         draw();
         context.restore();
         };

        draw();  

        //Load in GeoJSON data
        function draw() {
          ...
        }

最佳答案

使用投影时,使缩放正常工作的秘诀是变换投影本身。对于您的示例,您可以在重绘之前调整投影,例如:

projection.translate([w/2 + d3.event.transform.x, h/1.72 + d3.event.transform.y]) .scale([100*d3.event.transform.k]);

另一种选择是缩放 Canvas 本身,like in this example I made

关于javascript - 如何在 Canvas 上使用 d3 放大 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46991442/

相关文章:

javascript - 包含范围内的 javascript 库

javascript - 在路径表面外绘制轮廓

javascript - 数据 URI 在 Firefox 上不显示

javascript - 3秒后重定向至主页

Angular 路由器内的 Javascript

javascript - 如何: ServiceWorker check if ready to update

javascript - 另一个D3向强制有向图添加文本

javascript - 将 Bootstrap 工具提示与 SVG 对象一起使用 - 尽管指定了容器但不显示

javascript - D3 - 以设定的延迟逐行加载并显示数据

javascript - Canvas :将圆拆分为水平条