1

我正在使用 D3 创建一个带有正交投影的世界地图,用户可以像使用地球仪一样用鼠标“旋转”它。

我在 Firefox 中遇到了一些抖动渲染的问题,因此我使用 R 中的 Douglas-Peuker 算法的实现简化了我的地图功能。我将其转储到 geoJSON 并由 D3 渲染,如下例所示:http://jsfiddle。净/cmksA/8/。(请注意,我在下面描述的问题不会出现在非简化功能中,但如果我不简化,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";
    });

}

任何帮助/见解/建议将不胜感激。干杯

4

1 回答 1

1

当应用于多边形时,线简化算法的一个常见问题是它们可以引入自相交,这通常会对几何算法造成严重破坏。

您的简化多边形很可能包含一些自相交,例如,一个自回自交的线段。这可能会导致 D3 出现问题,例如在沿剪辑区域边缘对交叉点进行排序时(尽管在未来的版本中我希望也支持自相交多边形)。

更好的算法可能是Visvalingam–Whyatt,例如 TopoJSON 使用的算法,因为它基于面积进行简化。然而,它也可以产生自相交的多边形,尽管可能比 Douglas-Peucker 少。

对于交互式地球仪,我推荐world-110m.jsonMike Bostock 的世界地图集

于 2013-06-07T15:32:53.600 回答