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 使用球面几何图形来表示数据,因此你可以通过旋转几何图形将任何方位应用于任何投影。
查看以下内容之一
- 路径 - 从 GeoJSON 生成 SVG 路径数据
- 投影 - 将球面几何图形投影到平面上
- 流 - 变换(球面或平面)几何图形
- 形状 - 生成圆形、线段和其他球面几何图形
- 球面数学 - 用于球面几何图形的底层方法
提示
要将 shapefile 转换为 GeoJSON,请使用 shp2json,它是 shapefile 包 的一部分。查看 命令行制图 了解 d3-geo 和相关工具的介绍。另请参阅 TopoJSON,它是 GeoJSON 的扩展,它更紧凑,并编码了拓扑结构。
注意
D3 的绕线顺序约定也由 TopoJSON 和 ESRI shapefile 使用;但是,它与 GeoJSON 的 RFC 7946 相反。另请注意,标准 GeoJSON WGS84 使用平面等矩形坐标,而不是球面坐标,因此可能需要 拼接 来去除本初子午线切割。