我尝试使用此示例后的地图的光栅重投影.如果我kavrayskiy7
通过Azimuthal Equidistant投影更改示例投影,
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输入超出范围时返回错误或无.我的尝试是使用整个球体的前向投影来检查点是否在范围内,以获得具有地图边界的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路径内,假设这是最好的方法?
通过好奇心,d3 path
函数的算法代码在哪里获取地图的边界轮廓?我在github回购中找不到它.
谢谢.
编辑:我在这个例子中经历了所有44个投影,我发现以下25个故障:
Albers,Bromley,Collignon,Eckert II,Eckert IV,Eckert VI,Hammer,Hill,Goode Homolosine,Lambert圆柱形等面积,Larrivée,Laskowski,McBryde-Thomas平极抛物线,McBryde-Thomas平极四分之一,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.