我尝试按照此示例使用地图的光栅重投影。如果我通过方位角等距投影更改示例kavrayskiy7
投影,
var projection = d3.geo.azimuthalEquidistant()
.scale(90)
.translate([width / 2, height / 2])
.clipAngle(180 - 1e-3)
.precision(.1);
它应该将地球投影到光盘上(投影图的图像)。但是,光栅重投影超出了该圆盘并用扩展图片填充了整个画布(反投影函数不是单射的,地图上的几个 x/y 点对应于单个 lon/lat 坐标)。在原始示例中,应避免使用该行
if (λ > 180 || λ < -180 || φ > 90 || φ < -90) { i += 4; continue; }
但是对于这个例子不起作用。例如,由于相同的效果,我在使用 Mollweide 投影(两极出现两条线)时发现了其他故障。
为了解决这个问题,一种方法是修复逆投影,以便在 x/y 输入超出范围时返回错误或 None。我的尝试是使用整个球体的正向投影来检查一个点是否在范围内,以获得具有地图边界的 SVG 路径,如下代码所示:
var path = d3.geo.path()
.projection(projection);
var bdry = svg.append("defs").append("path")
.datum({type: "Sphere"})
.attr("id", "sphere")
.attr("d", path);
(例如参见此示例)。但是,我发现没有简单的方法来检查一个点[x,y]
是否在 SVG 封闭路径内。
所以我的问题是:
- 逆投影是否存在错误,或者我没有正确使用它们?
[x,y]
假设这是最好的方法,我怎么能找到一个点是否在 svg 路径内?path
好奇,d3函数获取地图边界轮廓的算法代码在哪里?我在 github repo 上找不到它。
谢谢。
编辑:我浏览了这个例子中的所有 44 个投影,我发现以下 25 个故障:
Albers、Bromley、Collignon、Eckert II、Eckert IV、Eckert VI、Hammer、Hill、Goode Homolosine、Lambert 圆柱等积、Larrivée、Laskowski、McBryde–Thomas Flat-Polar Parabolic、McBryde–Thomas Flat-Polar Quartic、McBryde– Thomas Flat-Polar Sinusoidal, Mollweide, Natural Earth, Nell-Hammer, Polyconic, Sinu-Mollweide, van der Grinten, van der Grinten IV, Wagner IV, Wagner VII, Winkel Tripel。