私はd3の初心者です-私はそれをどのように理解するかを説明しようとしますが、すべてが正しいかどうかはわかりません。
秘密は、いくつかの方法が地図作成空間(緯度、経度)で動作し、他の方法が直交座標空間(画面上のx、y)で動作することを知っています。地図作成空間(私たちの惑星)は(ほぼ)球形であり、デカルト空間(画面)は平坦です。一方を他方の上にマッピングするには、投影と呼ばれるアルゴリズムが必要です。この空間は短すぎて、魅力的なプロジェクションの主題や、球形を平面に変換するために地理的特徴をどのように歪めるかには深く入りません。角度を保存するように設計されているものや、距離を保存するように設計されているものなど、常に妥協点があります(マイクボストックには、膨大な数のサンプルがあります)。
d3では、投影オブジェクトには、マップ単位で指定された中央のプロパティ/セッターがあります。
projection.center([location])
centerが指定されている場合、投影の中心を指定された場所、経度と緯度の度数で構成される2要素の配列に設定し、投影を返します。中心が指定されていない場合、現在の中心を返します。デフォルトは「0°、0°」です。
ピクセル単位で与えられた平行移動もあります-投影の中心はキャンバスに対して相対的です:
Projection.translate([point])
ポイントが指定されている場合、投影の移動オフセットを指定された2要素配列[x、y]に設定し、投影を返します。ポイントが指定されていない場合、現在の移動オフセットを返します。デフォルトは[480、250]です。平行移動オフセットは、投影の中心のピクセル座標を決定します。デフォルトの平行移動オフセットでは、960×500の領域の中心に「0°、0°」が配置されます。
キャンバスでフィーチャを中央に配置する場合、投影の中心をフィーチャバウンディングボックスの中央に設定します。これは、メルカトルを使用するときに機能しますは、私の国(ブラジル)で(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%のマージンでズームした機能が表示されます。