我正在将我的地图升级到 D3 的 v3 并使用此处找到的 D3 示例代码中概述的单击缩放转换。
我的代码几乎相同,只是我的地图尺寸稍小(564 x 300 而不是 960 x 500)。此外,我的地图嵌套在一个 div 中并位于页面的左上角(尽管我认为这并不重要)
我的地图加载的初始加载很好(目前使用黑色背景进行区分)
// Clear existing map in case there is remnant data.
$("#map").html(null);
var mapWidth = 564;
var mapHeight = 300;
var projection = d3.geo.albersUsa()
.scale(mapWidth)
.translate([0, 0]);
var path = d3.geo.path()
.projection(projection);
var svg = d3.select("#map")
.append("svg")
.attr("id", "map-svg")
.attr("width", mapWidth)
.attr("height", mapHeight);
svg.append("rect")
.attr("id", "map-background")
.attr("class", "background")
.attr("width", mapWidth)
.attr("height", mapHeight)
.on("click", click);
// Create placeholders for shapes and labels
var states = svg.append("g")
.attr("transform", "translate(" + mapWidth / 2 + "," + mapHeight / 2 + ")")
.attr("id", "states");
但是,当单击状态并运行单击功能时,我的转换似乎已关闭。在我的例子中,点击了阿肯色州(用蓝色阴影表示)
function click(d)
{
var x = 0,
y = 0,
k = 1;
if (d && centered !== d)
{
var centroid = path.centroid(d);
x = -centroid[0];
y = -centroid[1];
k = 4;
centered = d;
}
else
{
centered = null;
}
d3.select("#states").selectAll("path")
.classed("active", centered && function (d) { return d === centered; });
d3.select("#states").transition()
.duration(1000)
.attr("transform", "scale(" + k + ")translate(" + x + "," + y + ")")
.style("stroke-width", 1.5 / k + "px");
}
我唯一的想法是我的质心计算需要针对地图的较小尺寸或不同位置进行轻微调整,但这似乎也不正确。
如何进行适当的调整?
编辑:我发现如果我在变换的末尾添加一个“负平移” (translate(" + -x + "," + -y + ")) ,它会更接近正确地以缩放为中心,但不是完美