如何创建具有可更改的填充颜色,笔触颜色和笔触宽度的svg符号?


38

我想使用Inkscape为Qgis创建一些svg符号,这些符号必须具有问题中所述的属性。在过去的两天里,我一直按照Sourcepole的指示进行实验,并且模仿了一些符号与qgi捆绑在一起的情况,qgis具有所需的属性,但没有成功。

最后,我尝试了最简单的符号形式:我创建了一个仅在Inkscape中包含一个圆的svg,然后尝试对其进行修改。

原始文件(circle.svg)具有以下行:

<path
   sodipodi:type="arc"
   style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.01988637;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"

我将其修改为:

<path
   sodipodi:type="arc"
   style="fill:param(fill) #ffffff;fill-opacity:1;stroke:param(outline) #000000;stroke-width:param(stroke-width) 1.01988637;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"

保存为circle_modified.svg并将其选择为点符号,但是Qgis不能同时更改所有三个参数。

我做错了什么或应该做些什么?

我的系统:Ubuntu 12.04 64位上的Qgis 1.8.0,Inkscape 0.48,Gedit 3.4.1文本编辑器。

Answers:


44

要创建与修改SVG符号填充颜色笔触颜色笔触宽度在QGIS,则应更换式的从属性路径与这3个属性的元素:

  • fill =“ param(fill)#FFF”
  • 笔画 =“ param(outline)#000”
  • stroke-width =“ param(outline-width)1”

如果您使用的是InkScape,则在编写新的SVG文件后,请编辑该文件并将以行开头的整个行替换为style:

style="fill:#00a000;fill-opacity:1;stroke:#000000;stroke-width:1;(...)"

与以下行:

fill="param(fill) #FFF" stroke="param(outline) #000" stroke-width="param(outline-width) 1"

我在QGIS中将这些行添加到哪里?
newGIS '16

2
您将.svg文件打开到文本编辑器中,然后可以将这行代码添加到其中。
DiogoCaribé16年

2
感谢您的回答!我不得不改变了class="st3",不能style="fill:#00a...fill="param(fill) #FFF" stroke="param(outline) #000" stroke-width="param(outline-width) 1",以使其为我工作。(我在插画家中创建了svg。)
Henrik

4

昨天发现如何添加SVG符号以来,我也一直想这样做,但是它们都是黑色的。jgrocha给出的答案是工作-我想将其投票,但是刚刚加入GIS论坛,我需要首先获得一些声誉!

我还找到了可确认答案的页面:QGIS中带有可修改颜色的SVG符号

为了能够更改标记的颜色,我们必须为占位符添加占位符“ param(fill)”,为轮廓色添加占位符“ param(outline)”,并为笔划宽度添加占位符“ param(outline-width)”。这些占位符后面可以有一个默认值:

<svg width="100%" height="100%">
  <rect fill="param(fill) #ff0000" stroke="param(outline) #00ff00" stroke-width="param(stroke-width) 10" width="100" height="100">
  </rect>
</svg>`

谢谢!


我在QGIS中将这些行添加到哪里?
newGIS

4

似乎有必要提供有关SVG基础知识的简单答案,以及此处提供的有关软件细节的详细信息。

SVG文件只是一个文本文件。文件结尾为.svg,但可以在文本编辑器中打开,该文件与文件结尾为.txt的文件相同

一个简单的svg文件如下所示:

<svg width="580" height="400" xmlns="http://www.w3.org/2000/svg">
<!-- This is a comment -->

<g id="group1">
<title>My group</title>
<rect id="rectangle1" height="29" width="27" y="50" x="57" stroke-width="1.5" stroke="#000" fill="#ff0"/>
<ellipse ry="17" rx="16" id="circle1" cy="64" cx="113.5" stroke-width="1.5" stroke="#999" fill="#aaa"/>
<path id="path1" d="m56.5,97l51.5,1l5,25l-29,-5l-27.5,-21z" stroke-width="1.5" stroke="#f00" fill="#fff"/>
</g>
</svg>

在这里,您可以看到颜色是由参数定义的(点被0-9或AF之间的字符替换):

stroke=#...
fill=#...

笔划宽度定义为

stroke-width="..."

可以使用文本编辑器添加以下内容,以替换您在SVG中选择的任何定义的值...从而使QGIS可以设置这些值。QGIS理解“ param(fill)”的值-其他“ param(...)”值-因为这些值是由QGIS本身设置的。

填充颜​​色: fill="param(fill) #FFF"

轮廓/线条颜色: stroke="param(outline) #000"

轮廓/线宽: stroke-width="param(outline-width) 1"

填充不透明度: fill-opacity="param(fill-opacity)"

轮廓线不透明度: stroke-opacity="param(outline-opacity)"

请注意,没有什么可以阻止您在稍微奇怪的地方使用'param(...)'值-因此,例如,您可以使用'param(fill-opacity)'值来定义填充颜色中的一位SVG文件,但是SVG的另一位中有笔触/线条颜色。

在QGIS作曲家或样式符号对话框中,SVG颜色的设置非常明显。填充和描边/线条的不透明度是颜色设置的一部分。笔划/线宽设置很明显。

最后两点

首先,请注意,在SVG中,将颜色定义为属性的集合是有效的,如下所示:

style="fill:none;fill-opacity:1;stroke:#000000;"

如果您包含此处所述的参数,这似乎无法正常工作。

其次,当使用Illustrator或Inkscape之类的软件时,此软件可以将许多其他属性添加到SVG文本中。如果您知道自己在做什么,并且了解了以上SVG的基础知识,那么您可以不使用此附加文字而使工作变得更简单。特别是,您可能会发现颜色是通过样式的定义设置的,而不是逐项设置的。


3

我也遇到了同样的问题,但是经过一些尝试,它终于成功了。我在这里编写程序,希望对您有所帮助。我在inkscape中创建了一个简单的螺旋并将其另存为svg。然后,我在文本编辑器(例如Notepad ++)中将其打开,并且在我的svg代码中两次出现了“样式”条目。在此块中的第一个:

<linearGradient
   id="linearGradient6172"
   osb:paint="solid">
  <stop
     style="stop-color:#000000;stop-opacity:1;"
     offset="0"
     id="stop6174" />
</linearGradient>

然后在这里:

<path
   sodipodi:type="spiral"
   style="fill:none;fill-rule:nonzero;opacity:1;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:35;stroke-miterlimit:4;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
   id="path4686" />

为了使代码起作用,以便在qgis中具有可编辑的svg螺旋,我从第一个代码块中完全删除了第一个“样式”条目:

<linearGradient
   id="linearGradient6172"
   osb:paint="solid">
</linearGradient>

并按如下所示替换第二个代码块中的第二个“样式”条目:

<path
   sodipodi:type="spiral"
   fill="param(fill) #000" stroke="param(outline) #FFF" stroke-  width="param(outline-width) 1"
   id="path4686" />

“#000”和“ #FFF”是填充和轮廓的两种默认颜色,而“ 1”是默认的轮廓宽度(如果没有特别指定)。保存这些更改后,您可以将svg存储在正确的路径中,该路径由QGis指定(取决于可以在“设置”->“选项”->“ SVG路径”中找到的版本)。最后,新的svg对象将出现在其他默认对象中,并且可以编辑。

希望能有所帮助


2

我将对此进行扩展,因为我花了一些时间才能使其正常运行。制作符号并将其另存为Inkscape SVG,然后在文本编辑器中打开。在底部的代码块中,您将看到;style =“ fill:#00a000; fill-opacity:1; stroke:#000000; stroke-width:1;(...)”将此行替换为;fill =“ param(fill)#FFF” stroke =“ param(outline)#000” stroke-width =“ param(outline-width)1”在我的SVG文件中,样式行针对svg中的每个实体或形状显示,替换这些行对我不起作用;但是在Inkscape SVG的底部进行此操作确实可行。我在Optimized和Plain SVG格式上尝试了我的解决方案和说明,但没有成功,希望对您有所帮助。Inkscape 0.48,QGIS 2.12.0,NotePad ++


2

如果我们使用一个确切的值,这似乎是一个问题。每次打开选项时,颜色或笔触的单个值都会重置为SVG中的值。可以通过在高级选项中设置一个值来解决此问题。我的测试表明,最好在SVG中使用fill="param(fill)"代替fill="param(fill) #FFF"等等。

另一个有趣的解决方法:如果您的SVG具有前景色和背景色,则可以使用笔触颜色作为填充背景色。注意,那么您不能为整个SVG使用单独的轮廓颜色。


1

感谢大家。这里有一些很棒的技巧,它们为我指明了正确的方向,但是没有一个解决我的特定问题,因此我将我发现的内容添加到锅中。由于似乎并非每种情况都有一个正确的答案,因此我想首先提出一个建议,以尽快测试您的结果。

快速编辑测试

  • 暂时将所有svg图标移出QGIS svg文件夹。
  • 将您希望使用的svg文件复制为只读格式,以免覆盖它,并将其可编辑版本放在QGIS svg文件夹中。
  • 打开QGIS,加载要使用的点图层,打开图层属性,然后选择“ SVG标记”。
  • 您可能还希望右键单击一个svg文件,并将默认的“打开方式”程序临时设置为记事本,以便双击它们即可在记事本中对其进行编辑。

使用此设置,您可以立即查看QGIS如何响应您的编辑。在记事本中将svg文件保持打开状态,在QGIS中将属性窗格保持打开状态。要测试编辑结果,只需按Ctrl + S,将其保存在记事本中,然后切换到QGIS。要重新加载svg,请将符号图层类型更改为其他任何类型,然后将其更改回SVG标记。那里也只有一个,因此您可以轻松找到它。我像这样很快地测试了几十个编辑。如果您在编辑后无法将svg返回源表单,可以将其删除并制作另一个副本。

使SVG图标可编辑

我遇到的问题是我正在使用的特定图标在任何地方都没有单词“ style”或“ fill”,因此我很难弄清楚放置参数行的位置。Martina描述的Inkscape技巧解决了这个问题,但是我有很多事情要做,我不想在Inkscape中打开和保存它们,所以我决定尝试尝试并尝试。查看代码,我可以看到版本信息和元数据位于顶部,形状指令位于底部,并用引号引起来,这些引号的开头是<g><path d=(有些是<g><g><path d=),结尾是/></g></svg>。经过一些试验,我发现将参数线放在path和之间d=工作正常,但在选择器窗格中该图标不可见,并且顶部预览窗格中的图标完全用黑色填充。不可见的图标问题似乎是一个错误。我通过添加下面将描述的不透明度参数来修复它。事实证明,黑色填充仅是因为图标只有4mm,并且仅由轮廓填充。为了解决这个问题,我将图标的大小提高了10mm(在QGIS中),并将轮廓缩小到了0.1(在记事本中)。

摘要

如果您的图标在任何地方都没有“ style”或“ fill”字样,但在形状说明之前确实有此行<g><path d=(或<g><g><path d=),您应该可以通过将上面的行替换为来添加编辑参数<g><path fill="param(fill) #FFF" stroke="param(outline) #000" stroke-width="param(outline-width) 1" d=

如果边框太粗,可以通过将最后一个数字更改为小数来缩小边框,例如 <g><path fill="param(fill) #FFF" stroke="param(outline) #000" stroke-width="param(outline-width) 0.5" d=

如果要使图标半透明,可以通过将上面的行更改为这一行来实现<g><path style="opacity:0.5;fill:param(fill) #FFF" stroke="param(outline) #000" stroke-width="param(outline-width) 1" d=。不透明度值可以从1(完全不透明)到0(完全透明),并且您可以使用百分之一甚至千分之一来提高精度(例如0.01)。同样的规则适用于边框厚度。

如果要编辑的文件很多,则可以在StackExchange上找到批处理文件,以自动执行搜索和替换过程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.