d3-geo
地図投影は、経度 *λ* と緯度 *φ* を受け取り、平面上の対応する *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は、JavaScriptで地理的フィーチャを表すために球面GeoJSONを使用します。D3は、一般的なおよび特殊な地図投影を幅広くサポートしています。そして、D3は球面ジオメトリを使用してデータを表すため、ジオメトリを回転させることで、任意の投影に任意のアスペクトを適用できます。
以下のいずれかを参照してください。
- パス - GeoJSONからSVGパスデータの生成
- 投影 - 球面ジオメトリの平面への投影
- ストリーム - (球面または平面の)ジオメトリの変換
- 形状 - 円、線、その他の球面ジオメトリの生成
- 球面数学 - 球面ジオメトリの下位レベルの方法
ヒント
シェープファイルをGeoJSONに変換するには、shp2json(shapefileパッケージの一部)を使用します。コマンドライン・カルトグラフィで、d3-geoと関連ツールの紹介をご覧ください。TopoJSONも参照してください。これはGeoJSONの拡張機能であり、はるかにコンパクトで、トポロジをエンコードします。
注意
D3の巻線順序規則はTopoJSONとESRIシェープファイルでも使用されていますが、GeoJSONのRFC 7946とは逆の規則です。また、標準的なGeoJSON WGS84は平面正距円筒投影座標を使用しており、球面座標を使用していないため、ステッチングが必要になる場合があります(反子午線カットを除去するため)。