library(pdokr)
library(sf)
library(tmap)
# bounding box definiëren. Coördinaten komen van bboxfinder.com
# (volgorde: xmin, ymin, xmax, ymax)
# Hier gebruik je functies uit de sf-package voor
bb <- st_bbox(
c(xmin = 5.428276, ymin = 52.897357, xmax = 5.501833, ymax = 52.924842),
crs = 4326
) |>
st_as_sfc() |>
st_transform(28992) |>
st_bbox()
# bounding box oprekken tot A4-liggend, gecentreerd
doel <- 210 / 297
breedte <- bb["xmax"] - bb["xmin"]
hoogte <- bb["ymax"] - bb["ymin"]
if (hoogte / breedte < doel) {
extra <- (breedte * doel - hoogte) / 2
bb["ymin"] <- bb["ymin"] - extra
bb["ymax"] <- bb["ymax"] + extra
} else {
extra <- (hoogte / doel - breedte) / 2
bb["xmin"] <- bb["xmin"] - extra
bb["xmax"] <- bb["xmax"] + extra
}Je hebt ze vast wel eens bij iemand aan de muur in de woonkamer of wc zien hangen: van die minimalistische stads-, wijk- of buurtposters; alleen straten, eventueel gebouwen en water, in zwart-wit of in een paar mooie kleuren. Er zijn verschillende websites waar je die voor een paar tientjes kunt kopen.
Maar met R maak je er zélf een, van je éigen woonplaats, wijk of buurt, in precies jóuw kleuren. In deze blogpost doe ik dat voor mijn geboorteplaats Koudum in Friesland.
Ik gebruik mijn eigen pdokr-package voor het makkelijk inladen van de kaartgegevens, de BGT-dataset (de meest gedetailleerde kaart van Nederland, volledig open data!) en de tmap-package voor het maken van de kaarten.
Stap 1: kies je kader
Welk stukje Nederland komt er boven de wc te hangen? Dat bepaal je met een bounding box: een rechthoek op die kaart die bepaalt wat er op je poster komt te staan. Deze kun je handmatig kiezen met een website zoals bboxfinder.com, waarbij je een rechthoek op de kaart tekent en vervolgens simpel de coördinaten kopieert. Ik kies een kader met het dorp Koudum links en het Friese meer De Fluezen rechts.
Die coördinaten zijn lengte- en breedtegraden; voor het rekenwerk zetten we ze om naar het Nederlandse stelsel (RD New, EPSG:28992). Daarna rekken we de rechthoek op tot de verhouding van een A4’tje (liggend in dit geval):
Stap 2: zeven BGT-lagen laden
De BGT kent tientallen lagen, die je allemaal kunt doorzoeken met de functie-call pdokr::pdok_list_layers(kadaster/bgt). Voor een mooie poster heb je er maar zeven nodig. Door bbox = bb (de bounding box die we hierboven hebben bepaald) mee te geven haalt pdok_read() alleen die features op die binnen ons kader liggen en/of de randen raken:
lees <- function(laag) {
pdok_read("kadaster/bgt", laag, bbox = bb, crs = 28992)
}
groen <- lees("begroeidterreindeel")
erven <- lees("onbegroeidterreindeel")
bermen <- lees("ondersteunendwegdeel")
water <- lees("waterdeel")
oevers <- lees("ondersteunendwaterdeel") # rietkragen en oevers
wegen <- lees("wegdeel")
panden <- lees("pand")Stap 3: plotten en opslaan
Elke laag krijgt één kleur — verder niets. De bbox = bb bij de eerste laag zorgt dat de kaart exact op ons A4-kader wordt afgesneden, en outer.margins = 0 verwijdert witruimte:
kaart <- tm_shape(erven, bbox = bb) + tm_fill("#EDE4D2") +
tm_shape(groen) + tm_fill("#9DBF9E") +
tm_shape(bermen) + tm_fill("#C3D4BC") +
tm_shape(oevers) + tm_fill("#6E9E8F") +
tm_shape(water) + tm_fill("#0E6465") +
tm_shape(wegen) + tm_fill("#F1EDE4") +
tm_shape(panden) + tm_fill("#B65A38") +
tm_layout(bg.color = "#FBF8F3", frame = FALSE, outer.margins = 0)
kaartOpslaan naar PDF (vector-bestand, dus de kaart blijft optimaal scherp, ongeacht op welk formaat je het print) is een one-liner met tmap:
tmap_save(kaart, "koudum-a4.pdf",
width = 29.7, height = 21, units = "cm")Wil je een afbeelding, sla dan op als PNG met dpi = 300 (meer dan 300 dpi maakt het bestand vooral groter, niet zichtbaar mooier):
tmap_save(kaart, "koudum-a4.png",
width = 29.7, height = 21, units = "cm", dpi = 300)Naar de printer, lijstje eromheen, klaar!
Nog een paar kleurencombinaties
Omdat R je totale vrijheid geeft kun je de verschillende lagen elke kleur meegeven die je wilt. Hieronder staan nog een paar voorbeelden van dezelfe kaart maar met andere kleuren. Bij de ‘oude kaart’ heb ik met tm_title() ook nog een titel op de kaart gezet.
Toon de code
tm_shape(erven, bbox = bb) + tm_fill("#1A1A1A") +
tm_shape(groen) + tm_fill("#161616") +
tm_shape(bermen) + tm_fill("#1F1F1F") +
tm_shape(oevers) + tm_fill("#242424") +
tm_shape(water) + tm_fill("#FBF8F3") +
tm_shape(wegen) + tm_fill("#FBF8F3") +
tm_shape(panden) + tm_fill("#FBF8F3") +
tm_layout(bg.color = "#111111", frame = FALSE, outer.margins = 0)Toon de code
tm_shape(erven, bbox = bb) + tm_fill("#E9E9E9") +
tm_shape(groen) + tm_fill("#F2F2F2") +
tm_shape(bermen) + tm_fill("#EFEFEF") +
tm_shape(oevers) + tm_fill("#C9C9C9") +
tm_shape(water) + tm_fill("#7A7A7A") +
tm_shape(wegen) + tm_fill("#1A1A1A") +
tm_shape(panden) + tm_fill("#3D3D3D") +
tm_layout(bg.color = "#FFFFFF", frame = FALSE, outer.margins = 0)Toon de code
tm_shape(erven, bbox = bb) + tm_fill("#EADFC8") +
tm_shape(groen) + tm_fill("#DCD1AF") +
tm_shape(bermen) + tm_fill("#E5DABD") +
tm_shape(oevers) + tm_fill("#BFC5A8") +
tm_shape(water) + tm_fill("#A3BDB4") +
tm_shape(wegen) + tm_fill("#F6EFDF") +
tm_shape(panden) + tm_fill("#8C5A3C") +
tm_title("Koudum",
position = tm_pos_in("left", "top"),
size = 2, fontfamily = "serif") +
tm_layout(bg.color = "#F2E8D5", frame = FALSE, outer.margins = 0)Toon de code
tm_shape(erven, bbox = bb) + tm_fill("#F0EDE5") +
tm_shape(groen) + tm_fill("#CDEBB0") +
tm_shape(bermen) + tm_fill("#DDEBC8") +
tm_shape(oevers) + tm_fill("#C4DFCB") +
tm_shape(water) + tm_fill("#99C7D6") +
tm_shape(wegen) + tm_polygons(fill = "#FDD9A0", col = "#D9B077", lwd = 0.4) +
tm_shape(panden) + tm_polygons(fill = "#C9BBB0", col = "#A89A8E", lwd = 0.3) +
tm_layout(bg.color = "#F2EFE9", frame = FALSE, outer.margins = 0)En nu jouw woonplaats
Teken op bboxfinder.com een kader om je eigen dorp, stad, wijk of buurt en je hebt binnen een minuut je eigen poster. Een paar knoppen om aan te draaien:
- De kleuren. Ik heb het kleurenpalet van deze website gebruikt, maar gaf hierboven al een paar andere opties. Gebruik een van deze voorbeelden of maak je eigen, verassende combinatie.
- Het gebied. Geen zin om zelf een kader te tekenen? Met
pdok_geocode("Koudum", "buurt")haal je bijvoorbeeld de buurtgrens van Koudum op (maar bijvoorbeeld"wijk"of"woonplaats"werken natuurlijk ook) en gebruik je daarvan dest_bbox()als startpunt. - A4-staand? Draai de verhouding om (
doel <- 297 / 210) en verwissel breedte en hoogte intmap_save().
De BGT wordt continu bijgehouden door gemeenten en andere bronhouders: je poster is dus waarschijnlijk ook nog eens actueler dan wat je online koopt!





