我正在使用d3.geo.mercator()
投影绘制带有D3的SVG地图。
我还对地图使用了缩放行为,该行为将a应用于持有地图所有路径transform
的<g>
对象。
看完Mike Bostock(http://bl.ocks.org/mbostock/6252418)进行的动态简化示例之后,我想知道是否可以在我的情况下应用这样的算法来在缩小几何图形时以更少的点重绘它?
在我看到的所有示例中,都有一个simplify
函数可以忽略可忽略的点并按原样绘制其余部分,并且该函数在中使用var path = d3.geo.path().projection(simplify)
。我不能那样使用它,因为我需要在已经存在的基础上应用它projection = d3.geo.mercator().scale(*).translate([*,*])
。
如何在现有投影中使用动态简化?
根据您引用的示例,“动态简化II”
该simplify
功能将类似于
var simplify = d3.geo.transform({
point: function(x, y, z) {
if (z >= area) {
this.stream.point(x, y);
}
}
});
area
阈值变量在哪里,您可以预先设置或根据缩放进行动态修改。
那么你可以使用它的projection
方法d3.geo.path()
类似
var path = d3.geo.path()
.projection(simplify);
这或多或少是您在答案中描述的情况。现在,根据动态简化IV,投影方法也可以定义为
var path = d3.geo.path()
.projection({
stream: function(s) {
return simplify.stream(s);
}
});
这和以前完全一样。只是“扩展”了默认方法。d3.geo.path
总是调用projectionstream
方法,因此您可以声明自己的流并将其转发给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,像素或其他坐标系,则必须不同地计算阈值区域。
重要说明,函数中的z
参数simplify
不是海拔高度。它是每个点定义的三角形面积,它是TopoJSON甜度的一部分,是预先计算的值。
恐怕这意味着您不能依靠此示例来简化常规的geoJSON。您必须添加自己的逻辑来计算每个点的相关区域(如果要应用Visvalingam的算法)或到最近点的距离(如果要应用Douglas-Peucker算法)或实现自己的算法。
祝好运。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句