줌인하려는 상태의 경계 상자를 기반으로 상태를 묶는 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를 적용하고있다.) 나는 click 이벤트에 의존하는 대신에 더 큰 뷰를 즉시 얻고 싶다. 단일 경로 만 렌더링하기 때문에 .on 대신 .enter 메서드를 사용할 수 있습니까? 아직도 익숙해 져 있습니다 D3 –
상태는 변경하거나 축소하려는 경우 다시 수행해야하므로 업데이트 할 때 일반적으로 수행 할 수 있습니다. – nrabinowitz