Laatst kreeg ik de vraag om de blootstelling aan geluidsoverlast in beeld te brengen voor een aantal woningen. Op zich niet moeilijk, ware het niet dat het hier ging om gebouwen met meerdere woonlagen. De woningen (puntlocaties) lagen pal bovenop elkaar.
De tabel maakt veel duidelijk. Naast een X en Y coördinaat zit er ook een Z-waarde in: dat is de hoogte. De kolom DB geeft het geluidsniveau aan per woning. Je krijgt op één plek (XY) dus meerdere DB waarden, met elk een eigen hoogte.
Tsja, hoe geef je dat nou mooi weer? Mijn eerste idee was: een staafdiagram voor elke XY locatie. En dan met de kleur (geclassificeerde DB waarde) voor alle woningen netjes boven mekaar in de grafiek. Dat valt echter tegen: in QGIS kun je naast taartdiagrammen (pie chart) en tekstdiagrammen alleen histogrammen maken. En dat wou ik nou net niet.
Punt verplaatsing (Point Displacement) dan?
Je krijgt dan een hele zwik opties om ervoor te zorgen dat je alle punten netjes ziet. Alleen …. ik kon geen invloed krijgen op waar welk punt precies terecht kwam: je wil natuurlijk wel degene met de hoogste Z-waarde boven de op één na hoogste Z-waarde, enz enz. Werkte dus ook niet.
Toen bedacht ik me nog iets. Je kan namelijk ook marker symbolen verschuiven. Als je bij Style de Symbol selector kiest kun je naast grootte, hoek e.d. ook een Offset X,Y kiezen.
Nou levert het verplaatsen van alle symbolen met een vaste X en Y Offset uiteraard niet direct het gewenste resultaat op. Wat echter wel heel veel mogelijkheden biedt is de expressie knop (epsilon teken) rechts van de X en Y waarden. Hier kun je namelijk de Offset afhankelijk maken van de waarden in de tabel. Dat biedt mogelijkheden, ik heb immers een kolom met Z-waarden …
Nou is het wel even puzzelen hoe zo’n expressie eruit moet zien. Na wat prutsen kwam ik er achter dat de expressie ‘0, 100’ wel wat deed: elk punt werd 0 mm opzij (X) en 100 mm naar beneden (Y) verplaatst. Moet ie 100 mm naar boven, dan heb je dus een negatieve Y nodig. En de hele expressie moet tussen enkele quootjes: het is feitelijk een letterlijke tekst.
Maar we zijn er nog niet. Ik wou wat met die Z-waarde. Nou kun je in zo’n expressie ook Fields and Values gebruiken, en dus kun je nu wat knutselen met die Z-waarde. Na weer wat trial & error was ik er uit:
‘0, ‘|| to_string(-1 * “z”)
Het eerste deel is makkelijk: omdat ik geen verschuiving in de X richting wil wordt dat gewoon ‘0, ‘. In dat laatste stuk pak ik de waarde in de kolom “z”. Die vermenigvuldig ik met -1 (negatieve Z -> de symbolen worden naar boven verplaatst). Het resultaat daarvan is echter een getal, dus voor de functie moet je er vervolgens met to_string nog tekst van maken. En met || voeg je dat dan weer samen met die 0 voor de X richting.
Van het resultaat werd ik toch wel blij:
Het werkt dus! Ik zie de symbolen nu netjes boven elkaar, afhankelijk van de Z-waarde, terwijl de kleur de DB waarde weergeeft. Nou ja, nétjes? Er zitten wat gaten in, maar dat komt doordat er wat gegevens missen. De functie doet alles goed. Ter illustratie: de rondjes zijn de oorspronkelijke punten.
De mogelijkheden van de expressies zijn werkelijk fantastisch, ik ben daarna helemaal los gegaan. Bijvoorbeeld: bij torenflats van meer dan 10 verdiepingen de eerste 10 boven elkaar, en dan 11 t/m 20 in een nieuwe rij daarnaast? Kan! En ook bij tekstlabels kun je dit soort expressies gebruiken: de labels precies in de blokjes krijgen is grotendeels een kwestie van copy / paste van dezelfde expressie.
Veel succes met knutselen!
Leave a comment
Thank you for sharing this useful trick!
I was labeling through several duplicates of the same layer at different offset positions, so this was an excellent suggestion for using a single layer.