När man skapar en stil för något, så är det ganska ofta en enstaka symbol som representerar det objekt som man vill presentera. Ett annat sätt är att skapa kategorier för ett attribut så att olika symboler kan representera en variant av det objekt som skall visas.
Men det händer då och då att man vill skapa en symbol baserad på flera olika attribut, och ändå göra detta begripligt. Det tänkte jag utforska lite i detta inlägg.
Jag använder Jordbruksverkets ”Produktionsplatser för djurhållning” som går att hämta från Geodata.se både som esri-shape och som online-tjänst via WFS, vilket jag använder i mina test för att inte behöva hantera data lokalt och potentiellt kunna skapa en uppdaterad karta när som helst.
Jag börjar med en symbol som jag har använt tidigare som är lite enklare ”geometrisk” som kanske inte är självförklarande, men enkel att förstå med en simpel förklaring.
Symbolen byggs upp av en cirkel med fyra sektorer som representerar nör, gris, får och get, samt en inre cirkel som representerar fjäderfä. Varje del av dessa symboler knyts mot värdet i ett specifikt attribut med ”Enable layer/Aktivera lager”. Detta görs med en enkel ”if” sats i uttrycksbyggaren. Om det står ”JA” i kolumnen ”gris” för ett objekt, så kommer symboldelen att visas. Annars är den dold.
Resultatet kompletteras med en skräddarsydd teckenförklaring vilket gör att användaren snabbt får en uppfattning om vilken typ av djurhållning som finns på en viss plats.
Ok, detta fungerar bra, men det vore trevligt om teckenförklaringen inte skulle behövas.
Varför inte försöka skapa en symbol som den i bilden ovan, men endast med de djur som finns på platsen? Det innebär dock lite problem…
Genom att bara tända och släcka symboldelar, så kommer de flesta att ha djur som svävar långt över den plats där de borde vara förankrade. Detta betyder att jag behöver justera vertikalt offset för de flesta delarna, beroende på om ”underliggande” djur finns på platsen eller ej.
Man får vara riktigt kreativ med ”if” satser i uttrycksbyggaren för att åsidosätta ”offset” för varje enskild symboldel på ett korrekt avstånd beroende på vilka djur som skall vara aktiva.
if("not_"='JA',
if("gris"='JA',
if("far"='JA',
if("get"='JA','-2,-30','-2,-25'),
if("get"='JA','-2,-25','-2,-18')),
if("far"='JA',
if("get"='JA','-2,-22','-2,-18'),
if("get"='JA','-2,-17','-2,-11'))),
if("gris"='JA',
if("far"='JA',
if("get"='JA','-2,-21','-2,-14'),
if("get"='JA','-2,-12','-2,-7')) ,
if("far"='JA',
if("get"='JA','-2,-12.5','-2,-7.5'),
if("get"='JA','-2,-6','-2,0'))))
Ovanstående är det mest komplicerade fallet, nämligen fjäderfä. Placeringen av denna symboldel är beroende av om nöt, gris, får och get är närvarande eller ej. Det blir därför många if-satser i if-satser och man måste hålla tungan rätt i mun för att det skall bli rätt.
Man skulle sannolikt kunna skriva en anpassad pythonfunktion för detta på ett enklare sätt, eller så finns det ytterligare något sätt i uttrycksbyggaren som kan förenkla.
Det blir en ”stor” och komplex symbol som lätt flyter ihop med närliggande symboler. Detta kan undvikas något genom att använda ”kantglöd” som realtidseffekt på alla symboldelarna. Om man dessutom kontrollerar utritningsordningen så att objekt som är längre söderut (närmare oss) ritas ut efter (ovanpå) de som är längre norrut (längre bort).
Mycket trixande med siffror och ändringar hit och dit, men resultatet blev ganska bra. Sedan får naturligtvis situationen avgöra när en enkel geometrisk symbol är lämpligare.
Hmm. Påminner om en saga av H.C. Andersen… tror jag..