Att QGIS kan använda SVG som symboler är säkert känt av alla användare. De flesta känner antagligen också till att det går att anpassa SVG med fasta parametrar för fyllning och linjer, vilket jag skrivit om flera gånger tidigare. Men jag tror inte att så många känner till att QGIS kan använda SVG med dynamiskt skapade parametrar…
När man väljer ”SVG markör” som symbolstil och bläddrar ner bland inställningarna så kommer man till ”Dynamiska SVG-parametrar”. Här kan man skapa ett godtyckligt antal parametrar som styrs av uttryck eller värden i attributtabellen. De namn man använder måste vara samma namn som man använt i SVG filen som parameternamn. Men hur går detta då till?
För att skapa ett enkelt exempel så har jag ett punktlager med attributen ”adam”, ”bertil” och ”cesar”. Jag skapar dynamiska attribut med samma namn, även om dessa namn inte alls behöver ha samma namn. De dynamiska namnen kan heta precis vad som helst, men i exemplet så pekar dessa på attributfält med samma namn för att göra det lite enklare att visualisera. I bilden ovan så har jag en etikett som helt enkelt skriver ut värden från tabellen, men nu vill jag göra en mer anpassad symbol i SVG.
För att skapa symbolen så kan man skriva SVG koden manuellt, speciellt om det är en relativt enkel symbol. Men det vanligaste är antagligen att man använder ett grafikprogram för att generera SVG filerna. Jag använder Inkscape för att göra en mycket enkel symbol med några exempeltexter som ska representera de texter jag vill använda senare i QGIS.
Mitt exempel består av en polygon och tre texter. Texter (och polygon) döps på ett representativt sätt så de blir enklare att identifiera i koden. När jag sedan sparar filen så använder jag ”optimerad SVG” i Inkscape för att ta bort mycket kod som inte egentligen behövs.
Vid exporten så kan man sätta flera parametrar, så titta igenom dessa och prova dig fram till något som fungerar. I mitt fall så säkerställer jag att inga ID variabler tas bort från koden.
Filen öppnas sedan i en textredigerare. Gärna en som förstår syntaxen och ger stöd med formateringen.
Jag använder VSCodium (VS Code utan telemetri) här, men vilket text eller kodeditor som helst går bra.
Steg ett är att anpassa koden till QGIS standard när det gäller färghantering (om man nu vill det). Leta reda på fill=, opacity=, stroke=, stroke-width= och stroke-opacity=. Det är inte säkert att alla dessa finns i koden, men det är dessa som kan anpassas för att fungera med QIGS. Byt det som finns inom citationstecken till parametrar som är standard i QGIS.
fill=”param(fill)”
opacity=”param(fill-opacity)”
stroke=”param(outline)”
stroke-width=”param(outline-width)”
stroke-opacity=”param(outline-opacity)”
Det går att lägga till ett standardvärde efter parametrarna som används om det inte är angivet ett parametervärde, exempelvis när man först lägger till symbolen i QGIS. Exempelvis: fill=”param(fill) #ff0000″.
Ändra de parametrar du vill och det går att använda samma parametrar på flera ställen, men då kommer alla att få samma värden.
Dynamiska parametrar kan vara i stort sett vad som helst. I mitt fall så är det etiketterna som jag vill ändra, men det kan vara andra värden som höjd eller bredd, riktningar eller i stort precis vad som helst.
Genom att leta reda på de texter med de ID som jag satte i Inkscape (eller de aktuella texter som skrevs in) så kan jag lägga till dynamiska parametrar med de namn som jag tidigare använde i QGIS.
I det här exemplet så byter jag ut ”Bertil” mot ”param(bertil)”, och motsvarande för Adam och Cesar.
När jag sedan sparar SVG filen och lägger till den i QGIS så kommer texterna att ersättas av det uttryck eller utpekade attributfält som är angivet i de dynamiska SVG parametrarna. Dessutom så kan färger justeras med standardverktygen i inställningarna.
Du måste absolut inte börja med QGIS och fylla i de dynamiska parametrarna, det går precis lika bra att börja med SVG filen. Det viktiga är att man har koll på parameternamnen och vad de representerar.
Om man vill ha fler färger, så kan man också använda dynamiska SVG parametrar. Det blir lite mer arbete när man skapar stilen, men inte mycket mer. Och som nämnts tidigare så begränsas inte de dynamiska parametrarna till detta. I stor vad som helst i en SVG fil kan ersättas med namngivna dynamiska parametrar. QGIS läser igenom SVG koden och om det står ”param(xxx)” någonstans, och det finns en dynamisk parameter definierad med samma namn, så ersätts denna kod med det som är definierat i parametern.
För att få lite koll på saker och ting, speciellt med tanke på att SVG koden måste justeras manuellt, så fungerar enklare grafik bäst. Det kan även finnas en del strul som behöver hanteras, exempelvis när texter innehåller fler eller färre tecken än i ursprungsfilen. Justering av texter, ankringspunkter och liknande kan behöva justeras. Samma sak om texten sträcker sig utanför den rityta som är definierad i filen. Börja med något enkelt för att testa, innan du ger dig på en riktigt komplex SVG.
Du behöver också vara medveten om att QGIS inte säkert stödjer alla SVG finesser som finns i en del program. Ju enklare grafik, desto mer sannolikt att det kommer att fungera.
Ytterligare ett tips är att spara stilarna som just stilar, med SVG filen inbäddad. Då slipper man fundera på vilka parametrar det var som fanns i vilken fil. Spara även stilen med parametrar som har ett uttryck definierat och inte något som pekar på ett attribut som är databeroende. Då kan man anpassa stilen till andra dataset som har attributnamn som heter något annorlunda.