Detta är lite av ”the holy grale” för mig, så det är inte utan att jag är lite stolt över att ha lyckats med detta. Det är inte enkelt, det blir många steg och komplicerade uttryck, men det fungerar. Det är inte helt perfekt, men det är bra nära när man ser till resultatet.
Problemet är att när man skapar kartor med UTM som koordinatsystem så hamnar man förr eller senare i en skarv mellan UTM zonerna. I Göteborg finns en skarv. I Stockholm en annan.
Det normala för mig är att projicera i UTM zon 33, vilket är väl överensstämmande med SWEREF99TM, som Lantmäteriet levererar sina data i. Att skapa ett koordinatnät i UTM 33, eller SWEREF99TM är inga som helst problem, så länge man undviker skarven. Men för att avbilda exempelvis Stockholm eller Göteborg, så blir det som sagt komplext.
Min tidigare metod var att skapa en karta i UTM33 och en med rutnät i den ”sneda” projektionen. Exportera båda till TIF och sedan klippa ihop dem i ett ritprogram. Men med denna metod så slipper jag det.
Jag skapar helt enkelt en mall för gränsen 33 till 32 och en för 33 till 34. Man kan även skapa mallar för 32 till 33 och 34 till 33 om man önskar projicera kartan i zon 32 eller 34. Vilket gör att UTM33 blir det sneda koordinatnätet.
Hur fungerar det
För varje zon så finns det ett separat rutnät i layouten. Detta består endast av etiketter och inga linjer. I uttrycket så filtrerar jag sedan etiketterna så att endast etiketter för korrekt UTM zon visas för respektive rutnät. Detta kombineras med inställningarna för rutnätets etiketter för att uppnå önskat resultat.
Linjerna är sedan ett vektorlager i kartan som jag skapar en gång för hela området jag är intresserad av. En konsekvens av detta är att etiketter i kartan ritas ut över linjerna.
Detta går att komma runt genom att man skapa ett tema för bakgrundskartan och ett för rutnätet och tillämpar dessa på två kartobjekt i layouten, som man placerar ovanpå varandra. Rutnätet ovanpå skall inte ha någon bakgrund och det går att synkronisera utbredningen i de båda kartorna med uttryck om man vill ha full flexibilitet. När man i så fall panorerar kartan med rutnätet så kommer bakgrundskartan att uppdateras till samma utsträckning.
Problemet löst…
Rutnätet
Att skapa rutnätet är en process i flera steg. Först skapar man ett rutnät med polygoner som täcker det område man är intresserad av i WGS84.
Detta lager skall användas i andra projektioner så det bästa är att skapa det med projektet projicerat i WGS84 (och inte som i bilden ovan i UTM). Därefter förtätar man brytpunkterna med intervall på runt 10’000 meter. Då kommer linjerna att få en tillräcklig ”krökning” när man projicerar dem i UTM för att det skall bli korrekt i kartorna. Detta blir tydligare för de projicerade linjerna.
Nu följer en process som upprepas för varje UTM zon.
- Projicera projektet i önskad UTM zon.
- Filtrera UTM polygonerna så att endast polygonen för samma UTM zon visas. När du byter filter så kan du klicka på filtersymbolen vid lagret i lagerlistan.
- Skapa ett rutnät (ctrl + k, skapa rutnät) med linjer på 1000 meters avstånd både horisontellt och vertikalt. Utsträckningen väljer man manuellt i kartan så att området täcker det som är intressant. OBS! Du måste redigera utsträckningen manuellt så att det blir jämna 1000-tal. Annars kommer dina linjer att hamna på fel ställe.
- Klipp linjelagret (ctrl + k, klipp) med polygonen för UTM zonen.
- Förtäta det klippta linjelagret (ctrl + k, förtäta med intervall) med 10’000 meters intervall.
- Döp om lagret till UTM32 (för zon 32).
När alla zoner är klara så görs även UTM polygonerna om till linje (ctrl + k, polygoner till linjer). Om du vill eller behöver så kan du klippa dessa linjer så att de har samma utsträckning som alla UTM zonerna tillsammans.
Därefter slår du samman alla UTM zoners rutnät och linjerna för UTM zonerna (ctrl + k, slå ihop vektorlager). Välj målreferenskoordinatsystem som WGS84 (spelar egentligen ingen roll) och spara lagret till ett GeoPackage (eller annat vektorformat).
Du kan nu stilsätta lagret så att rutnätslinjer får ett utseende och UTM gränser en annan. Det finns attribut i tabellen som gör det möjligt att filtrera på enskilda linjer om man vill det, eller exempelvis linjer på jämna 10-tal kilometer för kartor i mindre skala.
Koordinater i Layouten
Kartan lägger man till i Layouten med den projektion som man vill använda för den färdiga produkten.
Lägg till ett rutnät för den ”raka” projektionen med det intervall som används i kartan, men välj att endast använda etiketter och inga linjer. Välj även att inte visa koordinater på den ”sneda” vertikala axeln.
Nästa steg blir att filtrera bort etiketterna i ”fel” UTM zon. Detta görs i inställningarna för anpassade koordinater.
Ovanstående uppnås med följande anpassade uttryck för koordinaterna.
if(@grid_axis='x', --Testa om det är en koordinat som skall filtreras if( -- Det långa uttrycket nedan kollar om koordinaten är i rätt UTM zon x(transform( geom_from_wkt( 'POINT(' || @grid_number || ' ' || y_max( @map_extent ) || ')'), @map_crs , 'EPSG:4326'))>18 , '' -- Returnera en tom textsträng om det är på "fel" sida , standard_utm(@grid_number)), -- Annars skriv ut koordinaten som vanligt standard_utm(@grid_number) -- Om det inte är x-axeln så behövs inget filter )
Jag har valt att bara filtrera koordinater på x-axeln. Koordinater på ”fel” y-axel döljs med inställningarna tidigare.
För att avgöra om en koordinat är på ”rätt” eller ”fel” sida så behöver jag skapa en punkt där linjen skär axeln. Detta kan inte göras separat för den övre och undre axeln, så jag väljer den övre då koordinaterna går ihop uppåt på norra halvklotet. Detta innebär att det ibland hamnar linjer i nederkant som inte får någon koordinatsiffra, men det får jag leva med tills vidare.
Den punkt som skapas med geom_from_wkt() transformeras om från kartans projektion till WGS84 och sedan är det bara att jämföra x-koordinaten för denna punkt med det värde UTM-gränsen har. I det här fallet är det Stockholm och 18 grader öst.
Om koordinaten är på ”fel” sida returneras en tom textsträng, annars den vanliga koordinattexten. (Här använder jag en egen funktion för att formatera om koordinater på ett snyggt sätt. Det kan du läsa mer om i ett tidigare inlägg.)
Samma metod används sedan för att skapa ett lutande koordinatnät i den ”sneda” zonen. Uttrycket får modifieras något så att koordinater omvandlas från det koordinatsystemet till WGS84 och här skall punkten vara på andra sidan gränsen.
Jag väljer här att fortsatt använda kartans y_max() trots att detta blir koordinater i ”fel” koordinatsystem. Såhär nära gränsen så har detta ingen större praktisk betydelse.
En annan inställning som är bra att känna till här är att det sneda rutnätet kan ha linjer som skär ”fel” axel och därmed kan exempelvis y-koordinater skrivas ut på x-axeln, vilket ofta bara förvirrar användarna. Detta är enkelt att åtgärda genom att välja att endast skriva ut ”longituder” uppe och nere, och ”latituder” till höger (vänster är avstängt i det här exemplet).
Slutsatser
Det här fungerar faktiskt väldigt bra, men det är ganska mycket jobb med att skapa mallarna. Det går sedan att spara dessa kartor just som mallar och återanvända dem i andra projekt. Med än mer avancerade uttryck så klarar man sig säkert med en enda mall för alla UTM zongränser, men jag kan leva med ett par stycken.
Det jag ser fram emot i framtida QGIS versioner är en möjlighet att skilja på om det är den övre eller nedre x-axeln (dito för y-axeln) som @grid_number avser i uttrycken. Det kommer att underlätta inte bara för den här tillämpningen, utan även när det är dags att lägga på ett system med MGRS referenser.
Applåder och stående ovationer. Fint jobbat!
Jag är lite förbryllad över varför du inte använder SWEREF 99 TM istället för UTM32/33/34. Då slipper du väl skarvarna i Göteborg/Stockholm? Och vill du skapa en karta över bara Göteborg eller Stockholm kanske SWEREF 99 12 00 eller SWEREF 99 18 00 är bättre. Alternativt en annan projektion som är lämpad för hela området du vill göra en karta över om det är ett annat område än Sverige. Vad är det jag missar?
https://www.lantmateriet.se/sv/Kartor-och-geografisk-information/gps-geodesi-och-swepos/referenssystem/tvadimensionella-system/sweref-99-projektioner/
Om man bara använder kartor men sällan koordinater så håller jag med. Om man dessutom bara rör sig i Sverige så är det än mer motiverat att välja något annat. Det finns standarder för att förenkla hanteringen av positioner som är baserat på UTM, men någon sådan standard finns inte för Sweref99. Behöver man sedan kartor som sträcker sig utanför landet så blir snabbt Sweref99 ohanterligt. Om man dessutom har fastställt att det är UTM som gäller i en organisation så har man inget val.
Intressant diskussion som plötsligt fick bäring på mina egna projekt där Sweref99 TM (runt vår medelmeridian där Motala känns bättre än Stockholm och Göteborg) är primärprojektionen. Eftersom jag håller på med (svenska) historiska kartor som ska fungera i fält i handhållna enheter (främst i Android och i Garmin) så är planen att använda värdena för SWEREF99 TM rakt av i projektionen WGS84 för främst Android eftersom det enligt uppgift bara skiljer någon meter dem emellan och i mina sammanhang då kan anses försumbart. Så långt väl, men nu behöver jag goda råd:
Det vi i den här bloggen kallar landet Sverige är geodatamässigt bara en översättning av hur riksgränsen såg ut ifrån år 1809 när nationen Sverige i areal precis hade förlorat mycket stora områden i öster till ”ryssen” d v s det som drygt hundra år senare blev nationen Finland. Hur ska jag projektionsmässigt hantera Sverige när jag ska georeferera kartor ifrån 1600-talet och 1700-talet (Krigsarkivet, Riksarkivet m fl) efter en mödosam digitalisering och rektifiering? Jag kan inte tänka mig att SWEREF99 TM och WGS84 koordinatmässigt med sina metervärden i praktiken fortsätter att vara ekvivalenta utanför nuvarande Sveriges riksgräns (geodesi på hög nivå?). Så hur hanterar man projektioner, kartkoordinater och GNSS-visningar korrekt på en digital karta över Sverige på 1700-talet när Västerbotten och Österbotten låg i samma land?