我有一张地图,其中点击图例时会显示圆圈(人物的原点)。
此外,可以放大,然后转换圆圈(和国家/地区路径)(使用d3.behavior.zoom)。
但是,如果我首先放大,然后点击图例,圈子就不会出现在正确的位置。如何解决此问题并将其附加到正确的坐标处(在缩放的地图内)。
有什么想法吗?我确信解决方案并不困难,但我被困了。
请参阅(http://wahrendorf.de/circlemapping/world_question.html)以获取示例。
谢谢,
的Morten
答案 0 :(得分:0)
绘制圆圈时,您需要考虑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
值,因为在绘制圆圈时它们将是未定义的。