D3'te yeniyim - nasıl anladığımı açıklamaya çalışacağım ama her şeyi doğru yaptığımdan emin değilim.
İşin sırrı, bazı yöntemlerin kartografik uzayda (enlem, boylam) ve diğerlerinin kartezyen uzayda (ekranda x, y) çalışacağını bilmektir. Kartografik uzay (gezegenimiz) (neredeyse) küreseldir, kartezyen uzay (ekran) düzdür - birbirini eşlemek için projeksiyon adı verilen bir algoritmaya ihtiyacınız vardır . Bu alan, büyüleyici projeksiyonlar konusuna ve küresel düzlemi düzleme dönüştürmek için coğrafi özellikleri nasıl deforme ettiklerine çok kısa; bazıları açıları korumak için tasarlanmış, diğerleri mesafeleri korumak ve benzeri - her zaman bir uzlaşma var (Mike Bostock'un çok çeşitli örnekleri var ).
D3'te, projeksiyon nesnesinin harita birimlerinde verilen bir center özelliği / ayarlayıcısı vardır:
projection.center ([konumu])
Merkez belirtilirse, projeksiyonun merkezini belirtilen konuma, iki öğeli bir boylam ve enlem dizisi olarak ayarlar ve projeksiyonu döndürür. Merkez belirtilmezse, varsayılan olarak ⟨0 °, 0 ° to olan geçerli merkezi döndürür.
Ayrıca, projeksiyon merkezinin tuvale göre durduğu piksel olarak verilen çeviri de vardır:
projection.translate ([noktası])
Nokta belirtilirse, projeksiyonun çeviri farkını belirtilen iki elemanlı diziye [x, y] ayarlar ve projeksiyonu döndürür. Nokta belirtilmezse, varsayılan olarak [480, 250] olan geçerli çeviri dengesini döndürür. Çeviri dengesi, projeksiyon merkezinin piksel koordinatlarını belirler. Varsayılan çeviri ofseti, 960 × 500 alanın merkezine ⟨0 °, 0 °⟩ yerleştirir.
Bir özelliği tuvalde ortalamak istediğimde, projeksiyon merkezini özellik sınırlama kutusunun ortasına ayarlamak istiyorum - bu ülkem için (Brezilya) mercator (WGS 84, google haritalarında kullanılan) kullanırken, asla diğer projeksiyonlar ve yarım küreler kullanılarak test edilmemiştir. Diğer durumlar için ayarlamalar yapmanız gerekebilir, ancak bu temel ilkeleri çivilerseniz, iyi olacaksınız.
Örneğin, bir projeksiyon ve yol verildiğinde:
var projection = d3.geo.mercator()
.scale(1);
var path = d3.geo.path()
.projection(projection);
bounds
, Yöntem path
getiri sınırlama kutusu piksel . Piksel cinsinden boyutu harita birimlerindeki boyutla karşılaştırarak doğru ölçeği bulmak için kullanın (0,95 size genişlik veya yükseklik için en iyi uyuma göre% 5'lik bir kenar boşluğu verir). Buradaki temel geometri, çapraz olarak zıt köşeler verilen dikdörtgen genişliğini / yüksekliğini hesaplar:
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
Harita birimlerinde sınırlayıcı kutuyu bulmak için yöntemi kullanın :
b = d3.geo.bounds(feature);
Yansıtmanın merkezini sınırlayıcı kutunun ortasına ayarlayın:
projection.center([(b[1][0]+b[0][0])/2, (b[1][1]+b[0][1])/2]);
translate
Haritanın merkezini kanvasın ortasına taşımak için yöntemi kullanın :
projection.translate([width/2, height/2]);
Şimdiye kadar, haritanın ortasındaki özelliğin% 5'lik bir kenar boşluğu ile yakınlaştırılmış olması gerekir.