ズームインしている状態の境界ボックスに基づいて、状態を囲む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のマップのロードが終了したら、スケール/変換をどのように呼び出すことができますか?私はバウンディングボックスを取得するために必要な特定のパスを知っています(私はIDを適用しています)、クリックイベントに頼るのではなく、すぐに大きなビューを取得したいと思います。私は単一のパスだけをレンダリングするので、.onの代わりに.enterメソッドを使用できますか?私はまだまだD3に慣れています –
あなたは状態を変更したいときやズームアウトしたいときはいつでも、もう一度やり直す必要があるので、これは一般的には更新時に行うことになります。 – nrabinowitz