Jag har tidigare skrivit om ett pythonskript som jag byggt för att skapa bilder som kan användas för att skapa norr referenser. Nu har jag byggt om delar av detta till en QGIS funktion…
När man kikar på originalskriptet så kan det mer än jag behöver, så det är bara svg delen som jag är intresserad av.
Att generera en bild i PNG format är inte svårare än:
python northref.py -g 0 -m -4 -t 8 -o norrpilar.png
Resultatet kan sedan användas var som helst där PNG kan användas.
Att skapa en anpassad funktion i QGIS är i det här fallet inte svårare än att kopiera just funktionen som skapar SVG koden.
Funktionen som jag döpt till ”north_ref_svg” som tar tre argument. Grid norr, normalt 0. Sann norr, som kan beräknas mot en namngiven kartram, och magnetisk deklination, som kräver någon form av uppslagning.
Uttrycket används som källa till en HTML ruta och den genererade från början en bild som var 2,5 cm hög. Ville man ha en större eller mindre bild så fick man redigera koden, men nu har jag lagt till en variabel som sätter storleken på SVG grafiken i centimeter. Det är därför fyra variabler i stället för bara tre (grid, sann, magnetisk, storlek).
Det går ju att beräkna sann norr automatiskt från centrum i kartans utbredning med ännu ett uttryck. Och då blir det såhär:
[% north_ref_svg( 0, with_variable('azimuth', degrees(azimuth( transform(centroid(map_get(item_variables('Map'),'map_extent')),@project_crs, 'EPSG:4326'), transform(project(centroid(map_get(item_variables('Map'),'map_extent')),1000,0), @project_crs, 'EPSG:4326'))) ,if(@azimuth>180, 360-@azimuth, 0-@azimuth)) ,-5,1.3)%]
Förutsättningen är att kartan man vill ha riktningen ifrån har id ”Map”, annars går ju det att ändra det i uttrycket också (två ställen). Den grafik som genereras från bilden ovan blir 1,3 centimeter stor och använder -5 grader som magnetisk deklination.
Funktionen bakar jag in i mitt plugin för layouter, men du kan hämta den direkt via denna länk: generatesvg.py. På GitHub finns även originalskriptet om man vill generera SVG och PNG filer.
Äh! Jag gör en funktion som hämtar magnetisk deklination från en tjänst på nätet baserat på angivna lat/long värden också.
get_magnetic_declination(latitud, longitud)
Den finns också med i ”Layout Loader” plugin, men kan laddas ner separat här: get_magnetic_declination.py.
Så länge man har mina funktioner och kontakt med Internet så kan man skapa en mall som automatiskt skapar en uppdaterad bild för norr-referenser baserade på den aktuella kartan.
OBSERVERA
HTML rutor i QGIS layout uppdateras inte kontinuerligt när de genereras av ett uttryck. Du kan behöva markera rutan och klicka på ”Uppdatera HTML” för att allt skall vara korrekt efter exempelvis en panorering.