D3放大世界地图上的弹出窗口大小

时间:2015-02-10 04:15:35

标签: javascript d3.js zoom force-layout

在我的D3世界地图上,我有一个名为" main"的父母svg:g组。它有两个svg:g元素,一个用于国家,另一个用于弹出窗口。

我在svg:g元素下绘制国家路径,名为" countries"。在svg:g下调用" popups",我使用d3强制布局绘制弹出窗口节点,将多个标注显示为矩形。

点击任意国家/地区都会将该国家/地区缩放到屏幕大小。 zoom to bounding box, Mike bostok。如果我在svg:g"国家"因为我不希望弹出窗口缩放,因为它们会变得特别大。

由于较小国家的Boundingbox规模较大,而较大的国家规模较小。

现在我应该如何计算Svg:g" popups"的翻译和比例,以便弹出窗口的矩形大小和字体保持相同。

1 个答案:

答案 0 :(得分:1)

通过使用公式,它就像一个魅力: [应用缩放后的位置] *(1 - scalePopup)。 请参阅下文,了解如何计算变量scalePopup

  var bounds = path.bounds(d),
        dx = bounds[1][0] - bounds[0][0],
        dy = bounds[1][1] - bounds[0][1],
        x = (bounds[0][0] + bounds[1][0]) / 2,
        y = (bounds[0][1] + bounds[1][1]) / 2;

    var scale = countryZoomScale(Math.max(dx, dy)) / Math.max(dx / width, dy / height),
        translate = [width / 1.5 - scale * x, height / 2 - scale * y];

    var scalePopup = map.zoomFactor / scale;
    var popupLayer = d3.select('.popupLayer');
    var centroid = path.centroid(d);

    popupLayer.attr("transform", "translate(" + centroid[0] * (1 -      scalePopup) + "," + centroid[1] * (1 - scalePopup) + ")scale(" + scalePopup + ")");