QGIS, Python och meridiankonvergens

I nya QGIS så kan man rotera grafik i utskriftslayouter efter ”sann” norr, och inte enbart kart-norr. Det jag saknat är ett sätt att beräkna och skriva ut denna meridiankonvergens i kartlayouten.

Nu har jag hittat en lösning med Python, som dessutom ger mig ytterligare möjligheter.

I din QGIS katalog (.qgis) finns det en underkatalog som innehåller pythonskript. I denna finns bland annat dina plug-in, men även dina uttryck (.qgis2/python/expressions/).

Vill du använda mina uttryck så kan du hämta min skriptfil på GitHub (länk) och spara den på denna sökväg.

Jag skall inte gå igenom skriptet i detalj här utan försöka sammanfatta det lite kort.

def map_extent():
 composers = iface.activeComposers()
 composer = composers[0]
 composition = composer.composition()
 map = composition.getComposerMapById(0)
 
 return map.currentMapExtent()

Funktionen ovan tar den första kartan i den första layouten och returnerar utsträckningen.

I ett skript jag hittade på Internet så användes layout-namn och kart-id som indata i funktionerna, vilket ger större flexibilitet, men för mig så är det i 99 fall av 100 just den första kartan i den första layouten som är intressant. Min variant är därför inte lika flexibel, men anropet är i de flesta fall mycket enklare.

I skriptet så anropar jag sedan funktionen och tilldelar en variabel dess resultat.

extent = map_extent()

sedan kan jag enkelt få fram max och min koordinater för kartans utsträckning med exempelvis:

extent.xMaximum()

Andra egenskaper är xMinimum, yMaximum, yMinimum. Ur detta kan jag beräkna även koordinaterna för kartcentrum och med lite kreativ beräkning skapa punkter som motsvarar sann norr.

En koordinattransformation och riktningsberäkning ger sedan meridiankonvergensen för kartans centrum.

return center_start.azimuth(true_north_point)

Uttrycken är tillgängliga i uttrycksdialogen under rubriken Python. Jag har inkluderat en kort beskrivning på engelska för varje funktion som jag skapat.

Skärmbild_2016-10-25_20-00-15.png

I exemplet ovan avrundar jag meridiankonvergensen till två decimaler, och lägger till ett gradtecken med html-kod.

Koden är inte 100% säker då den i princip kräver en karta med ett godkänt koordinatsystem, som SWEREF99TM. Det har gett mig lite felmeddelande emellanåt och koden kan säkert förenklas och göras mer robust, men jag har i alla fall lärt mig en del nytt om Python i QGIS.

I helgen så ”live” sände jag lite om det jag beskriver här på YouTube. Vill du se det nu i efterhand så går det också bra:

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: