나는 d3을 처음 사용합니다. 어떻게 이해하는지 설명하려고 노력할 것이지만 모든 것이 올바르게 이해되었는지는 확실하지 않습니다.
비밀은 일부 방법이지도 제작 공간 (위도, 경도)에서 작동하고 다른 방법은 데카르트 공간 (화면의 x, y)에서 작동한다는 것을 알고 있습니다. 지도 제작 공간 (우리의 행성)은 (거의) 구형이며, 데카르트 공간 (스크린)은 평평합니다. 서로 매핑하기 위해서는 투영 이라고하는 알고리즘이 필요합니다 . 이 공간은 너무나 짧아 매혹적인 투영 주제에 깊이 들어 가지 않고 구면을 평면으로 만들기 위해 지리적 특징을 왜곡하는 방법입니다. 일부는 각도를 유지하도록 설계되고 다른 일부는 거리 를 유지하는 등 항상 타협이 있습니다 (Mike Bostock에는 엄청난 수의 예제 모음이 있음 ).
d3에서 투영 객체에는지도 단위로 지정된 중심 속성 / 세터가 있습니다.
projection.center ([위치])
center를 지정하면 투영의 중심을 지정된 위치 (경도 및 위도의도 단위로 배열)로 설정하고 투영을 반환합니다. center를 지정하지 않으면 현재 중심을 returns0 °, 0 °⟩로 반환합니다.
투영 중심이 캔버스를 기준으로하는 픽셀 단위의 변환도 있습니다.
projection.translate ([point])
point가 지정되면 투영의 변환 오프셋을 지정된 2 요소 배열 [x, y]로 설정하고 투영을 반환합니다. point를 지정하지 않으면 현재 변환 오프셋을 반환하며 기본값은 [480, 250]입니다. 평행 이동 오프셋은 투영 중심의 픽셀 좌표를 결정합니다. 기본 변환 오프셋은 960 × 500 영역의 중앙에 ⟨0 °, 0 °⟩를 배치합니다.
캔버스에서 피처를 가운데에 놓고 싶을 때 투영 중심을 피처 경계 상자의 가운데에 설정하고 싶습니다. 은 내 국가 (브라질)에 메르카토르 (Google지도에 사용 된 WGS 84)를 사용할 . 다른 돌기와 반구를 사용하여 테스트하지 않았습니다. 다른 상황에 맞게 조정해야 할 수도 있지만 이러한 기본 원칙을 준수하면 문제가 없습니다.
예를 들어, 투영과 경로가 주어진 경우 :
var projection = d3.geo.mercator()
.scale(1);
var path = d3.geo.path()
.projection(projection);
bounds
에서 방법 path
반환 경계 상자 (픽셀) . 픽셀 단위의 크기와지도 단위의 크기를 비교하여 올바른 배율을 찾는 데 사용합니다 (0.95는 너비 또는 높이에 가장 잘 맞는 것보다 5 %의 마진을 제공합니다). 대각선으로 마주 보는 모서리가 주어진 사각형 너비 / 높이를 계산하는 기본 지오메트리 :
var b = path.bounds(feature),
s = 0.9 / Math.max(
(b[1][0] - b[0][0]) / width,
(b[1][1] - b[0][1]) / height
);
projection.scale(s);
사용 d3.geo.bounds
방법을 지도 단위로 경계 상자를 찾습니다.
b = d3.geo.bounds(feature);
투영의 중심을 경계 상자의 중심으로 설정하십시오.
projection.center([(b[1][0]+b[0][0])/2, (b[1][1]+b[0][1])/2]);
이 translate
방법을 사용하여 맵의 중심을 캔버스의 중심으로 이동하십시오.
projection.translate([width/2, height/2]);
이제지도 중앙의 기능이 5 %의 마진으로 확대되었습니다.