跳到內容

投影

投影會將球形多邊形幾何轉換為平面多邊形幾何。D3 提供多種標準投影類別的實作

如需更多投影,請參閱 d3-geo-projectiond3-geo-polygon。您可以使用 geoProjectiongeoProjectionMutator 實作 自訂投影

投影()

原始碼 · 傳回一個新的陣列 [x, y](通常以像素為單位),表示給定 的投影點。點必須指定為一個二維陣列 [經度, 緯度](以度為單位)。如果指定的 沒有定義的投影位置(例如,當點在投影的裁剪邊界之外時),可能會傳回 null。

投影.反轉()

來源 · 傳回一個新的陣列 [經度, 緯度],以度為單位,表示給定投影的未投影點。點必須指定為一個二元素陣列 [x, y](通常以像素為單位)。如果指定的沒有定義的投影位置,例如點在投影的裁剪邊界之外,則可能會傳回 null。

此方法僅定義在可反轉的投影上。

投影.串流(串流)

來源 · 傳回指定的輸出串流投影串流。任何輸入幾何在串流到輸出串流之前都會被投影。典型的投影涉及幾個幾何轉換:輸入幾何首先轉換為弧度,在三個軸上旋轉,裁剪到小圓或沿著本初子午線切割,最後投影到具有自適應重新採樣、縮放和平移的平面。

投影.預裁剪(預裁剪)

如果指定了預裁剪,則將投影的球形裁剪設定為指定的函數並傳回投影;預裁剪是一個函數,它會取得投影串流並傳回一個裁剪的串流。如果未指定預裁剪,則傳回目前的球形裁剪函數。預裁剪通常用於沿著本初子午線或沿著小圓切割。

投影.後裁剪(後裁剪)

如果指定了 postclip,則將投影的笛卡爾剪裁設定為指定的函數並傳回投影;postclip 是接收 投影串流 並傳回剪裁串流的函數。如果未指定 postclip,則傳回目前的笛卡爾剪裁函數。後剪裁發生在平面上,當投影被限制在某個範圍(例如矩形)時。

projection.clipAngle(angle)

Source · 如果指定了 angle,則將投影的剪裁圓半徑設定為指定的角度(單位為度)並傳回投影。如果 angle 為 null,則切換為 反子午線切割,而不是小圓剪裁。如果未指定 angle,則傳回目前的剪裁角度,其預設值為 null。小圓剪裁獨立於視窗剪裁,透過 projection.clipExtent。另請參閱 projection.preclipgeoClipAntimeridiangeoClipCircle

projection.clipExtent(extent)

Source · 如果指定了 extent,則將投影的視窗剪裁範圍設定為指定的像素邊界並傳回投影。extent 邊界指定為陣列 [[x₀, y₀], [x₁, y₁]],其中 x₀ 是視窗的左側,y₀ 是頂部,x₁ 是右側,y₁ 是底部。如果 extent 為 null,則不執行視窗剪裁。如果未指定 extent,則傳回目前的視窗剪裁範圍,其預設值為 null。視窗剪裁獨立於小圓剪裁,透過 projection.clipAngle。另請參閱 projection.postclipgeoClipRectangle

projection.scale(scale)

Source · 如果指定了 scale,則將投影的縮放因子設定為指定的數值並傳回投影。如果未指定 scale,則傳回目前的縮放因子;預設縮放為投影特定。縮放因子與投影點之間的距離成線性對應;然而,絕對縮放因子在各投影之間並不相同。

projection.translate(translate)

Source · 如果指定了 translate,則將投影的平移偏移設定為指定的二元陣列 [tx, ty] 並傳回投影。如果未指定 translate,則傳回目前的平移偏移,其預設值為 [480, 250]。平移偏移決定投影 中心 的像素座標。預設平移偏移將 ⟨0°,0°⟩ 置於 960×500 區域的中心。

投影.center(中心)

來源 · 如果指定了 中心,則將投影的中心設定為指定的 中心,一個包含 [經度, 緯度] 的二元陣列,單位為度,並傳回投影。如果未指定 中心,則傳回目前的中心,預設為 ⟨0°,0°⟩。

投影.angle(角度)

來源 · 如果指定了 角度,則將投影的投影後平面旋轉角度設定為指定的 角度,單位為度,並傳回投影。如果未指定 角度,則傳回投影目前的 角度,預設為 0°。請注意,在投影期間(例如,使用 內容.rotate)進行旋轉可能會比在渲染期間旋轉更快。

投影.reflectX(反射)

如果指定了 反射,則設定輸出中 x 維度是否反映(取反)。如果未指定 反射,則在啟用 x 反射時傳回 true,預設為 false。這對於顯示從下方看到的球體的天空和天文資料很有用:當北方朝上時,赤經(東方)將指向左側。

投影.reflectY(反射)

如果指定了 反射,則設定輸出中 y 維度是否反映(取反)。如果未指定 反射,則在啟用 y 反射時傳回 true,預設為 false。這對於從標準 空間參考系統(將正 y 視為朝上)轉換到顯示坐標系統(例如 Canvas 和 SVG,將正 y 視為朝下)特別有用。

投影.rotate(角度)

原始碼 · 如果指定了 旋轉,則將投影的 三軸球面旋轉 設定為指定的 角度,它必須是一個包含數字的二或三元素陣列 [lambda, phi, gamma],指定每個球面軸的旋轉角度(以度為單位)。(這些對應於 偏航、俯仰和滾動。)如果省略旋轉角度 gamma,則其預設為 0。另請參閱 geoRotation。如果未指定 旋轉,則傳回目前的旋轉,其預設為 [0, 0, 0]。

投影.precision(精度)

原始碼 · 如果指定了 精度,則將投影的 自適應重新取樣 的閾值設定為指定的像素值,並傳回投影。此值對應於 道格拉斯-普克 距離。如果未指定 精度,則傳回投影目前的重新取樣精度,其預設為 √0.5 ≅ 0.70710…

投影.fitExtent(範圍, 物件)

原始碼 · 將投影的 縮放平移 設定為適合指定的 GeoJSON 物件,並將其置中於指定的 範圍。範圍指定為陣列 [[x₀, y₀], [x₁, y₁]],其中 x₀ 是邊界框的左側,y₀ 是頂部,x₁ 是右側,y₁ 是底部。傳回投影。

例如,要縮放和平移 新澤西州平面投影,以適合 GeoJSON 物件 nj,並將其置中於 960×500 邊界框中,且每側有 20 像素的填補

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

在確定新的縮放和平移時,會忽略任何 裁剪範圍。用於計算指定 物件 邊界框的 精度 是以 150 的有效縮放計算的。

投影.fitSize(大小, 物件)

原始碼 · 投影.fitExtent 的簡便方法,其中範圍的左上角為 [0, 0]。以下兩個陳述式等效

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

投影.fitWidth(寬度, 物件)

來源 · 投影.fitSize 的便利方法,其中高度會自動從 物件 的長寬比和 寬度 的給定約束中選擇。

投影.fitHeight(高度, 物件)

來源 · 投影.fitSize 的便利方法,其中寬度會自動從 物件 的長寬比和 高度 的給定約束中選擇。

原始投影

原始投影是點轉換函數,用於實作自訂投影;它們通常傳遞給 geoProjectiongeoProjectionMutator。它們在此公開,以利衍生相關投影。原始投影採用球面座標 [lambda, phi](單位為弧度,而非角度!)並傳回一個點 [x, y],通常在以原點為中心的單位正方形中。

投影(lambda, phi)

投影指定的點 [lambda, phi](單位為弧度),傳回一個新的點 [x, y](單位為無量綱座標)。

投影.反轉(x, y)

投影 的反函數。

geoProjection(投影)

來源 · 從指定的 原始投影投影,建構一個新的投影。投影函數採用給定點的 經度緯度(單位為 弧度),通常稱為 lambda (λ) 和 phi (φ),並傳回一個二元陣列 [x, y],代表其單位投影。投影函數不需要縮放或平移點,因為這些動作會自動套用 投影.縮放投影.平移投影.中心。同樣地,投影函數不需要執行任何球面旋轉,因為 投影.旋轉 會在投影之前套用。

例如,球面墨卡托投影可以實作為

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

如果 投影 函數公開一個 反轉 方法,傳回的投影也會公開 投影.反轉

geoProjectionMutator(factory)

原始碼 · 從指定的 原始投影 factory 建立新的投影,並傳回一個 mutate 函式,以便在原始投影變更時呼叫。factory 必須傳回原始投影。傳回的 mutate 函式傳回封裝的投影。例如,圓錐投影通常有兩個可設定的平行線。適當的 factory 函式,例如 geoConicEqualAreaRaw,形式如下

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.reflectXprojection.reflectY

geoClipAntimeridian

原始碼 · 一個剪裁函式,將串流轉換成幾何形狀(線條或多邊形),穿過本初子午線會被切成兩半,每一半位於一邊。通常用於預先剪裁。

geoClipCircle(angle)

原始碼 · 產生一個剪裁函式,將串流轉換成幾何形狀,其範圍受限於投影的中心周圍半徑為angle的小圓。通常用於預先剪裁。

geoClipRectangle(x0, y0, x1, y1)

原始碼 · 產生一個剪裁函式,將串流轉換成幾何形狀,其範圍受限於座標 [[x0, y0], [x1, y1]] 的矩形。通常用於後剪裁。