我有一张地图,点击图例时会出现圆圈(人的起源)。
此外,可以放大,然后转换圆(和乡村路径)(使用 d3.behavior.zoom)。
但是,如果我先放大,然后单击图例,则圆圈不会出现在正确的位置。我该如何解决这个问题并将它们附加到正确的坐标(在缩放的地图内)。
有任何想法吗?我确信解决方案并不难,但我被困住了。
有关示例,请参见 ( http://wahrendorf.de/circlemapping/world_question.html )。
谢谢,
莫腾
我有一张地图,点击图例时会出现圆圈(人的起源)。
此外,可以放大,然后转换圆(和乡村路径)(使用 d3.behavior.zoom)。
但是,如果我先放大,然后单击图例,则圆圈不会出现在正确的位置。我该如何解决这个问题并将它们附加到正确的坐标(在缩放的地图内)。
有任何想法吗?我确信解决方案并不难,但我被困住了。
有关示例,请参见 ( http://wahrendorf.de/circlemapping/world_question.html )。
谢谢,
莫腾
您需要考虑到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.translate
和d3.event.scale
值,因为在绘制圆圈时它们将是未定义的。