マップのラベルに力の反発を適用して、適切な場所を自動的に見つける方法は?
ボストックの「地図を作ろう」
Mike Bostock のLet's Make a Map (下のスクリーンショット)。デフォルトでは、ラベルはポイントの座標とポリゴン/マルチポリゴンのpath.centroid(d)
+ 単純な左揃えまたは右揃えに配置されるため、頻繁に競合が発生します。
手作りラベルの配置
私が出会った改善の 1 つは、人間が作成したIF
修正を追加し、必要な数だけ追加することを必要とします。
.attr("dy", function(d){ if(d.properties.name==="Berlin") {return ".9em"} })
再調整するラベルの数が増えるにつれて、全体がますます汚くなります。
//places's labels: point objects
svg.selectAll(".place-label")
.data(topojson.object(de, de.objects.places).geometries)
.enter().append("text")
.attr("class", "place-label")
.attr("transform", function(d) { return "translate(" + projection(d.coordinates) + ")"; })
.attr("dy", ".35em")
.text(function(d) { if (d.properties.name!=="Berlin"&&d.properties.name!=="Bremen"){return d.properties.name;} })
.attr("x", function(d) { return d.coordinates[0] > -1 ? 6 : -6; })
.style("text-anchor", function(d) { return d.coordinates[0] > -1 ? "start" : "end"; });
//districts's labels: polygons objects.
svg.selectAll(".subunit-label")
.data(topojson.object(de, de.objects.subunits).geometries)
.enter().append("text")
.attr("class", function(d) { return "subunit-label " + d.properties.name; })
.attr("transform", function(d) { return "translate(" + path.centroid(d) + ")"; })
.attr("dy", function(d){
//handmade IF
if( d.properties.name==="Sachsen"||d.properties.name==="Thüringen"|| d.properties.name==="Sachsen-Anhalt"||d.properties.name==="Rheinland-Pfalz")
{return ".9em"}
else if(d.properties.name==="Brandenburg"||d.properties.name==="Hamburg")
{return "1.5em"}
else if(d.properties.name==="Berlin"||d.properties.name==="Bremen")
{return "-1em"}else{return ".35em"}}
)
.text(function(d) { return d.properties.name; });
より良い解決策が必要
これは、大規模なマップや一連のラベルでは扱いにくいものです。これらの両方のクラスに力の反発を追加する方法:.place-label
と.subunit-label
?
締め切りが決まっていないので、この問題は非常にブレイン ストーミングですが、非常に興味があります。この質問は、Migurski/ Dymo.pyの基本的な D3js 実装として考えていました。Dymo.py の README.md ドキュメントは、主要なニーズと機能 (作業の 20%、結果の 80%) を選択するための大規模な目標を設定しています。
- 最初の配置: Bostock は、ジオポイントを基準にして左/右の配置で良いスタートを切ります。
- ラベル間の反発:異なるアプローチが可能で、Lars と Navarrc はそれぞれ 1 つを提案しました。
- ラベルの消滅: 1 つのラベルの全体的な反発が強すぎる場合のラベルの消滅関数。他のラベルの間で圧迫されているため、消滅の優先度はランダムまたは
population
データ値に基づいており、NaturalEarth の .shp ファイルから取得できます。 - 【高級感】ラベル同士の反発力:固定ドットと可動ラベル付き。しかし、これはむしろ贅沢です。
ラベルの反発がラベルのレイヤーやクラス全体で機能するかどうかは無視します。しかし、国のラベルと都市のラベルが重ならないようにするのも贅沢なことかもしれません。