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

最后,我尝试了最简单的符号形式:一个在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文本编辑器。 br />

#1 楼

要在QGIS中创建具有可更改的填充颜色,笔触颜色和笔触宽度的SVG符号,应使用以下3个属性替换path元素中的style属性:
“ param(fill)#FFF”


stroke-width =“ param(outline-width)1”

如果您使用的是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"


评论


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

– newGIS
16-6-27在6:51



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

–迪奥戈·加勒比(DiogoCaribé)
16 Sep 18'0:55

感谢你的回答!我必须换成class =“ st3”,而不是style =“ fill:#00a ... with fill =” param(fill)#FFF“ stroke =” param(outline)#000“ stroke-width =” param( outline-width)1“,以使其对我有效。(我在illustrator中创建了svg。)

–亨里克
17年1月30日14:45



如果您也想控制不透明度,则需要fill-opacity =“ param(fill-opacity)” stroke-opacity =“ param(outline-opacity)”。

– Stefan
20 Jan 10 '14 at 14:51

#2 楼

似乎有必要提供有关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=#...


定义,可以使用文本编辑器添加以下内容,以替换您在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中,将颜色定义为像这样的属性集合是有效的:

stroke-width="..."


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

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

#3 楼

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


要更改标记的颜色,我们必须添加占位符'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
16年6月27日在6:54

#4 楼

我也有同样的问题,但是经过一些尝试,它终于奏效了。我在这里编写程序,希望对您有所帮助。
我在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>


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

希望它可以提供帮助

#5 楼

我将对此进行扩展,因为我花了一些时间才能使其正常运行。制作符号并将其另存为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 ++

#6 楼

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

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

#7 楼

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

快速编辑测试


暂时将所有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>。经过一些试验后,我发现将参数行放在pathd=之间是可行的,但是图标在选择器窗格中不可见,并且顶部预览窗格中的图标完全用黑色填充。看不见的图标问题似乎是一个错误。我通过添加下面将描述的不透明度参数来修复它。事实证明,黑色填充仅是因为图标只有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上找到批处理文件,以自动执行搜索和替换过程。