【问题标题】:How to render a d3.js map on canvas free of blurriness如何在没有模糊的画布上渲染 d3.js 地图
【发布时间】:2016-05-18 21:47:12
【问题描述】:

尽我所能,我无法在不导致地图明显模糊的情况下渲染 d3.js 县级地图。

我正在使用通常的技巧:我的canvas 样式宽度是我的属性宽度的一半。我将绘图的上下文翻译半个像素以抵消任何不需要的效果。

但它仍然非常模糊。

有人可以分享为canvas 元素制作的清晰 d3.js 地图的模式吗?

function drawQuintiles() {
  var width = 960,
    height = 500;

  var projection = d3.geo.albers()
      .scale(666);


  var canvas = d3.select("#quintiles")
          .append("canvas")
            .attr("class",'canvasarea');
  var context = canvas.node().getContext("2d");

  var ratio = (window.devicePixelRatio / context.webkitBackingStorePixelRatio) || 1;

  d3.select('.canvasarea')
                .attr("width", width * ratio).attr("height", height * ratio)
                .style("width", width + "px").style("height", height + "px");


   context.scale(ratio, ratio);

  var path = d3.geo.path()
      .projection(projection)
      .context(context);

  d3.json("/data/us-counties.json", function(error, us) {
    if (error) throw error;

    context.strokeStyle = '#333';

    context.beginPath();

    var strokeWidth = 0.5;

    var iTranslate = (strokeWidth % 2) / 2;
    context.translate(iTranslate, 0);

    context.lineWidth = strokeWidth;
    context.lineCap = "round";

    path(topojson.feature(us, us.objects.counties));
    context.stroke();
  });
}

【问题讨论】:

    标签: html dictionary canvas d3.js blurry


    【解决方案1】:

    这是我结束的代码。删除比例和翻译技巧可以正确呈现地图。

    function drawQuintiles() {
      var width = 1600;
    
      d3.json("/data/us-counties.json", function(error, data) {
    
        var projection = d3.geo.albersUsa();
    
        var path = d3.geo.path().projection(projection);
    
        var tracts = topojson.feature(data, data.objects.counties);
    
        projection.scale(1).translate([0, 0]);
    
        var b = path.bounds(tracts);
    
        var whRatio = ((b[1][0] - b[0][0]) / (b[1][1] - b[0][1]));
    
        var height = (width / 2) * whRatio;
    
    
        var s = .98 / Math.max((b[1][0] - b[0][0]) / width, (b[1][1] - b[0][1]) / height),
          t = [(width - s * (b[1][0] + b[0][0])) / 2, (height - s * (b[1][1] + b[0][1])) / 2];
    
        projection.scale(s).translate(t);
    
    
        var canvas = d3.select("#quintiles")
                .append("canvas")
                  .attr("class",'canvasarea');
        var context = canvas.node().getContext("2d");
    
    
    var ratio = window.devicePixelRatio || 1;
    
    d3.select('.canvasarea')
                  .attr("width", width ).attr("height", height )
                  .style("width", ((width * ratio) ) + "px").style("height", ((height * ratio) ) + "px");
    
    
        var path = d3.geo.path()
            .projection(projection)
            .context(context);
    
    
        if (error) throw error;
    
        context.strokeStyle = '#333';
    
        context.beginPath();
    
        var strokeWidth = 0.5;
    
        context.lineWidth = strokeWidth;
        context.lineCap = "round";
    
        path(topojson.feature(data, data.objects.counties));
        context.stroke();
      });
    }
    
    drawQuintiles();
    

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 2015-03-06
      • 2017-06-05
      • 2013-02-18
      • 2021-06-30
      • 2019-05-07
      相关资源
      最近更新 更多