Saya baru mengenal d3 - akan mencoba menjelaskan bagaimana saya memahaminya tetapi saya tidak yakin semuanya sudah benar.
Rahasianya adalah mengetahui bahwa beberapa metode akan beroperasi pada ruang kartografi (lintang, bujur) dan lainnya pada ruang kartesius (x, y di layar). Ruang kartografi (planet kita) berbentuk bola (hampir) berbentuk bola, ruang kartesian (layar) datar - untuk memetakan satu di atas yang lain Anda memerlukan algoritma, yang disebut proyeksi . Ruang ini terlalu pendek untuk masuk ke dalam subjek proyeksi yang mempesona dan bagaimana mereka mendistorsi fitur geografis untuk mengubah bola menjadi bidang; beberapa dirancang untuk menghemat sudut, lainnya menghemat jarak dan sebagainya - selalu ada kompromi (Mike Bostock memiliki banyak koleksi contoh ).
Di d3, objek proyeksi memiliki properti pusat / penyetel, yang diberikan dalam unit peta:
projection.center ([lokasi])
Jika pusat ditentukan, setel pusat proyeksi ke lokasi yang ditentukan, larik dua elemen bujur dan lintang dalam derajat dan mengembalikan proyeksi. Jika pusat tidak ditentukan, kembalikan pusat saat ini yang secara default adalah ⟨0 °, 0 °⟩.
Ada juga terjemahan, yang diberikan dalam piksel - di mana pusat proyeksi relatif terhadap kanvas:
projection.translate ([point])
Jika titik ditentukan, atur offset terjemahan proyeksi ke array dua elemen [x, y] yang ditentukan dan kembalikan proyeksi. Jika titik tidak ditentukan, mengembalikan offset terjemahan saat ini yang defaultnya ke [480, 250]. Offset terjemahan menentukan koordinat piksel dari pusat proyeksi. Terjemahan default mengimbangi ⟨0 °, 0 °⟩ di tengah area 960 × 500.
Ketika saya ingin memusatkan fitur di kanvas, saya ingin mengatur pusat proyeksi ke tengah kotak pembatas fitur - ini berfungsi untuk saya ketika menggunakan mercator (WGS 84, digunakan di peta google) untuk negara saya (Brasil), tidak pernah diuji menggunakan proyeksi dan belahan lainnya. Anda mungkin harus membuat penyesuaian untuk situasi lain, tetapi jika Anda menerapkan prinsip-prinsip dasar ini, Anda akan baik-baik saja.
Misalnya, diberi proyeksi dan jalur:
var projection = d3.geo.mercator()
.scale(1);
var path = d3.geo.path()
.projection(projection);
The bounds
metode dari path
hasil kotak bounding dalam piksel . Gunakan untuk menemukan skala yang benar, membandingkan ukuran dalam piksel dengan ukuran dalam unit peta (0,95 memberi Anda margin 5% dari yang paling cocok untuk lebar atau tinggi). Geometri dasar di sini, menghitung lebar / tinggi persegi panjang yang diberikan diagonal berlawanan sudut:
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);
Gunakan d3.geo.bounds
metode untuk menemukan kotak pembatas di unit peta:
b = d3.geo.bounds(feature);
Atur pusat proyeksi ke tengah kotak pembatas:
projection.center([(b[1][0]+b[0][0])/2, (b[1][1]+b[0][1])/2]);
Gunakan translate
metode untuk memindahkan pusat peta ke pusat kanvas:
projection.translate([width/2, height/2]);
Sekarang Anda harus memiliki fitur di tengah peta diperbesar dengan margin 5%.