3

我有一张地图,点击图例时会出现圆圈(人的起源)。

此外,可以放大,然后转换圆(和乡村路径)(使用 d3.behavior.zoom)。

但是,如果我先放大,然后单击图例,则圆圈不会出现在正确的位置。我该如何解决这个问题并将它们附加到正确的坐标(在缩放的地图内)。

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

有关示例,请参见 ( http://wahrendorf.de/circlemapping/world_question.html )。

谢谢,

莫腾

4

1 回答 1

1

您需要考虑到d3.event.translate何时d3.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值,因为在绘制圆圈时它们将是未定义的。

于 2013-10-01T14:17:39.197 回答