接近最簡單的方法,我發現,是設置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