私はd3-に不慣れです-私がそれをどのように理解するかを説明しようとしますが、私がすべてを正しく理解したかどうかはわかりません。
秘密は、いくつかの方法が地図作成空間(緯度、経度)で動作し、他の方法がデカルト空間(画面上のx、y)で動作することを知っていることです。地図作成空間(私たちの惑星)は(ほぼ)球形であり、デカルト空間(画面)は平坦です-相互にマッピングするには、投影と呼ばれるアルゴリズムが必要です。この空間は短すぎて、投影の魅力的な主題と、球形を平面に変えるためにそれらが地理的特徴をどのように歪めるかを深く掘り下げることはできません。角度を節約するように設計されているものもあれば、距離を節約するように設計されているものもあります。常に妥協点があります(Mike Bostockには膨大な数の例があります)。

d3では、投影オブジェクトには、マップ単位で指定された中心プロパティ/セッターがあります。
Projection.center([場所])
centerが指定されている場合、投影の中心を指定された位置に設定します。これは、経度と緯度の2要素配列(度単位)であり、投影を返します。centerが指定されていない場合、現在の中心を返します。デフォルトは⟨0°、0°⟩です。
ピクセル単位で与えられる平行移動もあります-投影の中心はキャンバスに対して立っています:
Projection.translate([point])
ポイントが指定されている場合、投影の平行移動オフセットを指定された2要素配列[x、y]に設定し、投影を返します。ポイントが指定されていない場合、デフォルトで[480、250]になっている現在の平行移動オフセットを返します。平行移動オフセットは、投影の中心のピクセル座標を決定します。デフォルトの平行移動オフセットは、960×500領域の中心に⟨0°、0°⟩を配置します。
キャンバスのフィーチャを中央に配置する場合、投影の中心をフィーチャの境界ボックスの中央に設定するのが好きです。これは、私の国(ブラジル)でメルカトル図法(WGS 84、Googleマップで使用)を使用する場合に機能します。他の投影法や半球を使用してテストしたことはありません。他の状況に合わせて調整する必要があるかもしれませんが、これらの基本原則を明確にすれば問題ありません。
たとえば、投影とパスが与えられた場合:
var projection = d3.geo.mercator()
.scale(1);
var path = d3.geo.path()
.projection(projection);
bounds
fromメソッドは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%のマージンでズームされているはずです。