Tôi mới sử dụng d3 - sẽ cố gắng giải thích cách tôi hiểu nhưng tôi không chắc mình đã làm mọi thứ đúng.
Bí mật là biết rằng một số phương pháp sẽ hoạt động trên không gian bản đồ (vĩ độ, kinh độ) và các phương pháp khác trên không gian cartesian (x, y trên màn hình). Không gian bản đồ (hành tinh của chúng ta) (gần như) hình cầu, không gian cartesian (màn hình) phẳng - để ánh xạ cái này qua cái khác bạn cần một thuật toán, được gọi là phép chiếu . Không gian này quá ngắn để đi sâu vào chủ đề hấp dẫn của các phép chiếu và cách chúng làm biến dạng các đặc điểm địa lý để biến hình cầu thành mặt phẳng; một số được thiết kế để bảo tồn các góc, một số khác bảo tồn khoảng cách và vân vân - luôn có sự thỏa hiệp (Mike Bostock có một bộ sưu tập lớn các ví dụ ).
Trong d3, đối tượng chiếu có thuộc tính / setter trung tâm, được cho theo đơn vị bản đồ:
chiếu.center ([vị trí])
Nếu trung tâm được chỉ định, đặt trung tâm của phép chiếu thành vị trí đã chỉ định, một mảng hai phần tử có kinh độ và vĩ độ tính theo độ và trả về phép chiếu. Nếu trung tâm không được chỉ định, trả về trung tâm hiện tại mặc định là ⟨0 °, 0 °.
Ngoài ra còn có bản dịch, được đưa ra bằng pixel - trong đó trung tâm chiếu tương đối so với khung vẽ:
hình chiếu.transTable ([điểm])
Nếu điểm được chỉ định, đặt phần bù dịch của phép chiếu thành mảng hai phần tử đã chỉ định [x, y] và trả về phép chiếu. Nếu điểm không được chỉ định, trả về giá trị dịch hiện tại mặc định là [480, 250]. Phần bù dịch xác định tọa độ pixel của tâm chiếu. Phần bù dịch mặc định đặt 0 °, 0 ° ở trung tâm của khu vực 960 × 500.
Khi tôi muốn tập trung một tính năng trong canvas, tôi muốn thiết lập các trung tâm dự báo đến trung tâm của tính năng khung giới hạn - công trình này cho tôi khi sử dụng Mercator (WGS 84, được sử dụng trong các bản đồ google) cho đất nước tôi (Brazil), không bao giờ thử nghiệm bằng cách sử dụng các phép chiếu và bán cầu khác. Bạn có thể phải điều chỉnh cho các tình huống khác, nhưng nếu bạn thực hiện những nguyên tắc cơ bản này, bạn sẽ ổn.
Ví dụ, đưa ra một phép chiếu và đường dẫn:
var projection = d3.geo.mercator()
.scale(1);
var path = d3.geo.path()
.projection(projection);
Các bounds
phương pháp từ path
lợi nhuận các khung giới hạn tính theo pixel . Sử dụng nó để tìm tỷ lệ chính xác, so sánh kích thước tính bằng pixel với kích thước tính theo đơn vị bản đồ (0,95 mang lại cho bạn tỷ lệ 5% so với mức phù hợp nhất cho chiều rộng hoặc chiều cao). Hình học cơ bản ở đây, tính toán chiều rộng / chiều cao hình chữ nhật cho các góc đối diện chéo:
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);
Sử dụng d3.geo.bounds
phương pháp để tìm hộp giới hạn trong các đơn vị bản đồ:
b = d3.geo.bounds(feature);
Đặt tâm của hình chiếu vào giữa hộp giới hạn:
projection.center([(b[1][0]+b[0][0])/2, (b[1][1]+b[0][1])/2]);
Sử dụng translate
phương pháp để di chuyển trung tâm bản đồ đến trung tâm của khung vẽ:
projection.translate([width/2, height/2]);
Đến bây giờ, bạn sẽ có tính năng ở giữa bản đồ được phóng to với tỷ lệ 5%.