Vad handlar nu det här om? Det är en fortsättning på tidigare inlägg där jag stilsätter vattendrag med den nya stilen (QGIS 3.20) Interpolated line.
En förutsättning för att linjer skall ha variabel bredd i ”rätt” riktning är att linjerna är ritade i ”rätt” riktning. De måste framför allt vara i samma riktning kopplat till flödet. Annars kommer stilen att antyda att vattnet rinner ”uppströms”.
Men visst är väl Lantmäteriets data rätt, eller?
Hmm… Inte riktigt. Det är inte fråga om ”rätt” eller ”fel”. Detta är ett sätt att representera data som man säkert inte tänkt på tidigare, men det går att fixa.

I bilden ovan har jag lagt ett höjdraster i bakgrunden och lagt till markörer längs vattendragen med pilar i linjerikningen. Om det är med- eller motströms spelar inte så stor roll. Det går att se kopplat till lutning i höjddata att det finns pilar som verkar gå åt ”fel” håll medan andra verkar gå åt ”rätt” håll.
Det går faktiskt att använda dessa höjddata och ”sampla” värden från punkter och använda dessa värden väldigt enkelt i QGIS.

Genom att hämta värdet med varje linjes startpunkt och subtrahera värdet i slutpunkten, så får man höjdskillnaden mellan linjens start och slut. Om man vill ha linjer från hög till låg höjd så bör alla värden vara positiva. Som synes i bilden ovan så är detta långt ifrån fallet.
Uttrycket jag använt för att skapa etiketterna hittar du nedan.
raster_value('MN75grd_elevation',1,
transform( point_n($geometry,1), 'EPSG:3006', 'EPSG:4326'))
-
raster_value('MN75grd_elevation',1,
transform( point_n($geometry,-1), 'EPSG:3006', 'EPSG:4326'))
Som synes så har jag även med transform(…) i uttrycket ovan. Detta eftersom mina vattendata är i SWEREF99TM medan höjddata är i WGS84. För att sampla en punkt skapad med point_n(…) så måste jag transformera den till samma koordinatsystem som rasterlagret först.
Jag vill också passa på att säga att jag verkligen uppskattar den nya funktionen att tända och släcka etiketter för ett lager via högerklicksmenyn i lagerlistan. Högerklicka och växla om ”Show labels” är på eller av. Mycket effektivt!

Genom att lägga till en if(…) sats i uttrycket för pilens rotation i markören och om uttrycket från tidigare är mer än ”0” så roteras pilen på ett sätt och om inte 180 grader åt andra hållet. Nu verkar strömriktningen stämma bättre än tidigare (bilden ovan).
Samma typ av if(…) kan användas med en geometrigenerator för linjerna där linjer som går åt ”fel” håll kan vändas med ett uttryck.

Nyckeln i uttrycket ovan är reverse(…) som helt enkelt vänder utritningsriktningen för de objekt som är lagrade med fel riktning i förhållande till hur stilen används.

Det finns fortfarande saker att jobba med, men nu börjar det mesta se ”korrekt” ut stilmässigt. Jag har överdrivit tjockleken på den ena sidan av linjerna för att det skall bli tydligare i bilden ovan, men som synes behöver tjockleken anpassas till storleken på de vattenpolygoner som också är en del av vattensystemet.
Om man vill spara om befintliga linjer och slippa läsa in rasterdata och använda lite mera komplexa uttryck varje gång så går det såklart. Samma uttryck som tidigare använts kan användas för att göra ett urval.

Uttrycket ovan används för att välja alla objekt som har startpunkt som ligger under slutpunkten, vilket jag i det här fallet betraktar som ”fel”.
Därefter så kan jag använda processverktyget Reverse Line Direction, som också kan användas ”inline” och redigera det befintliga lagret i stället för att skapa ett nytt lager.

Här får man se upp lite, för just detta verktyg i ”inline” läge visar inte ens en dialog som kan avbrytas. Har man objekt valda, och inline aktivt när man dubbelklickar på verktyget så vänds alla objekten omedelbart! Lagret sätts automatiskt i redigeringsläge så om man ångrar sig så kan man stänga av redigeringen utan att spara ändringarna, men annars så är jobbet klart på så gott som ingen tid alls.
Jag trodde faktiskt att det skulle vara svårt att justera strömningsriktningen på vektorlinjerna när jag började för några inlägg sedan. Men under processen så slog det mig att jag skulle kunna använda höjddata på det sätt som beskrivs här. Verktygen i QGIS gör det hela väldigt enkelt och smidigt så länge man har tillräckligt högupplösta höjddata för det område som vattendragen finns i.

Nu skall jag bara prova om jag kan ”vända” vattendragen på global nivå i NaturalEarthData. Jag hoppas att jag har höjddata i tillräcklig omfattning, annars får jag verifiera metoden med andra mera lokala data.
Hi klas, thanks for sharing. It’s really nice use case for styling watercourses with correct directions. Can you share the link for the datasets so I can try it by myself.
You can use any data you have access to. For my example I’ve used some data that requires registration in order to download: https://www.lantmateriet.se/sv/Kartor-och-geografisk-information/geodataprodukter/produktlista/sverigekartor/#steg=2
Elevation need to match your vector data as good as possible in order to work perfectly, but just to test any elevation data will work.