【发布时间】:2017-06-09 11:30:27
【问题描述】:
我尝试使用this example 之后的地图的光栅重投影。如果我将示例 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);
(例如参见this example)。但是,我发现没有简单的方法来检查点 [x,y] 是否在 SVG 封闭路径内。
所以我的问题是:
- 逆投影是否存在错误,或者我没有正确使用它们?
- 如果这是最好的方法,我如何才能找到
[x,y]点是否在 svg 路径内? - 好奇,d3
path函数获取地图边界轮廓的算法代码在哪里?我在 github repo 上找不到它。
谢谢。
编辑:我检查了this example 中的所有 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。
【问题讨论】:
标签: javascript d3.js raster map-projections d3.geo