Создание пути SVG в виде гладкой линии, а не рваной

Что ж, в моем проекте я создаю линии рек из путей. И из-за моей большой ширины штриха он очень рваный:

введите здесь описание изображения

Я уже искал вокруг. Но единственное, что я нашел, это stroke-linejoin: round;. Как вы можете видеть здесь:

введите здесь описание изображения

это намного лучше, но я все еще не удовлетворен.

Есть ли способ получить действительно гладкую линию. Или, скажем, иметь еще более круглое соединение строк?


person kwoxer    schedule 20.02.2015    source источник


Ответы (3)


Интересным направлением является использование d3.svg.line для создания путей из координат вашего объекта geoJSON, после чего вы сможете использовать методы интерполяции D3.

См. D3js-Topojson: как перейти от пиксельных к кривым Безье? и Интерполяция геоданных в d3.svg.line Э. Микса и Хрустящие края с топожсоном? .


Изменить: существует минимальный отдельный пример сглаживания линий который вы можете разветвить через связанный с ним репозиторий git gist. Идея d3.svg.line вместе с интерполяцией y координат для сглаживания линий принадлежит E.Meeks. Э. Микс объясняет свой подход здесь.


Edit2 и решение: я вдруг вспомнил, где topojson на лету конвертируется в geojson. Делая следующее, вы можете работать с файлами топожсона и в конечном итоге получить кривые Безье с экстраполяцией по вашему выбору. Будет работать следующее:

d3.json("./world-110m.json", function(data){
    console.log(data)
    var geojson = topojson.feature(data, data.objects.countries);
    var newJson = newgeoson(geojson);
    console.log(JSON.stringify(newJson))

    d3.select("body").append("svg").attr("id","world")
      .selectAll("path")
        .data(newJson)
      .enter()
        .append("path")
        .style("stroke-width", 1)
        .style("stroke", "black")
        .style("fill-opacity", .5)
        .attr("d", d3.svg.line()
          .x(function(d){ return d[0] })
          .y(function(d){ return d[1] }).interpolate("cardinal"))
        .style("fill", "#7fc97f");
})

Живая демонстрация: Минимальное сглаживание линий d3js, версия topojson

введите здесь описание изображения

person Hugolpz    schedule 25.02.2015
comment
Да, это выглядит хорошо. Добавлю в закладки и попробую, когда у меня будет время для этого. Спасибо. - person kwoxer; 25.02.2015
comment
В конце концов я сам предпочел использовать более тонкое упрощение topojson с помощью инструмента командной строки topojson. Но этот способ @Emeeks привлек и мои глаза. - person Hugolpz; 25.02.2015
comment
Но упрощение означает, что я теряю данные. Но я хочу, чтобы он был напечатан так же подробно, как я его нарисовал =) Так что это не решение для меня. Как я уже сказал, возвращаюсь, когда работаю или возникают проблемы =) Спасибо. - person kwoxer; 26.02.2015
comment
Ммм, я понятия не имею, как использовать код из emeeks на jsfiddle.net/kwoxer/kpL1uyy2/6 Уже пробовал немного в этом простом случае. Но ни один не увенчался успехом. Не могли бы вы мне помочь =/ - person kwoxer; 26.02.2015
comment
Хорошо, так что это было бы не для меня. Даже мой файл топойсона имеет размер 500 КБ. Значит, у меня нет пути, верно? Кроме того, что из самого моего вопроса. - person kwoxer; 26.02.2015
comment
Я здесь всего лишь указатель. Вы должны прочитать объяснения E.Meeks, и вся благодарность должна быть обращена к нему. D3js также конвертирует topojson в geojson на лету. Я не знаю, на каком уровне, т. Дело в том, что это должно быть возможно, но для этого действительно потребуется задать несколько дополнительных вопросов о Stackoverflow и найти ответ на вопрос о сглаживании данных topojson data =›. Я быстро (за час) сделал минимальную автономную версию кода E.Meek, эту новую версию будет проще взломать. Смотрите мой ответ. - person Hugolpz; 26.02.2015
comment
Ну, я нашел это здесь. Похоже, Рафаэля будет легко использовать: jsfiddle.net/ry8kT, не так ли? - person kwoxer; 26.02.2015
comment
Моя ошибка в том, что я просто показываю SVG с Рафаэлем. Я открою вопрос об этом. Потому что я до сих пор не знаю, как создать геоджсон из моего топожсона в браузере. - person kwoxer; 26.02.2015
comment
@kwoxer: только что добавил решение topojson, которое стоит попробовать. Радость. - person Hugolpz; 28.02.2015
comment
Ммм, но у меня есть путь к значению d. Я не знаю, как заменить на ваш. Но добавленные вами вещи выглядят великолепно. Так что не могли бы вы показать это на моем jsfiddle? Было бы здорово. - person kwoxer; 28.02.2015
comment
Проверьте мой код блоков, сделайте форк, поставьте console.log(JSON.stringify(d)) и проверьте данные. Общее решение готово, ваш код готов. - person Hugolpz; 28.02.2015
comment
Я просто получаю нулевые значения: jsfiddle.net/kwoxer/g83ee4xf это правильно? Что я делаю неправильно? - person kwoxer; 28.02.2015
comment
Я могу сказать что, но в ваших данных топойсона что-то не так. Я реорганизовал ваш код и смешал его с тем, что я ранее предоставил вам. Ваши данные не работают jsfiddle.net/g83ee4xf/4, мои данные работают jsfiddle.net/g83ee4xf/5 . - person Hugolpz; 28.02.2015
comment
Я создаю топоджсон на своем ПК из множества разных файлов геоджсона. Может здесь причина? - person kwoxer; 28.02.2015
comment
На самом деле я думаю, что у меня есть другая проблема Хьюго. Итак, в первую очередь я хотел бы проверить это, потому что не только сглаживание могло бы мне помочь. Мне нужно больше деталей. gis.stackexchange.com/questions/137173/ - person kwoxer; 01.03.2015
comment
Давайте продолжим это обсуждение в чате. - person kwoxer; 01.03.2015

Если вас не устраивает stroke-linejoin:round, вы можете изучить создание схемы пути ,

но, возможно, было бы проще, если бы вы попытались сгладить свой путь с помощью кубический Безье.

person maioman    schedule 20.02.2015
comment
Кубический Безье на самом деле не вариант, мне нужно пойти по пути по некоторым причинам. И другой пример выглядит довольно сложным, но интересным =/ Но понятия не имею, с чего начать, и решение css было бы намного лучше. - person kwoxer; 21.02.2015

Если вы недовольны тем, как это выглядит, то мне кажется, что проблема в том, что ваша река определяется слишком малым количеством точек.

Любой метод, который вы используете для сглаживания пути, такой как алгоритм подгонки кривой, вероятно, приведет к тому, что представление вашей реки будет еще менее точным, чем то, что вы имеете сейчас.

person Paul LeBeau    schedule 21.02.2015
comment
На самом деле это топойсон, и у оригинальной реки действительно много разных точек на линии реки. Так что это может быть топоджсон, который каким-то образом уменьшает точки, чтобы получить файл меньшего размера. - person kwoxer; 21.02.2015