D3将元素添加到缩放地图

时间:2013-05-23 18:31:21

标签: javascript svg d3.js maps

我有一张地图,其中点击图例时会显示圆圈(人物的原点)。

此外,可以放大,然后转换圆圈(和国家/地区路径)(使用d3.behavior.zoom)。

但是,如果我首先放大,然后点击图例,圈子就不会出现在正确的位置。如何解决此问题并将其附加到正确的坐标处(在缩放的地图内)。

有什么想法吗?我确信解决方案并不困难,但我被困了。

请参阅(http://wahrendorf.de/circlemapping/world_question.html)以获取示例。

谢谢,

的Morten

1 个答案:

答案 0 :(得分:0)

绘制圆圈时,您需要考虑d3.event.translated3.event.scale。最简单的方法是将缩放功能分解出来,以便圆绘图功能可以调用它。

var translate = [0,0];
var scale = 1;
var zoom_function = function() {
    canvas.selectAll("path")
             .attr("transform","translate("+translate.join(",")+")scale("+scale+")");

    canvas.selectAll("circle.origin")
             .attr("transform","translate("+translate.join(",")+")scale("+scale+")")
             .attr("r", function(d) { return radius/scale; });
};
var zoom = d3.behavior.zoom().scaleExtent([1,6])
           .on("zoom",function() {
              translate = d3.event.translate;
              scale = d3.event.scale;
              zoom_function();
});

// ... The rest of the code ...

canvas.append("text")
      .text("show circles")
      .attr("x", 30 ) .attr("y", 480 )
      .attr("dy", ".35em")
      .on("click", function(d)  {
          /// load data with long/lat of circles
          d3.csv("./World_files/places_q.csv", function(error, origin) {
              canvas.selectAll("circle.origin").remove();
              canvas.selectAll("circle.origin")
            .data(origin)
                    .enter()
                    .append("circle")
                    .attr("cx", function(d) {return projection([d.originlong, d.originlat])[0];})
                    .attr("cy", function(d) {return projection([d.originlong, d.originlat])[1];})
                    .attr("r", 2)
                    .style("fill", "red")
                    .style("opacity", 0.5)
                    .attr("class", "origin");
              // Call the zoom function here to fix the placement of the circles.
              zoom_function();
          });
    });

您需要跟踪上一个已知的d3.event.translated3.event.scale值,因为在绘制圆圈时它们将是未定义的。