我正在使用D3创建一个带有正投影的世界地图,用户可以像使用地球一样“旋转”它们。
我在Firefox中遇到了抖动渲染的一些问题所以我使用R中的Douglas-Peuker算法的实现来简化我的地图特征。我将其转换为geoJSON并由D3渲染它,如下例所示:{{3 }}。 (请注意,我在下面描述的问题不会出现在非简化功能中,但如果我不简化,则Firefox无法使用。)
在Firefox中,性能仍然很差(越来越好),但是一个新的问题已经悄悄进入。当你全球化,以便印度尼西亚大致位于全球中心时,其中一个多边形会转变为覆盖整个地球。当北美和南美居中时,也会出现同样的问题。
作为平移的一部分,我使用以下函数重新投影/重新绘制地球(jsfiddle的第287行):
function panglobe(){
var x=d3.event.dx;
var y=d3.event.dy;
var r = mapProj.rotate();
r[0] = r[0]+lonScale(x)
r[1] = r[1]+latScale(y)
mapProj.rotate(r);
countries.attr("d",function(d){
var dee=mapPath(d)
return dee ? dee : "M0,0";
});
}
非常感谢任何帮助/见解/建议。干杯
答案 0 :(得分:1)
应用于多边形时线简化算法的一个常见问题是它们可能会引入自相交,这通常会导致几何算法的破坏。
您的简化多边形很可能包含一些自交叉点,例如:一个可以追溯的部分。这可能会导致D3出现问题,例如:当沿着剪辑区域边缘对交叉点进行排序时(尽管在将来的版本中我希望也支持自相交多边形)。
更好的算法可能是 Visvalingam-Whyatt ,例如由TopoJSON使用,因为它根据区域进行了简化。然而,它也可以产生自相交的多边形,尽管可能不像Douglas-Peucker那样频繁。
对于交互式地球仪,我建议迈克博斯托克的world-atlas world-110m.json
{/ 1}}。