Это очень особенное. У меня есть несколько маршрутов (представьте их как реки на карте), и я хочу, чтобы им дали название.
Этот код работает правильно. Он создает пути и после этого пишет текст в этих строках:
function draw_rivertext(){
var featureCollection = topojson.feature(currentMap, currentMap.objects.text);
svgmap.append("g")
.selectAll("path")
.data(featureCollection.features)
.enter().append("path")
.attr("d", path)
.attr("class", "helperline")
.attr("id", function(d) {return "path"+d.properties.id});
svgmap.append("text")
.selectAll("text")
.data(featureCollection.features)
.enter()
.append("textPath")
.attr("class", "helperline-text")
.attr("xlink:href", function(d) {return "#path"+d.properties.id})
.text(function(d) {return d.properties.name});
}
Но проблема в том, что у текста всего один размер шрифта. Итак, допустим, у меня длинный ривер и короткий. Таким образом, шорт-ривер должен быть очень маленьким, а не такого же огромного размера.
Итак, моя идея заключалась в том, чтобы установить текст:
.attr("font-size", "10")
и здесь значение 10 должно соответствовать текущему размеру из идентификатора пути. Я действительно не знаю, как это сделать.
Вот несколько ссылок по этой теме:
- https://www.safaribooksonline.com/library/view/svg-essentials/0596002238/ch08s05.html
- Текстовый путь SVG, определить, когда текст выходит за пределы пути
- как установить размер шрифта в зависимости от размера контейнера?
- http://eyeseast.github.io/visible-data/2013/08/26/responsive-d3/
- https://milkator.wordpress.com/2013/02/25/making-a-map-of-germany-with-topojson/
Я также нашел некоторые, которые передискретизируют размер шрифта и так далее после создания его с помощью jQuery. Что ж, это наверняка решение. Получение размеров пути; повторная выборка текстовых атрибутов для этих значений. Но я не думаю, что это правильное решение.
Еще одна идея - указать размер шрифта в topojson как собственный параметр. Но, о боже, это было бы попыткой и ошибкой, поскольку в QGIS нет реальных измерений для этого.
.getTotalLength()
на узлеpath
, чтобы получить его длину (или используйте ограничивающую рамку, если это более подходит), а затем преобразуйте это значение в размер шрифта. - person Lars Kotthoff   schedule 27.01.2015path
- ваш выбор, содержащий один путь, используйтеpath.node().getTotalLength()
. Это не D3, а простая функция Javascript. - person Lars Kotthoff   schedule 27.01.2015.each()
:selection.each(function() { this.getTotalLength(); })
- person Lars Kotthoff   schedule 28.01.2015d3.selectAll("path")
. Вы не можете использовать это внутри определения атрибута. - person Lars Kotthoff   schedule 28.01.2015.each()
и добавьте длину к привязанным к ним данным. Затем добавьте текст (который будет распространять данные) и используйте длину, которую вы добавили к данным ранее, чтобы определить размер шрифта. - person Lars Kotthoff   schedule 28.01.2015