コンテンツへスキップ

投影法

投影法は、球面多角形ジオメトリを平面多角形ジオメトリに変換します。D3は、いくつかの標準的な投影法のクラスの実装を提供します。

より多くの投影法については、d3-geo-projectiond3-geo-polygon を参照してください。カスタム投影法 は、geoProjection または geoProjectionMutator を使用して実装できます。

projection(point)

ソースコード · 指定されたpointの投影された点を表す新しい配列[x, y](通常はピクセル単位)を返します。ポイントは、度単位の二要素配列[longitude, latitude]として指定する必要があります。投影のクリッピング範囲外にあるなど、指定されたpointに定義された投影位置がない場合は、nullを返す場合があります。

projection.invert(point)

ソースコード · 指定された投影されたpointの非投影された点を表す新しい配列[longitude, latitude](度単位)を返します。ポイントは、二要素配列[x, y](通常はピクセル単位)として指定する必要があります。投影のクリッピング範囲外にあるなど、指定されたpointに定義された投影位置がない場合は、nullを返す場合があります。

このメソッドは、反転可能な投影法でのみ定義されています。

projection.stream(stream)

ソースコード · 指定された出力streamに対する投影ストリームを返します。入力ジオメトリは、出力ストリームにストリーミングされる前に投影されます。一般的な投影法には、いくつかのジオメトリ変換が含まれます。入力ジオメトリはまずラジアンに変換され、3つの軸上で回転され、小円にクリップされるか、子午線に沿ってカットされ、最後に適応的リサンプリング、スケール、および変換を使用して平面に投影されます。

projection.preclip(preclip)

preclipが指定されている場合、投影の球面クリッピングを指定された関数に設定し、投影を返します。preclipは、投影ストリームを受け取り、クリップされたストリームを返す関数です。preclipが指定されていない場合、現在の球面クリッピング関数を返します。プリクリッピングは、一般的に子午線または小円に沿ってカットするために使用されます。

projection.postclip(postclip)

postclipが指定されている場合、投影のデカルトクリッピングを指定された関数に設定し、投影を返します。postclipは、投影ストリームを受け取り、クリップされたストリームを返す関数です。postclipが指定されていない場合、現在のデカルトクリッピング関数を返します。ポストクリッピングは、投影が長方形など特定の範囲に制限されている場合に、平面上で発生します。

projection.clipAngle(angle)

ソースコード · angleが指定されている場合、投影のクリッピング円の半径を度単位で指定された角度に設定し、投影を返します。angleがnullの場合、小円クリッピングではなく子午線カットに切り替えます。angleが指定されていない場合、現在のクリップ角度(デフォルトはnull)を返します。小円クリッピングは、projection.clipExtentによるビューポートクリッピングとは独立しています。projection.preclipgeoClipAntimeridiangeoClipCircleも参照してください。

projection.clipExtent(extent)

ソースコード · extentが指定されている場合、投影のビューポートクリップ範囲をピクセル単位で指定された範囲に設定し、投影を返します。extent範囲は、[[x₀, y₀], [x₁, y₁]]という配列で指定されます。ここで、x₀はビューポートの左側、y₀は上部、x₁は右側、y₁は下部です。extentがnullの場合、ビューポートクリッピングは実行されません。extentが指定されていない場合、現在のビューポートクリップ範囲(デフォルトはnull)を返します。ビューポートクリッピングは、projection.clipAngleによる小円クリッピングとは独立しています。projection.postclipgeoClipRectangleも参照してください。

projection.scale(scale)

ソースコード · scaleが指定されている場合、投影のスケール係数を指定された値に設定し、投影を返します。scaleが指定されていない場合、現在のスケール係数を返します。デフォルトのスケールは投影法によって異なります。スケール係数は、投影された点間の距離に線形に対応します。ただし、絶対的なスケール係数は、投影法間で等価ではありません。

projection.translate(translate)

ソースコード · translateが指定されている場合、投影の平行移動オフセットを指定された二要素配列[tx, ty]に設定し、投影を返します。translateが指定されていない場合、現在の平行移動オフセット(デフォルトは[480, 250])を返します。平行移動オフセットは、投影の中心のピクセル座標を決定します。デフォルトの平行移動オフセットは、960×500の領域の中心に⟨0°,0°⟩を配置します。

projection.center(center)

ソースコード · centerが指定されている場合、投影の中心を指定されたcenter(度単位の[longitude, latitude]の二要素配列)に設定し、投影を返します。centerが指定されていない場合、現在の中心(デフォルトは⟨0°,0°⟩)を返します。

projection.angle(angle)

ソースコード · angleが指定されている場合、投影後の平面回転角度を度単位で指定されたangleに設定し、投影を返します。angleが指定されていない場合、投影の現在の角度(デフォルトは0°)を返します。投影中ではなくレンダリング中に回転する方が高速な場合があります(例:context.rotateを使用)。

projection.reflectX(reflect)

reflectが指定されている場合、出力でx次元が反転される(反転される)かどうかを設定します。reflectが指定されていない場合、x反転が有効になっている場合はtrueを返し、デフォルトはfalseです。これは、下から見た球体で空と天文データを表示する場合に役立ちます。北が上を向いている場合、赤経(東方向)は左を指します。

projection.reflectY(reflect)

reflectが指定されている場合、出力でy次元が反転される(反転される)かどうかを設定します。reflectが指定されていない場合、y反転が有効になっている場合はtrueを返し、デフォルトはfalseです。これは、正のyを上向きとする標準的な空間参照系から、正のyを下向きとするCanvasやSVGなどの表示座標系に変換する場合に特に役立ちます。

projection.rotate(angles)

ソースコード · rotation が指定されている場合、投影の三次元球面回転を指定されたanglesに設定します。anglesは、[lambda, phi, gamma]という数値の2要素または3要素の配列でなければならず、各球面軸周りの回転角度(度)を指定します。(これらはヨー、ピッチ、ロールに対応します。)回転角度gammaが省略された場合、デフォルトは0になります。geoRotationも参照してください。rotationが指定されていない場合、現在の回転(デフォルトは[0, 0, 0])を返します。

projection.precision(precision)

ソースコード · precision が指定されている場合、投影の適応サンプリングの閾値をピクセル単位で指定された値に設定し、投影を返します。この値はダグラス・ペッカーアルゴリズムの距離に対応します。precisionが指定されていない場合、投影の現在のリサンプリング精度(デフォルトは√0.5 ≅ 0.70710…)を返します。

projection.fitExtent(extent, object)

ソースコード · 指定されたGeoJSONのobjectが指定されたextentの中心に収まるように、投影のスケール平行移動を設定します。extentは[[x₀, y₀], [x₁, y₁]]という配列で指定され、x₀は境界ボックスの左側、y₀は上側、x₁は右側、y₁は下側を表します。投影を返します。

例えば、ニュージャージー州平面投影のスケールと平行移動を、各辺に20ピクセルの余白のある960×500の境界ボックスの中心にGeoJSONオブジェクトnjが収まるように調整するには

js
var projection = d3.geoTransverseMercator()
    .rotate([74 + 30 / 60, -38 - 50 / 60])
    .fitExtent([[20, 20], [940, 480]], nj);

新しいスケールと平行移動を決定する際には、クリップ範囲は無視されます。指定されたobjectのバウンディングボックスを計算するために使用される精度は、有効スケール150で計算されます。

projection.fitSize(size, object)

ソースコード · extentの左上隅が[0, 0]であるprojection.fitExtentの簡便なメソッドです。次の2つのステートメントは同等です。

js
projection.fitExtent([[0, 0], [width, height]], object);
projection.fitSize([width, height], object);

projection.fitWidth(width, object)

ソースコード · 高さがobjectのアスペクト比とwidthに関する制約から自動的に選択されるprojection.fitSizeの簡便なメソッドです。

projection.fitHeight(height, object)

ソースコード · 幅がobjectのアスペクト比とheightに関する制約から自動的に選択されるprojection.fitSizeの簡便なメソッドです。

生の投影関数

生の投影関数は、カスタム投影を実装するために使用される点変換関数です。通常はgeoProjectionまたはgeoProjectionMutatorに渡されます。関連する投影関数の導出を容易にするためにここに公開されています。生の投影関数は、ラジアン(度ではない!)単位の球面座標[lambda, phi]を受け取り、通常は原点を中心とした単位正方形内の点[x, y]を返します。

project(lambda, phi)

ラジアン単位で指定された点[lambda, phi]を投影し、単位のない座標の新しい点[x, y]を返します。

project.invert(x, y)

projectの逆関数です。

geoProjection(project)

ソースコード · 指定された生の投影関数projectから新しい投影を構築します。project関数は、多くの場合lambda(λ)とphi(φ)と呼ばれる、ラジアン単位の与えられた点の経度と緯度を受け取り、その単位投影を表す2要素配列[x, y]を返します。project関数は、projection.scaleprojection.translateprojection.centerによって自動的に適用されるため、点をスケールまたは平行移動する必要はありません。同様に、project関数は、projection.rotateが投影の前に適用されるため、球面回転を実行する必要はありません。

例えば、球面メルカトル投影は次のように実装できます。

js
var mercator = d3.geoProjection(function(x, y) {
  return [x, Math.log(Math.tan(Math.PI / 4 + y / 2))];
});

project関数がinvertメソッドを公開している場合、返される投影もprojection.invertを公開します。

geoProjectionMutator(factory)

ソースコード · 指定された生の投影関数factoryから新しい投影を構築し、生の投影が変更されるたびに呼び出すためのmutate関数を返します。factoryは生の投影を返す必要があります。返されるmutate関数は、ラップされた投影を返します。例えば、円錐投影は通常、2つの構成可能な平行線を持ちます。geoConicEqualAreaRawなどの適切なfactory関数は、次のような形式になります。

js
// y0 and y1 represent two parallels
function conicFactory(phi0, phi1) {
  return function conicRaw(lambda, phi) {
    return […, …];
  };
}

d3.geoProjectionMutatorを使用すると、平行線を変更できる標準投影を実装し、geoProjectionによって内部的に使用される生の投影を再割り当てできます。

js
function conicCustom() {
  var phi0 = 29.5,
      phi1 = 45.5,
      mutate = d3.geoProjectionMutator(conicFactory),
      projection = mutate(phi0, phi1);

  projection.parallels = function(_) {
    return arguments.length ? mutate(phi0 = +_[0], phi1 = +_[1]) : [phi0, phi1];
  };

  return projection;
}

変更可能な投影を作成する際には、mutate関数は通常公開されません。

geoTransform(methods)

ソースコード · 指定されたmethodsオブジェクトに定義されているメソッドを使用して、任意の変換を定義します。定義されていないメソッドは、入力を出力ストリームに伝播するパススルーメソッドを使用します。

例えば、y次元を反転するには(projection.reflectYも参照)

js
const reflectY = d3.geoTransform({
  point(x, y) {
    this.stream.point(x, -y);
  }
});

または、アフィン行列変換を定義するには

js
function matrix(a, b, c, d, tx, ty) {
  return d3.geoTransform({
    point(x, y) {
      this.stream.point(a * x + b * y + tx, c * x + d * y + ty);
    }
  });
}

変換は汎用的な投影であり、projection.streamを実装し、path.projectionに渡すことができます。ただし、他の投影メソッドのサブセットのみを実装し、球面座標から平面座標への投影ではなく、任意の幾何学的変換を表します。

geoIdentity()

ソースコード · 単位変換は、平面幾何形状のスケーリング、平行移動、クリッピングに使用できます。projection.scaleprojection.translateprojection.fitExtentprojection.fitSizeprojection.fitWidthprojection.fitHeightprojection.clipExtentprojection.angleprojection.reflectX、およびprojection.reflectYを実装します。

geoClipAntimeridian

ソースコード · 反子午線線を横切るジオメトリ(線またはポリゴン)が2つに分割され、それぞれがそれぞれの側に配置されるようにストリームを変換するクリッピング関数です。通常、プリクリッピングに使用されます。

geoClipCircle(angle)

ソースコード · 投影の中心を中心とした半径angleの小さな円によってジオメトリが境界されるようにストリームを変換するクリッピング関数を生成します。通常、プリクリッピングに使用されます。

geoClipRectangle(x0, y0, x1, y1)

ソースコード · 座標[[x0, y0], [x1, y1]]の長方形によってジオメトリが境界されるようにストリームを変換するクリッピング関数を生成します。通常、ポストクリッピングに使用されます。