Настройка файла SVG с зацикленной стрелкой, чтобы он соответствовал стилю других стрелок

Я использую файл SVG для изображения внутрирегиональных миграционных потоков людей в Нидерландах. Вот что я сделал до сих пор:

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

Зацикленная стрелка — единственное SVG-изображение, остальные стрелки отрисовываются другими способами. Как видно, петлевая стрелка не имеет черного контура (в отличие от других стрелок). Я хотел бы сделать стиль контура и цвет стрелок однородными.

С этой целью я попытался настроить код SVG-файла, который мне предоставили Билли Кер ( здесь ) и Симбамангу ( здесь ). Это код последнего, который изменяет размер первого таким образом, чтобы его можно было просмотреть в QGIS:

<svg width=".1mm" height=".1mm" version="1.1" viewBox="0 0 2.1694 2.1665" xmlns="http://www.w3.org/2000/svg">
     <g transform="matrix(.1 0 0 .1 .013859 .018301)" fill="none" image-rendering="auto" stroke="#d40000" stroke-width="2.5862">
      <path d="m26.8 13.9a12.8 12.8 0 0 1-10.6 12.6 12.8 12.8 0 0 1-14.3-8.22 12.8 12.8 0 0 1 5.6-15.5 12.8 12.8 0 0 1 16.2 2.81" stop-color="#000000"/>
      <path d="m24.7 0.472-0.434 5.65-5.58-0.401" stop-color="#000000" style="font-variation-settings:normal"/>
     </g>
    </svg>

Это визуализирует статическое изображение цикла. Чтобы сделать его динамичным, я использовал информацию из этого вопроса GIS.SE, чтобы сделать его цвета и контуры изменяемыми в QGIS. Вот скорректированный код:

<svg width=".1mm" height=".1mm" version="1.1" viewBox="0 0 3.1694 3.1665" xmlns="http://www.w3.org/2000/svg">
 <g transform="matrix(.1 0 0 .1 .013859 .018301)" fill="none" image-rendering="auto" stroke="#d40000" stroke-width="3.0862">
  <path d="m26.8 13.9a12.8 12.8 0 0 1-10.6 12.6 12.8 12.8 0 0 1-14.3-8.22 12.8 12.8 0 0 1 5.6-15.5 12.8 12.8 0 0 1 16.2 2.81" stop-color="#000000" stroke-width="param(outline-width) 50" stroke="param(outline) #000" fill="param(fill) #FFF"/>
  <path d="m24.7 0.472-0.434 5.65-5.58-0.401" stop-color="#000000" fill="param(fill) #FFF" stroke="param(outline) #000" stroke-width="param(outline-width) 1"/>
 </g>
</svg>

Однако этот код создает следующий цикл:

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

Тогда я удалил

fill="param(fill) #FFF"

части обоих путей, чтобы получить:

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

К сожалению, я больше не могу изменить цвет стрелок. Поэтому вместо этого я изменил код на:

<svg width=".1mm" height=".1mm" version="1.1" viewBox="0 0 3.1694 3.1665" xmlns="http://www.w3.org/2000/svg">
 <g transform="matrix(.1 0 0 .1 .013859 .018301)" fill="none" image-rendering="auto" stroke="#d40000" stroke-width="3.0862">
  <path d="m26.8 13.9a12.8 12.8 0 0 1-10.6 12.6 12.8 12.8 0 0 1-14.3-8.22 12.8 12.8 0 0 1 5.6-15.5 12.8 12.8 0 0 1 16.2 2.81"  stroke="param(outline) #000" stroke-width="param(outline-width) 40"/>
  <path d="m24.7 0.472-0.434 5.65-5.58-0.401" fill="param(fill) #FFF" stroke="param(outline) #000" stroke-width="1"/>
 </g>
</svg>

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

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

Я могу регулировать ширину обводки, но тогда у меня получается очень тонкая стрелка, вместо тонкого контура стрелки.

Я хотел бы иметь код для зацикленной стрелки, который сделал бы ее похожей на другие (незацикленные) стрелки на изображении. Поэтому желательно, чтобы цикл имел:

  • Тонкий черный контур всей стрелки;
  • Изменяемая ширина стрелки, пропорциональная размеру наконечника стрелки;
  • Стрелка начинается немного менее широкой и становится немного шире к концу, как и другие стрелки.

Вопрос: знаете ли вы, как изменить код SVG-файла зацикленной стрелки таким образом, чтобы он удовлетворял перечисленным выше свойствам? (Первые два свойства являются наиболее важными, третье, возможно, несколько сложнее и чуть менее важно, но было бы неплохо иметь его.)

Нельзя ли просто нарисовать нужную стрелку в Inkscape и сохранить ее как SVG? Почему вы должны редактировать существующий SVG? И более того... почему вы должны редактировать XML SVG?
@ Скотт, я мог бы попробовать, но я никогда не использовал Inkscape или аналогичную программу. Боюсь, это займет у меня много времени.
Вам может потребоваться больше времени, чтобы попытаться выяснить изменения в XML.
@ Скотт Может быть. Я просто надеюсь, что это относительно простая задача — изменить XML или нарисовать стрелку — для кого-то здесь с большим опытом и знанием файлов SVG и/или Inkscape. Я также отдаю должное людям, которые дали ответы на этот вопрос и связанные с ним вопросы в статье, которую я собираюсь написать об этом. Мой опыт в графическом дизайне очень ограничен. Вероятно, мне стоит узнать больше об этом для будущих проектов, но сейчас я надеюсь, что кто-то может мне помочь.
@Scott Также: моя версия Inkscape продолжает ломаться на моем (Mac) компьютере. Фрагменты XML-кода, такие как * fill="param(fill) #FFF" *, позволяют модифицировать изображение в QGIS.

Ответы (1)

В Inkscape вы можете выбрать оба пути и выполнить Path > Stroke to path .

Это преобразует штрихи в контуры с заливкой.

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

Затем выполните Path > Union . Это логическая операция, которая объединит два контура в одну твердую фигуру, т.е. один замкнутый контур с заливкой.

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

Теперь вы можете применить цветную заливку и тонкую черную обводку, чтобы получить желаемый эффект.

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

Вот пример очищенного SVG

<?xml version="1.0" encoding="UTF-8"?>
<svg width="28.1mm" height="28mm" version="1.1" viewBox="0 0 28.1 28" xmlns="http://www.w3.org/2000/svg">
<g fill="#ff7f2a" stroke="#000" stroke-width=".159">
<path d="m13.9.08c-.747.00716-1.5.0746-2.24.203-1.58.274-3.14.828-4.6 1.67v-.00207c-5.85 3.39-8.42 10.5-6.09 16.9 2.31 6.35 8.88 10.1 15.5 8.93 6.65-1.16 11.5-6.95 11.5-13.7l-2.23-.0021c-.0041 5.68-4.08 10.5-9.68 11.5h-.0062c-5.61 1.01-11.1-2.15-13.1-7.5v-.0042c-1.97-5.34.187-11.3 5.11-14.2 4.27-2.48 9.53-1.98 13.2 1.05l-2.54-.181-.16 2.22 6.69.48.519-6.76-2.22-.17-.248 3.22c-2.65-2.43-6.09-3.7-9.56-3.67z" />
</g>
</svg>
Еще раз спасибо!
Есть ли в этом случае XML-параметр, который может управлять толщиной стрелки и наконечником стрелки?
Нет, не после того, как вы нарисовали стрелку. Это уже не обводка, а путь с внешней обводкой и заливкой внутри.
Это редактирование разрушительно, поэтому, если вам нужно сделать это, сделайте копию оригинала, если вам когда-нибудь понадобится более толстая стрелка.
@MaxMuller - извините, забыл добавить ваше имя в эти комментарии.
Это нормально. Спасибо. Я все еще думаю о том, как сделать путь стрелки тоньше и тоньше внутри QGIS. Если у вас есть идеи по этому поводу, не могли бы вы сообщить мне об этом?
Кажется, что-то похожее на то, что я имею в виду, можно сделать, изменив «начало» пути, см. 10:18 на youtube.com/watch?v=yGFp4EoJi9g . Знаете ли вы, можно ли изменить этот параметр через QGIS, изменив путь в XML?
@MaxMuller В Inkscape есть динамическое смещение и эффект смещения пути, но они не являются частью самого формата SVG. При сохранении оптимизированного SVG из Inkscape они снова будут изменены на неизменяемые пути. Если вы сохраните Inkscape SVG, содержащий собственный XML Inkscape, начальные эффекты останутся редактируемыми, но вне Inkscape они вряд ли будут работать в другом приложении.