Как применить силовое отталкивание на ярлыках карт, чтобы они автоматически находили свои правильные места?
Босток '' Пусть сделать карту '
Майк Босток Пусть сделать карту (снимок экрана ниже). По умолчанию метки помещаются в координаты точки и многоугольники/мультиполигоны path.centroid(d)
+ простые левые или правые выравнивания, поэтому они часто вступают в конфликт.
Места размещения ручных меток
Одно улучшение Я встретил, чтобы добавить исправленные человеком IF
исправления и добавить столько, сколько необходимо, например:
.attr("dy", function(d){ if(d.properties.name==="Berlin") {return ".9em"} })
Все становится все более грязным по мере увеличения количества ярлыков для увеличения:
//places 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 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
?
Этот вопрос довольно мозговой штурм, поскольку у меня нет крайнего срока, но мне это очень интересно. Я думал об этом вопросе как о базовой реализации D3js Migurski/Dymo.py. Документация Dymo.py README.md задает большой набор целей, из которых можно выбрать основные потребности и функции (20% работы, 80% результата).
- Начальное размещение:. Босток хорошо начнет с позиционирования слева и справа относительно геоинформации.
- Отталкивание между ярлыками: возможен другой подход, Ларс и Наваррк предлагали по одному,
- Уничтожение ярлыков: Функция аннигиляции меток, когда общее отталкивание одного ярлыка слишком интенсивное, поскольку оно сжато между другими метками, причем приоритет аннигиляции является либо случайным, либо основан на значении данных
population
которые мы можем получить через файл NaturalEarth.shp. - [Luxury] Отталкивание от меток к точкам: с фиксированными точками и мобильными метками. Но это скорее роскошь.
Я игнорирую, если отслоение метки будет работать через слои и классы меток. Но получение ярлыков в странах и ярлыки городов не перекрываются, может быть также роскошью.