gpt4 book ai didi

javascript - 在 D3 中使用投影进行动态简化

转载 作者:行者123 更新时间:2023-11-29 14:52:11 25 4
gpt4 key购买 nike

我正在使用 d3.geo.mercator() 使用 D3 绘制 SVG map 投影。

我还对应用了 transform 的 map 使用缩放行为到 <g>包含 map 所有路径的对象。

看过 Mike Bostock (http://bl.ocks.org/mbostock/6252418) 的动态简化示例后,我想知道我是否可以在我的案例中应用这样的算法,以便在缩小时用更少的点重新绘制几何图形?

在我见过的所有示例中,都有一个 simplify跳过可忽略的点并按原样绘制其余部分的函数,该函数用于 var path = d3.geo.path().projection(simplify) .我不能那样使用它,因为我需要将它应用到现有的 projection = d3.geo.mercator().scale(*).translate([*,*]) 之上.

我应该如何对现有投影使用动态简化?

最佳答案

根据您引用的示例,Dynamic Simplification II

simplify 函数类似于

var simplify = d3.geo.transform({
point: function(x, y, z) {
if (z >= area) {
this.stream.point(x, y);
}
}
});

其中area是一个阈值变量,您可以预先设置或根据缩放动态修改。

然后你可以在 d3.geo.path()projection 方法上使用它,比如

var path = d3.geo.path()
.projection(simplify);

这或多或少就是您在回答中描述的情况。现在,根据Dynamic Simplification IV , 投影方法也可以定义为

var path = d3.geo.path()
.projection({
stream: function(s) {
return simplify.stream(s);
}
});

这和之前完全一样。它只是“扩展”了默认方法。 d3.geo.path 始终调用投影stream 方法,因此您可以声明自己的流并将其转发到simplify.stream

现在,您说您需要使用 d3.geo.mercator() 重新投影您的路径。

var mercatorProjection = d3.geo.mercator().scale(*).translate([*,*]);

没问题:流是可链接的。你可以这样做:

var path = d3.geo.path()
.projection({
stream: function(s) {
return simplify.stream(mercatorProjection.stream(s));
}
});

还有:

var path = d3.geo.path()
.projection({
stream: function(s) {
return mercatorProjection.stream(simplify.stream(s));
}
});

唯一的区别是,如果您处理 WGS84、像素或其他坐标系,则必须以不同方式计算阈值区域。

重要警告simplify 函数中的z 参数不是高度。是the area of the triangle defined by each point ,一个预先计算的值,它是 TopoJSON 甜蜜的一部分。

恐怕这意味着您不能依赖此示例来简化常规 geoJSON。你必须添加自己的逻辑来计算每个点的相关面积(如果你想应用 Visvalingam's algorithm )或到最近点的距离(如果你想应用 Douglas-Peucker 算法)或实现你自己的算法。

祝你好运。

关于javascript - 在 D3 中使用投影进行动态简化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23973985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com