接近最简单的方法,我发现,是设置g
元素封闭状态(#states
中的例子),根据你放大到国家的边框上的转换:
// your starting size
var baseWidth = 600;
d3.selectAll('#states path')
.on('click', function(d) {
// getBBox() is a native SVG element method
var bbox = this.getBBox(),
centroid = [bbox.x + bbox.width/2, bbox.y + bbox.height/2],
zoomScaleFactor = baseWidth/bbox.width,
zoomX = -centroid[0],
zoomY = -centroid[1];
// set a transform on the parent group element
d3.select('#states')
.attr("transform", "scale(" + scaleFactor + ")" +
"translate(" + zoomX + "," + zoomY + ")");
});
有很多你可以做更多在这里把它清理干净 - 给予一定的保证金到最后变焦,检查是否应立足变焦的宽度和高度,改变取决于变焦笔画宽度,动画过渡等 - 但这是基本概念。
非常好!我前几天在D3网站上发现了一些转换代码,这对我的国家观点有所帮助,但我会将其用于我个人的状态视图并通知您。 –
d3完成加载地图后,我会如何调用我的缩放/变换?我会知道我需要获取边界框的具体路径(我正在使用Ids),我想立即获得更大的视图,而不是依赖于单击事件。由于我只渲染单个路径,我可以使用.enter方法而不是.on吗?我仍然习惯于D3 –
你可以,但通常这会是你在更新时要做的事情,因为任何时候你想要改变状态或缩小都需要重做。 – nrabinowitz