javascript - 如何准确缩放已经翻译的d3 map

标签 javascript canvas d3.js translate

我有一张 map ,它已经过翻译以适合 Canvas 。

我正在尝试实现一种缩放它的方法并且它确实有效,但是当您放大时它会远离中心,而不是在鼠标甚至 Canvas 上居中。

这是我的代码:

function map(data, total_views) {
  var xy = d3.geo.mercator().scale(4350),
      path = d3.geo.path().projection(xy),
      transX = -320,
      transY = 648,
      init = true;

  var quantize = d3.scale.quantize()
    .domain([0, total_views*2/Object.keys(data).length])
    .range(d3.range(15).map(function(i) { return "map-colour-" + i; }));

  var map = d3.select("#map")
        .append("svg:g")
        .attr("id", "gb-regions")
        .attr("transform","translate("+transX+","+transY+")")
        .call(d3.behavior.zoom().on("zoom", redraw));

  d3.json(url_prefix + "map/regions.json", function(json) {
    d3.select("#regions")
        .selectAll("path")
            .data(json.features)
        .enter().append("svg:path")
            .attr("d", path)
            .attr("class", function(d) { return quantize(data[d.properties.fips]); });
  });

  function redraw() {
    var trans = d3.event.translate;
    var scale = d3.event.scale;

    if (init) {
      trans[0] += transX;
      trans[1] += transY;
      init = false;
    }
    console.log(trans);

    map.attr("transform", "translate(" + trans + ")" + " scale(" + scale + ")");
  }
}

我发现将初始翻译添加到新翻译 (trans) 对第一次缩放有效,但对于所有后续缩放,它会使情况变得更糟。有什么想法吗?

最佳答案

这是一个全面的起点:semantic zooming of force directed graph in d3

这个例子特别帮助了我(只是撕掉所有小 map 的东西以使其更简单):http://codepen.io/billdwhite/pen/lCAdi?editors=001

 var zoomHandler = function(newScale) {
        if (!zoomEnabled) { return; }
        if (d3.event) {
            scale = d3.event.scale;
        } else {
            scale = newScale;
        }
        if (dragEnabled) {
            var tbound = -height * scale,
                bbound = height  * scale,
                lbound = -width  * scale,
                rbound = width   * scale;
            // limit translation to thresholds
            translation = d3.event ? d3.event.translate : [0, 0];
            translation = [
                Math.max(Math.min(translation[0], rbound), lbound),
                Math.max(Math.min(translation[1], bbound), tbound)
            ];
        }

        d3.select(".panCanvas, .panCanvas .bg")
            .attr("transform", "translate(" + translation + ")" + " scale(" + scale + ")");

        minimap.scale(scale).render();
    }; // startoff zoomed in a bit to show pan/zoom rectangle

虽然我不得不稍微调整一下该函数以使其适用于我的情况,但想法就在那里。这是我的一部分。 (E.range(min,max,value) 只是将 value 限制在 min/max 范围内。这些变化主要是因为在这种情况下我将 0,0 视为屏幕的中心。

// limit translation to thresholds
            var offw = width/2*scale;
            var offh = height/2*scale;
            var sw = width*scale/2 - zoomPadding;
            var sh = height*scale/2- zoomPadding;

            translate = d3.event ? d3.event.translate : [0, 0];
            translate = [
                E.range(-sw,(width+sw), translate[0]+offw),
                E.range(-sh,(height+sh), translate[1]+offh)
            ];
        }


        var ts = [translate[0], translate[1]];
        var msvg  = [scale, 0, 0, scale, ts[0], ts[1]];

关于javascript - 如何准确缩放已经翻译的d3 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13802218/

相关文章:

javascript - TypeScript:尝试访问 Enum 时没有参数类型为 'string' 的索引签名

javascript - Raphael JS for 循环中的鼠标事件

javascript - 使用 Web 套接字将 Canvas 内容从客户端传递给管理员

javascript - JavaScript 中的 Vimeo API GET 请求

javascript - 三个 js Canvas 纹理使用 WebGL 渲染器丢失透明度(使用 Canvasrenderer 可以)

javascript - Angularjs访问本地json文件

javascript - 将 d3.js Canvas 附加到 div

javascript - 在 d3 中隐藏带有转换的工具提示

javascript - 无法让谷歌地图 computeDistanceBetween() 返回一个值

GWT Canvas2D 绘制图像