【问题标题】:Zoom on multiple areas in d3.js放大 d3.js 中的多个区域
【发布时间】:2013-06-28 21:02:39
【问题描述】:

我计划在我的 svg 中与其他 svg 元素一起放置一个 geoJSON 地图。我希望能够在地图中缩放(缩放+平移)并将地图与边界框保持在同一位置。我可以通过使用 clipPath 将地图保持在矩形区域内来实现这一点。问题是我还想在我的整个 svg 上启用缩放和平移。如果我这样做 d3.select("svg").call(myzoom);这会覆盖我应用于地图的任何缩放。如何将缩放应用于整个 svg 和地图?也就是说,当我的鼠标在地图的边界框内时,我希望能够在我的地图上缩放+平移,当鼠标在边界框外时,在整个 svg 上缩放+平移。

这里是示例代码:http://bl.ocks.org/nuernber/aeaac0e8edcf7ca93ade

<svg id="svg" width="640" height="480" xmlns="http://www.w3.org/2000/svg" version="1.1">
  <defs>
    <clipPath id="rectClip">
      <rect x="150" y="25" width="400" height="400" style="stroke: gray; fill: none;"/>
    </clipPath>
  </defs>
  <g id="outer_group">
    <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red" />
    <g id="svg_map" style="clip-path: url(#rectClip);">
    </g>
  </g>
</svg><br/>
<script type="text/javascript">
  var svg = d3.select("#svg_map");
  var mapGroup = svg.append("g");
  var projection = d3.geo.mercator();
  var path = d3.geo.path().projection(projection);

  var zoom = d3.behavior.zoom()
      .translate(projection.translate())
      .scale(projection.scale())
      .on("zoom", zoomed);
  mapGroup.call(zoom);

  var pan = d3.behavior.zoom()
      .on("zoom", panned);
  d3.select("svg").call(pan);

  mapGroup.attr("transform", "translate(200,0) scale(2,2)");
  d3.json("ne_110m_admin_0_countries/ne_110m_admin_0_countries.geojson", function(collection) {
      mapGroup.selectAll("path").data(collection.features)
        .enter().append("path")
        .attr("d", path)
        .attr("id", function(d) { return d.properties.name.replace(/\s+/g, "")})
        .style("fill", "gray").style("stroke", "white").style("stroke-width",1);
    }
  );

  function panned() {
    var x = d3.event.translate[0];
    var y = d3.event.translate[1];
    d3.select("#outer_group").attr("transform", "translate("+x+","+y+") scale(" + d3.event.scale + ")");
  }

  function zoomed() {
    previousScale = d3.event.scale;
    projection.translate(d3.event.translate).scale(d3.event.scale);
    translationOffset = d3.event.translate;
    mapGroup.selectAll("path").attr("d", path);
  }
</script>

【问题讨论】:

    标签: svg d3.js zooming geojson


    【解决方案1】:

    为此,您需要两个 zoom 行为。第一个将附加到 SVG,第二个附加到地图。在缩放处理程序中,您必须注意为每个处理程序采取适当的操作。

    【讨论】:

    • 我编辑了上面的帖子以显示我的代码。使用两种缩放行为似乎无法正常工作。缩放适用于 svg 和地图(组)。但是平移在地图上不起作用。此外,我不想在鼠标悬停在地图上时应用缩放。
    • 您是否尝试过将pan 应用于#outer_group 而不是整个SVG?平移地图如何不起作用?
    • 将 pan 应用到 #outer_group 有奇怪的行为。地图根本不平移,但会缩放。
    • 是的,如果我关闭 svg 的缩放。这是一个更好的链接:bl.ocks.org/nuernber/aeaac0e8edcf7ca93ade
    • 嗯,在我看来,拥有一个单独的地图和 SVG 会更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    相关资源
    最近更新 更多