マップをD3のv3にアップグレードし、ここにあるD3サンプルコードで概説されているクリックしてズームする変換を使用しています。
私のコードは、マップのサイズがわずかに小さい(960x500ではなく564x300)ことを除いて、ほぼ同じです。さらに、マップを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 +"))、ズームを適切に中心に近づけることがわかりましたが、そうではありません完全に