2012-09-17 6 views
5

나는 D3와 함께 일하고 있으며 지금까지 특정 상태를 그리기 위해 클로로 프렉스 예제를 조정할 수있었습니다. 이것은 필요한 모든 상태로 남아 있도록 모든 다른 다각형 데이터를 단순히 제거하는 것과 관련이 있습니다. 내 D3지도를 위치로 확대하려면 어떻게합니까?

내가이 시작 : enter image description here

다음이 물건 불통 그러나 enter image description here

를, 내가 뭘하려는 것은 자동 팬이다/창조에지도를 확대되도록 상태가 앞면과 가운데에있는 경우 다음과 같습니다. enter image description here

D3 라이브러리를 통해이 작업을 수행합니까? 또는 일부 독립적 인 코드 (나는 현재 jQuery-svgpan을 d3으로 실행하여 수동 패닝/확대/축소를 허용 함)를 수행합니다.

답변

5

줌인하려는 상태의 경계 상자를 기반으로 상태를 묶는 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 + ")"); 
    }); 

훨씬 더 당신이 그것을 청소하려면 여기를 할 수있다 - 당신은, 폭 또는 높이에 줌을 기반 확대에 따라 스트로크 너비를 변경해야하는지 여부를 확인, 최종 줌에 약간의 여유를 줄의 애니메이션 전환 등 -하지만 그것은 기본 개념입니다.

+0

우수! 전에 D3 사이트에서 변형 코드 중 일부를 발견했는데 이것이 내 국가보기에 도움이되었습니다. 그러나이를 개인 상태보기로 작업하고 알려 드리겠습니다. –

+0

d3의지도로드가 완료된 후 어떻게 저울/변형을 호출합니까? 나는 바운딩 박스를 얻는 데 필요한 특정 경로를 알게 될 것이다. (나는 ID를 적용하고있다.) 나는 click 이벤트에 의존하는 대신에 더 큰 뷰를 즉시 얻고 싶다. 단일 경로 만 렌더링하기 때문에 .on 대신 .enter 메서드를 사용할 수 있습니까? 아직도 익숙해 져 있습니다 D3 –

+0

상태는 변경하거나 축소하려는 경우 다시 수행해야하므로 업데이트 할 때 일반적으로 수행 할 수 있습니다. – nrabinowitz