我正在尝试优化使用令人惊叹的D3js地理模块生成的SVG。我正在使用d3.geo.path作为SVG路径的d属性生成器:
可以看到,一些数字非常长,有太多小数位,在当前分辨率下并不真正有用,这会使DOM变得有点拥挤,并且调试这些路径时会变得迟钝(还有很多路径,因为这是一个绘制了许多国家的世界地图)。
因此,我的第一种方法是为
我的问题是:有没有更好的方法来解决这个问题,而不是采用hackish的方法?在D3js的
path = d3.geo.path().projection(config.projection); // projection is initialized somewhere else
然后使用它来呈现如下路径:
svg.selectAll(".country")
.data(countries)
.enter()
.insert("path", ".graticule")
.attr({
class: "country",
d: path
})
我得到的路径字符串类型是这样的:
M713.601085,459.8780053259876L714.7443994399441,460.08170562468473L715.0310281028103,460.5903728431771L715.0310281028103...
可以看到,一些数字非常长,有太多小数位,在当前分辨率下并不真正有用,这会使DOM变得有点拥挤,并且调试这些路径时会变得迟钝(还有很多路径,因为这是一个绘制了许多国家的世界地图)。
因此,我的第一种方法是为
path
创建这个pathSimplified
包装器:// Path simplified: take some decimals out of the 'd' string
pathSimplified = function (d) {
return path(d).replace(/(\.\d{4})\d+/g, '$1');
};
然后使用它来替代path
:
//...
.attr({
class: "country",
d: pathSimplified
})
这个方法可行,现在路径字符串中每个值只保留了四位小数。就像这样:
M713.6010,459.8780L714.7443,460.0817L715.0310,460.5903L715.0310...
我的问题是:有没有更好的方法来解决这个问题,而不是采用hackish的方法?在D3js的
path
函数输出字符串后对其进行微调并不合适,最好能在路径本身或投影上指定四舍五入。
const path_trunc = d => path(d).replace(/\.\d+/g, '')
但我也在想,geo.path是否在某个地方隐藏了这个功能。 - Tobia