Op Twitter of Reddit kom je soms zulke slechte kaarten tegen die daarom juist geweldig zijn. Bijvoorbeeld Useless of Terrible maps. Je hebt niets aan deze kaarten maar ze zijn toch geweldig! En soms zet het je zelfs aan het denken. Bijvoorbeeld een kaart van de Zuidpool met alle richtingen die naar het noorden wijzen…
Zo kwam ik op Twitter een kaart van Nederland tegen waarbij alle plaatsen een stuk opgeschoven waren vanwege de storm. Je hebt niets aan die kaart maar het is zeker wel grappig. En leerzaam als je vervolgens probeert om zo’n kaart zelf te maken in QGIS. Hoe pak je dat aan?
Plaatsen en hun locaties
Zoals altijd kun je dit op meerdere manieren doen in QGIS. Maar om te beginnen heb je wel eerst een lijst met plaatsen nodig. Een snelle zoektocht in mijn datasets levert de 4PP postcode database op uit 2014 (ongetwijfeld zijn er recentere bronnen met makkelijker data, zoals bij CBS). De postcode database bevat helaas meerdere records per plaatsnaam:
In Excel kun je eenvoudig records opruimen via de functie Gegevens > Dubbele waarden verwijderen. Je vinkt de kolommen aan die uniek moeten zijn. Omdat plaatsnamen ook in andere gemeenten en provincies kunnen liggen, laat je alleen de plaatsnaam, gemeente en provincie aangevinkt. Daarna is de lijst stevig opgeschoond. Omdat de eerste record per plaats meestal een postbus betreft is de positie gelijk aan het centrum van de plaats en niet ergens in een buitenwijk. Dit levert een kaart op met alle plaatsen in Nederland.
Als je wat meer tijd te besteden hebt dan kun je de kaart wat opschonen of bijvoorbeeld combineren met inwoneraantal om de grootte van de stippen te regelen. In dit voorbeeld wordt het een quick-and-dirty kaart.
Verschuiving
Om de verschuiving te bepalen kun je meerdere dingen doen. Je zou een lijn kunnen tekenen langs de onder- en zijgrens van Nederland en van elke plaats de afstand loodrecht op die lijn bepalen. De verschuiving kan dan met een percentage van die afstand in die richting berekend worden. Hoe dichter bij de kust, hoe groter de verschuiving, wat logisch is met een harde storm langs de kust. Je kunt in plaats van een lijn ook een punt buiten Nederland pakken en die gebruiken als richtpunt. Om flexibel te zijn kun je de X en Y ook opslaan in een project-variabele:
Deze kun je in een expressie toepassen, en indien niet naar wens, eenvoudig wijzigen. De weergave van de verschoven punten kun je regelen met een Geometrie-generator op het tabblad Symbologie:
Waarbij de expressie is opgebouwd uit:
project( $geometry, if ( distance($geometry, make_point(@centrum_x ,@centrum_y)) > 175000, distance($geometry, make_point(@centrum_x ,@centrum_y)) * (@verschuiving_perc/(rand(0,1) * 100)), 0.0 ), azimuth($geometry, make_point(@centrum_x,@centrum_y)) )
De functie ‘project’ plaatst de geometrie naar een punt op een bepaalde afstand en een bepaalde richting. De afstand wordt bepaald door een if-then-else constructie. Als de afstand tot aan het centrumpunt (uit de variabelen) groter is dan 175km dan wordt die afstand (vermenigvuldigd met een percentage, ook uit de variabelen) opgegeven en anders 0. Dit houdt in dat plaatsen dichtbij de grens niet verschuiven en langs de kust wel. Het is mooier om het wat vloeiender te laten verlopen maar op het kaartbeeld zie je het niet terug, tenzij je eveneens de oorspronkelijke locatie toont. De richting wordt bepaald door de functie ‘azimuth’ en om een beetje willekeurigheid in te bouwen wordt het percentage gedeeld door een random waarde. De locaties liggen nu al een stukje verderop:
Het allermooiste is als je de verschuiving kunt berekenen uit de gemeten windkracht en windrichting op een bepaald moment, maar dan moet je die data wel hebben natuurlijk.
Labels
Uiteraard moeten er nog wat plaatsnaamlabels bij. Omdat er nogal veel zijn kun je met wat trucjes een filter maken. Eerst zet je de weergave van Labels op ‘Enkele labels’ waarbij de grootte en buffer naar eigen wens ingesteld kan worden. Als inhoud van de label kies je niet voor het veld ‘woonplaats’ maar voor een expressie:
if ( length("woonplaats") > 7 AND length("woonplaats") < 10 AND strpos("woonplaats",' ') > 0, "woonplaats", "" )
Met andere woorden, als de lengte van het veld groter is dan 7 en kleiner dan 10 en er een spatie aanwezig is, dan wordt de plaatsnaam getoond en anders een lege tekst. Dit ruimt lekker op. Er zijn in QGIS nog meer mogelijkheden om dit te doen, maar als je eenmaal aan expressies begint dan is er geen houden meer aan.
Het mooiste is om de tekst cursief te plaatsen en om het winderige effect te versterken kun je nog een expressie toevoegen aan de rotatie:
Dit is opnieuw een expressie waarbij je een random hoek tussen -3 en 10 opgeeft. Dit resulteert in de volgende kaart:
Ondanks het hoge nutteloosheidsgehalte van de kaart is het weer erg leerzaam om te spelen met de mogelijkheden van QGIS.