私は驚くべきD3jsジオモジュールを使用して生成しているSVGを少し最適化しようとしています。D3jsのSVGパス生成文字列の簡略化
私はSVGパスのd
属性発生器としてd3.geo.path
を使用しています:
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
})
動作し、今私は、各値のための唯一の4小数を取得パス文字列に。このように:
M713.6010,459.8780L714.7443,460.0817L715.0310,460.5903L715.0310...
私の質問は:それは、より良い、より少ないハックの方法で行うことができますか?それは、D3jsのpath
関数によって吐き出された後に文字列を微調整するのが正しいとは思わないし、パス自体または投影上のある点で丸めを指定すると良いでしょう...
私の場合、必要なすべての詳細を表示するのに十分な大きさの仮想SVG幅(viewBox)を選択してから、小数部分を完全に削除しました: 'const path_trunc = d => path(d).replace(/ \。 d +/g、 '') 'しかし、geo.pathにこの機能がどこかに隠されているのかどうか疑問に思っていました。 – Tobia