2013-12-19 2 views
5

팬 및 확대/축소 기능이있는 토폴로지 맵이 있습니다. 국가를 클릭D3 - 수동 확대/축소 및 원점 이동 후 정확한 축척 및 원점 변환 방법

, 나는이 사용 국가로 패닝/줌 해요 :

if (this.active === d) return 

    var g = this.vis.select('g') 
    g.selectAll(".active").classed("active", false) 
    d3.select(path).classed('active', active = d) 

    var b = this.path.bounds(d); 
    g.transition().duration(750).attr("transform","translate(" + 
    this.proj.translate() + ")" + 
    "scale(" + .95/Math.max((b[1][0] - b[0][0])/this.options.width, (b[1][1] - b[0][1])/this.options.height) + ")" + 
    "translate(" + -(b[1][0] + b[0][0])/2 + "," + -(b[1][1] + b[0][1])/2 + ")"); 

    g.selectAll('path') 
    .style("stroke-width", 1/this.zoom.scale()) 

을 그러나, 나는 팬을 끌어 계속하면,지도 바보는 다시 초기 위치에 클릭이 발생하기 전에 , 패닝하기 전에. 다른 말로

this.zoom = d3.behavior.zoom().on('zoom', redraw) 
    function redraw() { 

    console.log('redraw') 

    _this.vis.select('g').attr("transform","translate(" + 
     d3.event.translate.join(",") + ")scale(" + d3.event.scale + ")") 

    _this.vis.select('g').selectAll('path') 
     .style("stroke-width", 1/_this.zoom.scale()) 
    } 
    this.vis.call(this.zoom) 

, 클릭 한 다음 다시 그리기 기능으로 드래그하여 지점을 확대 한 후, 다시 그리기가에서 계속 올바른 번역 + 스케일을 선택하지 않습니다 코드 줌은 여기/패닝합니다.

+0

'd3.select (경로) ('활성'.classed, 활성 = d)''경로'의 모든 것에'active' 클래스를 설정합니다. 이것은 아마도 문제를 일으키지 않을 것이다. (다른 곳에서'active' 경로에 초점을 맞추는 코드가 없다면), 나는'=='을 의미한다고 생각한다. –

+0

경로는 클릭 한 국가 경로입니다. 활성 클래스에는 코드가 없습니다. – bcm

+0

나는이 질문에 더 많은 관심을 갖기 위해 내 대답을 제거했다. 나는 그 문제를 완전히 이해한다고 생각하지 않는다. 문제가있는 작업 예제를 추가하면 도움이 될 수 있습니다. –

답변

7

전환 후 오른쪽에서 '계속 확대'하려면 확대/축소를 새 번역 및 비율로 설정해야했습니다.

내 클릭 및 줌 이벤트에 유사하게 적용되는 리셋의 예는 설정 새로운 줌 포인트는 중요한 비트입니다 :

_this.vis.select('g').transition().duration(1000) 
    .attr('transform', "translate(0,0)scale(1)") 

/* SET NEW ZOOM POINT */ 
_this.zoom.scale(1); 
_this.zoom.translate([0, 0]); 
+0

실례합니다. '_this'가 무엇인지 말해 줄 수 있습니까? – Awakening

+0

@Awakening zoom.scale (..) 및 zoom.translate (...)는 var zoom = d3.behavior.zoom()에서 작동합니다. – collinglass