d3-geo
地圖投影有時會以點轉換實作:一個函式,接收給定的經度 lambda 和緯度 phi,並傳回平面上對應的 xy 位置。例如,以下是球面墨卡托投影(以弧度表示)
function mercator(lambda, phi) {
const x = lambda;
const y = Math.log(Math.tan(Math.PI / 4 + phi / 2));
return [x, y];
}
如果您的幾何圖形僅包含點,這是一個合理的方法。但對於多邊形和折線等離散幾何圖形呢?
當從球體投影到平面時,離散幾何會帶來新的挑戰。球形多邊形的邊緣是測地線(大圓的線段),而不是直線。除了方位角之外,測地線在所有地圖投影中都會變成曲線,因此精確的投影需要沿著每個弧線進行內插。D3 使用自適應採樣,靈感來自Visvalingam 的線簡化方法,以平衡精確度和效能。
多邊形和折線的多邊形投影也必須處理球體和平面之間的拓撲差異。有些投影需要切割穿越對蹠線的幾何圖形,而有些則需要將幾何圖形剪裁成大圓。球形多邊形也需要繞組順序慣例來確定多邊形的哪一側是內部:小於半球的多邊形,其外部環必須順時針旋轉,而大於半球的多邊形,其外部環必須逆時針旋轉。表示孔洞的內部環必須使用其外部環的相反繞組順序。
D3 使用球形GeoJSON在 JavaScript 中表示地理特徵。D3 支援各種常見和不常見地圖投影。由於 D3 使用球形幾何來表示資料,因此您可以透過旋轉幾何圖形將任何方面套用到任何投影。
請參閱下列其中一項
提示
若要將 shapefile 轉換為 GeoJSON,請使用shp2json,它是shapefile 套件的一部分。請參閱命令列製圖,以了解 d3-geo 和相關工具的簡介。另請參閱TopoJSON,它是 GeoJSON 的延伸,更為精簡且編碼拓撲。
注意
D3 的繞行順序慣例也由 TopoJSON 和 ESRI shapefile 使用;不過,它與 GeoJSON 的 RFC 7946 慣例相反。另外請注意,標準 GeoJSON WGS84 使用平面等矩形坐標,而不是球面坐標,因此可能需要 拼接 以移除反子午線切口。