我正在使用 d3 库,并且成功使用了 chloropleth 示例,并获得了单击操作以放大到特定状态(有关详细信息,请参阅此问题)。特别是,这是我用于单击以缩放某个状态的事件的代码:
// Since height is smaller than width,
var baseWidth = 564;
var baseHeight = 400;
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],
// since height is smaller than width, I scale based off of it.
zoomScaleFactor = baseHeight / bbox.height,
zoomX = -centroid[0],
zoomY = -centroid[1];
// set a transform on the parent group element
d3.select('#states')
.attr("transform", "scale(" + scaleFactor + ")" +
"translate(" + zoomX + "," + zoomY + ")");
});
但是,当我单击以查看状态时,我的变换不在视口的中心,而是在左上角,并且它可能也没有适当的比例。如果我手动对 scaleFactor 或 zoomX/zoomY 参数进行微调,我会完全丢失该项目。我熟悉这样一个概念,即一起进行缩放和变换会产生显着不同的结果,所以我不确定如何调整。
我唯一能想到的另一件事是原始叶绿素图像设置为 960 x 500 图像。为了适应这个。我创建了一个 albersUSA 投影并将我的 d3.geo.path 与此投影一起使用,并继续相应地添加我的路径。
我的变换是否受到投影的影响?如果是,我将如何适应它?