I detta inlägg tänkte jag visa hur man kan skapa ”egna” höjdkurvor baserat på valfria höjddata i rasterformat. Här använder jag Lantmäteriets öppna höjddata med 50 meters pixlar, vilket passar väldigt bra för kartor som inte har väldigt stor skala. Jag utformar min stil för kartor runt 1:25 000.
Jag använder ”Extrahera Höjdkurvor” som finns i rastermenyn. I mitt fall så väljer jag intervall på 5 meter, men det är lite upp till vilken skala du använder och hur ”platt” ditt område du är intresserad av är.
Om linjerna är ”kantiga” så kan man lägga till en lätt utjämning med en geometrigenerator…
I bilden ovan har jag använt smooth($geometry) utan några extra parametrar för att jämna ut hörn och kanter lite granna. Till vänster är utan smooth och till höger med. Tills vidare så väljer jag att inte använda geometrigeneratorn då den tar lite extra tid att rendera, men i stället för att ta bort stillagret så väljer jag att inte ha det aktivt.
I stället har jag en ”Enkel linje” utan geometrigenerator, men som har exakt samma inställningar i övrigt för linjen. I det här fallet så behöver jag inte göra några inställningar alls för stillagren. Allt jag behöver göra kan jag göra i de överordnade inställningarna.
Jag sätter enheten till ”Kartenheter” och ett lämpligt startläge och sätter en lämplig färg. Bredden kommer jag att styra med en datadefinierad åsidosättning…
if("ELEV" % 100 = 0, 12, if("ELEV" % 25 = 0, 8, 4 ) )
Uttrycket ovan använder det attribut som genererades när jag skapade höjdkurvorna. Genom att använda operatorn ”%” i stället för ”/” så får jag ”resten” av divisionen. Med andra ord så ger 30 / 25 = 1.2, medan 30 % 25 = 5. Uttrycket ovan testar resten vid division med 100 och med 25. Om resten är 0 vid division med 100 så är linjen jämnt 100-tal meter och ges värdet ”12”. Om det är jämnt delbart med 25 så sätts värdet till ”8”, och i alla andra fall blir värdet ”4”. Du kan själv laborera med tjocklekarna och vilka intervall du vill använda.
Det är inte säkert att beräkningen ovan slår igenom när man växlar mellan den enkla linjen och geometrigeneratorn, men då kan man enkelt ”kopiera” uttrycket och klistra in det på det stillagret (bilden ovan).
För att skapa etiketter så börjar jag med att välja ett typsnitt och en rimlig storlek på teckensnitten. I det här fallet väljer jag teckenstorlek i kartenheter och jag har min ”målskala” inställd i QGIS. Färgen kopierar jag från färgen för höjdkurvorna genom att högerklicka på färgfältet och kopiera och klistra in.
if($length>800 and "ELEV"%25=0,
"ELEV" || ' m','')
Uttrycket för att skapa etiketten (ovan) använder jag i stället för bara ”ELEV” fältet. Här är det en ny if sats som dels kollar hur lång höjdkurvan är och dels om det är en kurva som är jämnt 25 meter över havet. Just längden använder jag för att inte sätta ut etiketter på de kortaste höjdkurvorna. Dessutom så vill jag ha med ett ” m” efter siffrorna. Även här så får du experimentera lite med värdet så att du får med etiketter för tillräckligt stora höjdkurvor.
if("ELEV" %100=0, 100, if("ELEV" % 25 = 0, 80, 50 ) )
Jag vill även ha en storleksskillnad på etiketterna. Därför använder jag uttrycket ovan för att göra 100-meters etiketterna lite större än 25-meters. Siffran ”50” ovan har ingen praktisk betydelse då inga andra etiketter än de som är jämnt delbara med 25 visas.
Under placeringsfliken väljer jag att placera etiketter böjda på linjen. Dessutom så väljer jag att upprepa etiketterna med 5’000 meter för att de lite längre höjdkurvorna skall få fler etiketter än annars.
Sista steget blir det som är nytt med QGIS 3.12, nämligen maskning av etiketter. Jag använder en mask på 50 meter och i övrigt standardinställningarna.
För att sedan koppla denna mask till ett stillager så gör jag det i lageregenskapernas inställningar ”masker”. Med vit bakgrund så blir det ingen skillnad mot att använda helt vit buffert, men när man använder fler lager bakom så kommer det till sin rätt.
Sådär. I mitt tycke en riktigt snygg lagerstil för höjdkurvor.
Om du har ett lager med höjdkurvor som du skapat med den metod jag använt här så kan du hämta min stilfil här: Höjdkurvor_25k_skala.qml
Notera att maskning inte är en del av stilen (för närvarande), du behöver därför ”aktivera” den för lagret innan du kommer att se någon effekt av den.
Många fina tips där Klas, men jag undrar – om man vill göra det så kartografiskt korrekt som möjligt vill man ju helst att höjdkurvstexten är roterad så att textens överkant också är mot den högsta höjden. Det är väl svårt, om inte linjerna är digitaliserade (eller genererade) åt samma håll hela tiden? Har du något smart knep där?
Jodå, om man går via geometrigeneratorn så har man ”Force right hand rule” ( motsv). Då bör man kunna ställa in en orientering med texten uppåt.
När jag testar så behöver jag använda ”reverse( force_rhr($geometry))”.
När jag tvingar ”right hand rule” så hamnar alla etiketter upp och ned som du ser det, men funktionen ”reverse()” löser det problemet. Notera att det är geometrigeneratorn för etikettplacering som skall användas, och inte stilens geometrigenerator.
Sedan under ”rendering” för etiketterna så väljer du att ”Alltid” visa upp och ner vända etiketter.
Finemang!
Vid närmare kontroll så kan du hoppa över ”force_rhr()”. Den gör i det här fallet ingenting, och det räcker med ”reverse($geometry)”.