Funktionsredigeraren i uttrycksbyggaren är kanske inte det första man ger sig på när man precis startat med QGIS, men man skall absolut inte undvika den för det. Det går att göra otroligt mycket där, så länge man kan lite Python, och så speciellt mycket Python behöver man inte kunna heller. Det går ganska bra att Googla efterhand som man håller på, men lite grunder är nog bra att börja med.
Jag tänker bygga en funktion, eller flera rättare sagt i en skriptfil, som skall hjälpa mig att skapa bättre koordinater på mina utskrivna kartor. Det mesta av det jag kommer att göra har jag redan åstadkommit på ett eller annat sätt tidigare, men nu tänkte jag försöka samla flera funktioner och om möjligt effektivisera koden något. Allt för att det skall krävas så lite jobb som möjligt när jag sedan skapar mina kartor.
Till att börja med så skapar jag en funktion där all kod kan samlas.
När man skapar en ny funktion (gröna plus-knappen) så ger man filen ett namn. Filen skapas i profilkatalogen för QGIS, men det behöver man egentligen inte bry sig om.
När filen är skapad så skapas även ett enkelt exempel på kod. Den har jag omedelbart ändrat för att bygga vidare på för min första funktion.
Min funktion standard_utm kommer att placeras i gruppen ”Mina Koordinater”. Den tar en variabel kallad koordinat och den returnerar värdet i variabeln resultat.
Jag vill att funktionen skall ta en godtycklig koordinat och skicka tillbaka kilometersiffrorna (00-99), om det inte är ett jämnt 10-tal. I så fall skall resultatet kompletteras med upphöjda siffror för 100-tals kilometer.
Så, om de fyra siffrorna längst till höger är nollor (0000), så är det ett jämnt 10’000 tal och då skall upphöjda siffror läggas till. I alla alternativ så skall kilometersiffrorna returneras.
Att skapa upphöjda siffror skapar jag en egen funktion för. Det kan nämligen bli användbart i andra funktioner.
def skapa_index(siffror): index_lista = ["⁰","¹","²","³","⁴","⁵","⁶","⁷","⁸","⁹"] resultat = "" for tecken in str(siffror): resultat += index_lista[int(tecken)] return resultat
Funktionen tar alla tecken och försöker göra om dem till ”upphöjda” siffror enligt unicode standard. En förutsättning för att det skall fungera är därför att det teckensnitt man använder har stöd för just unicode.
Funktionen för standard UTM anropar sedan funktionen för att skapa indexsiffror, men i övrigt returnerar den de tecken som skall visas som standard på en UTM karta.
@qgsfunction(args='auto', group='Mina Koordinater') def standard_utm(koordinat, feature, parent): """ Funktionen gör om valfritt tal (koordinat) till standardtecken för UTM koordinater. """ k_string = str(int(koordinat)) resultat = "" if k_string[-4:] == "0000": resultat += skapa_index(k_string[:-5]) return resultat + k_string[-5:-3]
Då funktionen hanterar alla tecken som text så görs först den inmatade koordinaten om till en textsträng. Om denna slutar med fyra nollor (k_string[-4:] == ”0000”) så skickas de inledande siffrorna till funktionen som tidigare skapades och resultatet placeras i resultatvariabeln.
Oavsett vilket, så returneras resultatvariabeln (som antingen är tom eller har indexsiffror) samt de två kilometersiffrorna.
I uttrycksbyggaren kan jag nu anropa min funktion för ”standard_utm” och skicka med koordinatsiffran som skall skrivas ut. Resultatet blir precis det jag är ute efter med en enda funktion.
Jag skapar även en funktion för ”komplett_utm” som tar hela koordinaten och skapar upphöjda siffror för allt utom kilometersiffrorna.
@qgsfunction(ars='auto', group='Mina Koordinater') def komplett_utm(koordinat, feature, parent): """ Funktionen skapar en komplett UTM koordinat med indexsiffror. """ k_string = str(int(koordinat)) resultat = skapa_index(k_string[:-5]) + k_string[-5:-3] + skapa_index(k_string[-3:]) return resultat
Eftersom jag redan skapat funktionen för att göra indexsiffror, så blir denna funktion betydligt enklare än den förra. Det finns ju inga villkor som skall vara uppfyllda, utan allt skall hanteras på samma sätt.
Funktionen kan sedan anropas på ett enkelt sätt, där exempelvis en kartrams utsträckning kan styra vilken koordinat som skall hanteras.
Det som inte syns i bilden ovan är att jag döpt kartramen till ”map”, vilket gör att det går att anropa den med item_variables.
Nu skall jag fortsätta skapa fler pythonfunktioner för sådant som jag vanligtvis använder i mina layouter. Det kommer dock att bli lite krångligare, då jag kommer att behöva läsa in externa pythonbibliotek för att exempelvis omvandla koordinater till MGRS. Så det får vi ta en annan gång…