Python, SVG och Norrpilar

Har du sett kartorna med en samling pilar och text som anger hur olika Norr förhåller sig till varandra. Framför allt är det kartor med koordinater och rutnät i ett projicerat koordinatsystem, som SWEREF99TM. Kartornas vertikala linjer beskriver inte riktningen mot vare sig magnetisk eller geografisk norr, och om det är viktigt att man kan kompensera för detta så behöver man ett sätt att ange avvikelserna för dessa.

Ett sätt är då ren text, men det blir mycket tydligare om man även använder någon form av grafisk representation.

Skärmbild_2017-07-24_19-20-53

Dessa pilar blir snabbt komplicerade och det kan ta tid att framställa dem med korrekta vinklar. Tiden gör nog att många väljer att strunta i det, men som användare av kartan så skulle jag uppskatta att den finns med.

Det går heller inte att återanvända dessa pilar om det inte handlar om exakt samma område och ungefär samma tidpunkt. Geografiska Norr (Sann Norr) avviker olika mycket från Grid Norr beroende på var man befinner sig, och Magnetisk Norr rör på sig över tiden.

Det som är bra, är att det går ganska enkelt att ta reda på dessa vinklar. Det är svårare att skapa pilarna, eller har varit…

Vinkeln mot geografisk norr beskrivs på Lantmäteriets hemsida, kallas även ”meridiankonvergens” (länk). SGU mäter kontinuerligt den ”magnetiska missvisningen”, som beskriver hur mycket man måste kompensera kompassens angivelse för att få fram en korrekt riktning mot geografisk norr (länk).

Så, om du har en kompass så måste du kompensera för att få fram geografisk norr eller ”sann” norr. Vilken du i sin tur måste kompensera för att kunna göra riktningsjämförelser på en karta med ett projicerat koordinatsystem.

Om jag tar Göteborg, Stockholm och Luleå som exempel så får jag följande tabell (2017) med ungefärliga värden:

Göteborg Stockholm Luleå
Grid Norr 0 0 0
Sann Norr 2,57 -2,62 -7,42
Magn. Dekl. 3,4 5,9 9,2

Tabellen gäller med SWEREF99TM som koordinatnät och sann norr beräknas med QGIS för ett ungefärligt centrum av tätorterna (beräkna på Lantmäteriets hemsida). Den magnetiska deklinationen uppskattas från SGU’s karta på hemsidan (beräkna på Internet).

Skapa pilar och symboler

Då det handlar om pilar och linjer så är det bra om man kan göra dessa som vektorgrafik. Då blir SVG ett solklart val. I QGIS så finns det stöd för två varianter av SVG. SVG som ”bilder” hanteras av QtSvg där det bara finns stöd för SVG 1.2 ”Tiny”, vilket är en begränsad uppsättning med instruktioner. HTML fönster med flera andra komponenter hanteras av QtWebKit (m.fl.), där det finns stöd för SVG med en större uppsättning instruktioner. Då kan man däremot inte skala bilden på samma sätt som med just ”bild”.

När man skapar SVG grafik i exempelvis InkScape så kan man vad jag vet inte ställa in att spara i ”Tiny”, vilket gör att SVG skapad i InkScape inte säkert presenteras i QGIS på samma sätt, om man väljer att presentera filen med ”bild” verktyget. Om man provar med en ”HTML” ruta i stället så kan resultatet bli bättre.

För att säkerställa att det alltid skall fungera så vill jag skapa pilarna enligt ”Tiny” standarden. Därför så måste jag läsa på mer om formatet…

Det visar sig snabbt att jag kan använda ett skriptspråk för att skapa SVG filen med det innehåll jag vill ha, även om det innebär en hel del beräkningar. För detta har jag valt Python, vilket gör att jag på sikt skulle kunna bygga ett plug-in eller en ”tool” som skapar grafiken åt mig med ifyllnadsformulär i stället för tilläggskommandon.

https://raw.githubusercontent.com/klakar/geosupportsystem/master/createMagneticReferenceSVG/northref.py

Jag kommer inte att gå igenom koden i detalj här. Om du vill så kan du själv läsa den i länken ovan. Om du bara vill prova skriptet så kan du högerklicka på länken och välja ”spara som…”. Döp filen till ”northref.py” och spara den på lämplig plats.

Skriptet kan köras utan parametrar och då skapas filen ”northref.svg” med tre pilar med 0° vinklar. Skriptet har fem valfria parametrar som kan anpassa bildfilen:

-o <filnamn.svg>
-g <vinkl mot grid norr>
-t <vinkel mot geografisk norr>
-m <vinkel mot magnetisk norr>
-p <filnamn.png>

Skriptet försöker även att skapa en PNG fil med samma innehåll. Just detta kräver att du har ImageMagick kommandot ”convert” installerat, men SVG filen skapas även om du inte har det. Filerna skapas på angiven sökväg, eller relativt platsen där skriptet körs.

Om jag kör skriptet tre gånger för mina tre städer (fungerar även med python3):

python northref.py -o goteborg.svg -t 2.57 -m 3.4
python northref.py -o stockholm.svg -t -2.62 -m 5.9
python northref.py -o lulea.svg -t -7.42 -m 9.2

Så får jag följande resultat (ordning fr.v. Göteborg, Stockholm, Luleå).

Skärmbild_2017-07-25_09-36-59.png

Så väldigt smidigt!

Jag har valt att även kunna ange en vinkel mot grid norr, då det skulle kunna tänka sig att man gör en karta orienterad mot ”sann” norr i ett oprojicerat koordinatsystem, men ändå vill ange hur ett projicerat koordinatsystem avviker från kartans norr. Jag har däremot inte tagit med funktioner för att ta bort exempelvis pilen för magnetisk norr, vilket man skulle kunna tänka sig för vissa tillämpningar. Detta får dock vänta då jag inte tycker att det direkt behövs.

Skulle du vilja ha en ”svensk” version så är det enkelt att redigera Pythonskriptet och döpa om ”True North” till ”Meridiankonvergens” och ”Mag Decl” till ”Magnetisk Missvisning”, eller något annat passande.

(Alla bilderna i denna artikel är skärmdumpar då det inte går att visa SVG grafik på bloggen).

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: