Koordinatetiketter för SWEREF99TM

QGIS är bra på väldigt mycket, men att skapa professionella kartor med standardiserade koordinatnät för projicerade data, har det varit sämre med.

Ett tag var det omöjligt, men sedan ett antal QGIS versioner så är det möjligt. Inte direkt enkelt, men fullt möjligt. I detta inlägg visar jag hur.

När man börjar att lägga till en karta, ställer in skala (1:50’000) och lägger till ett koordinatnät med 1000 meters intervall, så blir standardetiketterna inte speciellt trevliga.

Skärmbild_2017-02-05_14-49-50.png

För att rätta till siffrorna så måste man välja ”Anpassad” och sedan trycka på knappen för uttrycksbyggaren.

Skärmbild_2017-02-05_14-53-02.png

Där har man tillgång till variabeln ”@grid_number”, vilken består av de siffror som skrivs ut i bilden tidigare. Det enklaste är att skapa ett uttryck för att plocka fram de mest intressanta siffrorna.

left(right(@grid_number, 5), 2)

Skärmbild_2017-02-05_14-58-07.png

På detta sätt skrivs endast kilometersiffrorna ut, vilket i huvudsak är det man önskar för den här typen av kartor.

Däremot så saknas utskrift av fullständiga koordinater, vilket behövs på ett eller annat sätt. Det går att lösa genom att lägga till en vanlig textetikett någonstans, men det bättre alternativet är att byta ut några av koordinaterna mot fullständiga koordinater med jämna mellanrum.

Jag vill inte skriva ut fullständiga koordinater med samma stil för alla siffror, men jag vill ändå att det skall vara så enkelt som möjligt att skapa dessa. Om koordinaterna hade kunnat renderas som HTML (kommer kanske på sikt) så hade man kunnat använda taggen för att skriva ut vissa siffror med ”superscript” eller upphöjda.

Även om nu inte HTML stöds (ännu) så finns det stöd för Unicode. I Unicode så finns det tecken för superscript, så genom att byta ut siffrorna mot motsvarigheten i superscript med Unicode, så kan jag skapa den typ av fullständiga koordinater som jag är ute efter.

Att göra om vanlig text till Unicode går inte att göra i uttryck, det måste göras i kod. För sådana ändamål finns ”Funktionsredigeraren”.

Skärmbild_2017-02-05_15-07-48.png

Här har jag använt en funktion jag hittade på Internet i ett forum, som gör det jag är ute efter. I slutändan så använder jag bara en rad av koden, men som exempel nu så duger det.

Speciellt för Windowsanvändare så är det på sin plats att påtala att man måste välja ett typsnitt med stöd för unicode för att det skall fungera!

Det skriptet gör är att ta ett siffertecken och göra om teckenkoden till ett tal som representerar värdet av siffran (lite onödigt). Sedan används det Unicode värde som representerar det superscript tecken som motsvarar detta värde. Med andra ord: En vanlig ”etta” in, blir en upphöjd ”etta” i retur.

supscr_num(left(@grid_number, length(@grid_number)-5)) ||
left( right( @grid_number, 5), 2) ||
supscr_num(right( @grid_number, 3))

Skärmbild_2017-02-05_15-13-58.png

Uttrycket för etiketterna blir lite långt (ovan), speciellt med tanke på att jag måste lägga till funktioner för att inte skriva ut fullständiga koordinater överallt. Ju mer som skall till, desto krångligare blir det.

Jag väljer därför att skapa en skräddarsydd funktion för att skapa ”långa koordinater”. Jag passar även på att skapa en funktion för ”korta koordinater”.

skarmbild_2017-02-05_15-19-30


En anpassad funktion, som den i bilden ovan, skapas genom att klicka på ”Ny fil” och sedan är det bara att skriva kod!

Skärmbild_2017-02-05_16-14-18.png

Koden skall följa ett bestämt mönster, men det mesta får man som standard när den nya funktionen skapas (bilden ovan). Man bestämmer själv vad filen skall heta, sedan byter man namn på ”func” till det funktionsnamn man vill ha. Här skapar jag funktionerna ”shortNumber” och ”longNumber”. Det värde som man matar in i funktionen lagras i variabeln ”value1”, vilken i det inledande exemplet även är det värde som returneras. Jag har bytt ”value1” mot ”gridNumber” i mina funktioner.

Det är sedan mellan definitionen av funktionen och ”return” som man skriver sin pythonkod.

För att visa skapade funktioner i uttrycksbyggaren så klickar man på ”Läs in”. Funktionerna visas under den grupprubrik som man angett i group=”.


Mina funktioner gör det som tidigare gjordes i kombination av uttryck och funktioner, men jag har förenklat och anpassat ganska mycket för att passa mina behov.

Uttrycket som ger samma resultat som i bilden med fullständiga koordinater tidigare (tre bilder upp) är nu betydligt enklare.

 longNumber( @grid_number )

Vill jag sedan välja att skriva ut fullständiga koordinater enbart vid jämna tiotal kilometer så blir uttrycket:

if( substr( @grid_number, length(@grid_number)-3,1),
 shortNumber( @grid_number ),
 longNumber( @grid_number )
 )

If satsen består av tre delar. Ett villkor, som i det här fallet tittar på den fjärde siffran från höger och om den är ”0” så är det samma sak som att villkoret är ”falskt”. Den andra delen av if satsen används om villkoret är ”sant” (det vill säga tecken som inte är noll), och den tredje delen används om det är ”falskt”. Resultatet blir som i bilden nedan.

Skärmbild_2017-02-05_15-37-00.png

Nu återstår bara att ”rotera” de fullständiga koordinater som sticker ut lite mycket till vänster och höger. Det gör jag genom att först ta bort alla fullständiga koordinater på ”y” axeln, från det tidigare uttrycket.

if( substr( @grid_number, length(@grid_number)-3,1),
 shortNumber( @grid_number ),
 if( @grid_axis = 'x', longNumber( @grid_number ), '')
 )

Efter som det inte går att rotera enskilda etiketter så måste jag göra så och sedan lägga till ännu ett koordinatnät med samma inställningar som det första, fast jag behöver inte rita ut linjerna igen.

Uttrycket för det nya koordinatnätet modifieras så att det endast är fullständiga koordinater på ”y” axeln som skrivs ut, på de platser som saknar etikett.

if( substr( @grid_number, length(@grid_number)-3,1),
 '',
 if( @grid_axis = 'y', longNumber( @grid_number ), '')
 )

Det som återstår är att rotera det andra koordinatnätets etiketter till ”Vertikal Uppåt”.

Skärmbild_2017-02-05_15-47-01.png

I inlägget har du nu allt du behöver för att återskapa detta sätt att skriva ut koordinater på dina kartor. När du är nöjd så kan du passa på att spara layouten, med enbart en karta i , som ”mall”. Då kan du nästa gång du vill ha en karta i en layout med ett koordinatnät av samma typ, välja att ”lägga till Element från mall”.

Om du inte vill skriva in koden själv, så kan du ladda hem min kod från GitHub (länk) och spara filen i katalogen .qgis2/python/expressions.

Mer exempel och länkar till var jag hittat information om det jag visar här kan du hitta i ett YouTube klipp jag skapat på engelska, där det jag beskrivet här visas praktiskt.

Jag hade kunnat göra uttrycket ännu enklare och bara skapat en funktion som skapade rätt typ av koordinat direkt. Exempelvis nice_grid(@grid_number), som automatiskt resulterar i korta och långa etiketter med ett bestämt intervall. Då hade uttrycket blivit ännu enklare.

Funktionen hade fått bli lite mer omfattande och det hade krävts lite fler variabler, men den främsta anledningen till att jag inte ville göra detta är att jag vill bygga vidare skriptet så att det inte skriver ut långa koordinater vid jämna tiotal kilometer, utan i hörnen på kartan oavsett vad det är för kilometersiffror.

Jag har redan lyckats i princip, men jag vill finslipa koden lite innan jag skriver mer om den. Vi får se när det blir en uppföljare till denna artikel.

Annonser

Taggar:, , , ,

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Google+ photo

Du kommenterar med ditt Google+-konto. Logga ut / Ändra )

Ansluter till %s

%d bloggare gillar detta: