[英]Dynamic simplification with projection in D3
我正在使用d3.geo.mercator()
投影绘制一个带有D3的SVG地图。
我还使用了地图的缩放行为,该地图将transform
应用于保存地图所有路径的<g>
对象。
在看了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
是一个阈值变量,您可以预先设置或根据缩放进行dinamically修改。
然后你会在d3.geo.path()
的projection
方法上使用它
var path = d3.geo.path()
.projection(simplify);
这或多或少是你在答案中描述的情况。 现在,根据动态简化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
参数不是海拔高度。 它是由每个点定义的三角形区域,是一个预先计算的值,它是TopoJSON甜味的一部分。
我担心这意味着你不能依赖这个例子来简化常规的geoJSON。 你必须添加自己的逻辑来计算每个点的相关区域(如果你想应用Visvalingam算法 )或距离最近点的距离(如果你想应用Douglas-Peucker算法)或实现你自己的算法。
祝好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.