Dieses R-Markdown-Dokument erstellt ein interaktives High-Fidelity-Mockup zur Visualisierung von Kleingartenanlagen im Berliner Bezirk Neukölln. Die Datengrundlage wird über Web Feature Services (WFS) des Geoportals Berlin abgerufen, räumlich auf Neukölln gefiltert und anschließend kartographisch aufbereitet.
| Feld | Inhalt |
|---|---|
| Name | Maurice Hempel |
| Matrikelnummer | 113664 |
| Datum | 03-06-2026 |
| Modul | Interaktive Geomediengestaltung |
| Thema | Visualisierung der Kleingärten in Berlin |
| Untersuchungsgebiet | Berlin-Neukölln |
| Datenquelle | Geoportal Berlin |
| Ausgabeformat | HTML-Mockup über R Markdown / RPubs |
Ziel dieses Mockups ist die prototypische Darstellung von Kleingartenanlagen im Bezirk Neukölln. Die finale Karte enthält interaktive Elemente wie Hover-Informationen, Popups, eine auswählbare Hintergrundkarte, Titel und Quellenangabe.
Bevor die Bearbeitung des Skriptes inhaltlich starten kann ist es notwendig benötigte Bibliotheken zu installieren und in die Umgebung einzuladen. Mit globalen Chunk-Einstellungen werden die angezeigten Ausgaben im HTML angepasst.
# Arbeitsumgebung leeren
rm(list=ls())
# Globale Chunk-Einstellungen:
# echo = TRUE: Der R-Code wird im HTML angezeigt.
# warning = FALSE und message = FALSE: technische Meldungen werden nicht gezeigt
# Die Ergebnisse der Chunks bleiben sichtbar
knitr::opts_chunk$set(
echo = TRUE,
warning = FALSE,
message = FALSE
)
# Benötigte Pakete für Datenverarbeitung, Geodatenanalyse, WFS-Abfragen und interaktive Kartendarstellung.
library(tidyverse)
library(sf)
library(tmap)
library(tmaptools)
library(httr)
library(ows4R)
Für die Visualisierung werden zwei Geodatensätze des Geoportals Berlin verwendet. Zunächst werden die Berliner Bezirksgrenzen abgerufen, um daraus das Untersuchungsgebiet Neukölln zu extrahieren. Anschließend werden die Geodaten der Berliner Kleingartenanlagen geladen.
Im folgenden Schritt wird der WFS-Dienst der Berliner Bezirksgrenzen angesprochen. Die Ausgabe zeigt, welche Feature Types über diesen Dienst verfügbar sind.
# Der WFS-Dienst stellt die Bezirksgrenzen Berlins bereit.
wfs_be <- "https://gdi.berlin.de/services/wfs/alkis_bezirke"
# Aufbau eines WFS-Clients zur Kommunikation mit dem Dienst.
ber_client <- WFSClient$new(wfs_be,
serviceVersion = "2.0.0")
# Anzeige der verfügbaren Feature Types.
ber_client$getFeatureTypes(pretty = TRUE)
## name title
## 1 alkis_bezirke:bezirksgrenzen Bezirksgrenzen
Vor dem Download wird geprüft, in welchen Formaten der WFS-Dienst
Daten bereitstellen kann. Für den weiteren Workflow wird das Format
GML2 verwendet.
ber_client$ # Kommunikation mit dem WFS-Dienst
getCapabilities()$ # Abfrage der Fähigkeiten des Dienstes
getOperationsMetadata()$ # Abruf der Metadaten zu den Operationen
getOperations() %>% # Zugriff auf die verfügbaren Operationen
purrr::map(function(x){x$getParameters()}) %>% # Abruf der Parameter
purrr::pluck(3, "outputFormat") # Auswahl des Parameters 'outputFormat'
## [1] "application/gml+xml; version=3.2" "GML2"
## [3] "application/json" "geopackage"
## [5] "geopkg" "gml3"
## [7] "gml32" "gpkg"
## [9] "json" "text/xml; subtype=gml/2.1.2"
## [11] "text/xml; subtype=gml/3.1.1" "text/xml; subtype=gml/3.2"
Die Bezirksgrenzen werden über eine WFS-GetFeature-Anfrage heruntergeladen und anschließend als Simple-Feature-Objekt eingelesen. Dieser technische Schritt läuft im Hintergrund, da an dieser Stelle noch keine eigenständige Darstellung notwendig ist.
Die folgende Ausgabe dient der Kontrolle des eingelesenen Datensatzes. Sie zeigt unter anderem die Anzahl der Features, die vorhandenen Attribute, den Geometrietyp und das zunächst noch fehlende Koordinatenreferenzsystem.
ber_Bez
## Simple feature collection with 12 features and 6 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 370000.8 ymin: 5799521 xmax: 415786.6 ymax: 5837259
## CRS: NA
## # A tibble: 12 × 7
## gml_id name gem namgem namlan lan geom
## <chr> <chr> <chr> <chr> <chr> <chr> <MULTIPOLYGON>
## 1 bezirksgrenzen.110… 1100… 001 Mitte Berlin 11 (((390754.7 5825381, 390…
## 2 bezirksgrenzen.110… 1100… 002 Fried… Berlin 11 (((396077.6 5817820, 396…
## 3 bezirksgrenzen.110… 1100… 003 Pankow Berlin 11 (((399003.5 5834203, 398…
## 4 bezirksgrenzen.110… 1100… 004 Charl… Berlin 11 (((387115.5 5816898, 387…
## 5 bezirksgrenzen.110… 1100… 005 Spand… Berlin 11 (((377248.6 5818042, 377…
## 6 bezirksgrenzen.110… 1100… 006 Stegl… Berlin 11 (((387294.5 5808137, 387…
## 7 bezirksgrenzen.110… 1100… 007 Tempe… Berlin 11 (((390292.7 5804682, 390…
## 8 bezirksgrenzen.110… 1100… 008 Neukö… Berlin 11 (((394964.8 5816192, 394…
## 9 bezirksgrenzen.110… 1100… 009 Trept… Berlin 11 (((403145.8 5815054, 403…
## 10 bezirksgrenzen.110… 1100… 010 Marza… Berlin 11 (((406879 5816643, 40689…
## 11 bezirksgrenzen.110… 1100… 011 Licht… Berlin 11 (((399483.1 5819230, 399…
## 12 bezirksgrenzen.110… 1100… 012 Reini… Berlin 11 (((389990.7 5829741, 390…
Für das Mockup wird der Berliner Ortsteil Neukölln als Untersuchungsgebiet verwendet. Aus dem Datensatz der Bezirksgrenzen wird deshalb nur die Geometrie von Neukölln ausgewählt. Das Koordinatenreferenzsystem wird anschließend auf EPSG:25833 gesetzt.
Die folgende Darstellung dient als einfache räumliche Kontrolle. Sie zeigt, ob die Geometrie von Neukölln korrekt ausgewählt wurde.
plot(Neukoelln)
Im nächsten Schritt werden die Geodaten der Berliner Kleingartenanlagen abgerufen. Diese Daten enthalten unter anderem Namen, Straßen, Flächengrößen, Parzellenanzahlen, Eigentumsinformationen und Angaben zum Zwischenpächter.
Der WFS-Dienst für die Kleingartenanlagen wird angesprochen und die ersten Datensätze werden als Kontrolle ausgegeben.
wfs_be_kga <- "https://gdi.berlin.de/services/wfs/kleingarten"
be_KGA_client <- WFSClient$new(wfs_be_kga, serviceVersion = "2.0.0")
be_KGA_client$getFeatureTypes(pretty = TRUE)
## name title
## 1 kleingarten:kleingarten Kleingartenbestand Berlin
url <-parse_url(wfs_be_kga)
url$query <- list(service = "wfs",
version = "2.0.0",
request = "GetFeature",
typenames = "kleingarten:kleingarten",
outputFormat='GML2')
request <- build_url(url)
be_KGA<- read_sf(request)
head(be_KGA)
## Simple feature collection with 6 features and 9 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 379678.4 ymin: 5825249 xmax: 389715.2 ymax: 5830703
## CRS: NA
## # A tibble: 6 × 10
## gml_id ogr_fid anlagennummer objektname strasse flaechengroesse
## <chr> <int> <chr> <chr> <chr> <dbl>
## 1 kleingarten.1 1 12001 Am Brocken II Wittest… 9271
## 2 kleingarten.2 2 12203 Schönholz II Klemkes… 6698
## 3 kleingarten.3 3 12056 Schweinekopf Großkop… 9531
## 4 kleingarten.4 4 12028 Frohsinn I Beneken… 39736
## 5 kleingarten.5 5 12017 Frühauf/Marderweg Am Nord… 3139
## 6 kleingarten.6 6 12075 Waldessaum Wesselb… 149159
## # ℹ 4 more variables: parzellenanzahl <int>, landoderbezirk <int>,
## # zwischenpaechter <chr>, geom <MULTIPOLYGON>
Das Koordinatenreferenzsystem der Kleingarten-Daten wird ebenfalls auf EPSG:25833 gesetzt. Anschließend werden nicht benötigte Spalten entfernt, sodass nur die relevanten Attribute für das Mockup erhalten bleiben.
be_KGA<- st_set_crs(be_KGA, 25833)
be_KGA[, c(1:3)] <-NULL
colnames(be_KGA)
## [1] "objektname" "strasse" "flaechengroesse" "parzellenanzahl"
## [5] "landoderbezirk" "zwischenpaechter" "geom"
Um nur die für Neukölln relevanten Kleingartenanlagen zu erhalten, werden die Berliner Kleingarten-Daten mit der Geometrie des Untersuchungsgebietes räumlich verschnitten.
Die Funktion st_intersection() schneidet die
Kleingartenflächen mit dem Untersuchungsgebiet. Dabei wird eine
zusätzlich Spalte aus dem Neukölln-Datensatz übernommen, die später
wieder entfernt wird.
KGA <- st_intersection(be_KGA, Neukoelln)
head(KGA)
## Simple feature collection with 6 features and 7 fields
## Geometry type: GEOMETRY
## Dimension: XY
## Bounding box: xmin: 392270.5 ymin: 5811855 xmax: 396402.5 ymax: 5815447
## Projected CRS: ETRS89 / UTM zone 33N
## # A tibble: 6 × 8
## objektname strasse flaechengroesse parzellenanzahl landoderbezirk
## <chr> <chr> <dbl> <int> <int>
## 1 Einigkeit Buschkrugal… 5446 22 1
## 2 Ostelbien Koppelweg 88713 176 1
## 3 Neuköllner Schweiz Mergenthale… 5012 14 1
## 4 Odertal Herrfurthst… 4033 12 0
## 5 Mariental 2 Neuköllnisc… 17811 47 1
## 6 Roseneck Koppelweg 121174 260 1
## # ℹ 3 more variables: zwischenpaechter <chr>, namgem <chr>, geom <GEOMETRY [m]>
Die folgende Karte ist lediglich ein Zwischenschritt zur Kontrolle. Sie zeigt die räumlich verschnittenen Kleingartenflächen mit der Grenze Neuköllns.
tmap_mode("view")
tm_shape(Neukoelln) +
tm_lines() +
tm_shape(KGA) +
tm_polygons(fill="objektname")
Zusätzlich wird geprüft, welche Kleingartenanlagen vollständig innerhalb der Neuköllner Grenze liegen. Diese Auswertung dient der Kontrolle und Einordnung des Datensatzes.
KGA_In <- be_KGA[st_within(be_KGA,Neukoelln, sparse=FALSE),]
summary(KGA_In) # Es liegen 79 Kleingärten vollständig innerhalb von Neukölln.
## objektname strasse flaechengroesse parzellenanzahl
## Length :79 Length :79 Min. : 1995 Min. : 7.0
## N.unique :75 N.unique :50 1st Qu.: 7869 1st Qu.: 24.5
## N.blank : 0 N.blank : 0 Median : 16097 Median : 44.0
## Min.nchar: 3 Min.nchar: 9 Mean : 41913 Mean :100.9
## Max.nchar:35 Max.nchar:24 3rd Qu.: 29958 3rd Qu.: 79.5
## Max. :361825 Max. :722.0
## landoderbezirk zwischenpaechter geom
## Min. :0.0000 Length :79 MULTIPOLYGON :79
## 1st Qu.:1.0000 N.unique : 1 epsg:25833 : 0
## Median :1.0000 N.blank : 0 +proj=utm ...: 0
## Mean :0.9494 Min.nchar:15
## 3rd Qu.:1.0000 Max.nchar:15
## Max. :1.0000
Einige Kleingartenanlagen liegen nicht vollständig innerhalb Neuköllns, sondern überlappen die Grenze des Untersuchungsgebietes. Diese Anlagen werden einzeln visualisiert, um die räumliche Situation an der Bezirksgrenze nachvollziehen zu können.
KGA_Grenze <- be_KGA |>
subset(st_overlaps(be_KGA, Neukoelln, sparse=FALSE))
Diese Karte zeigt ausschließlich die Anlagen, die die Grenze Neuköllns überlappen.
tmap_mode("view")
tm_shape(Neukoelln) +
tm_lines() +
tm_shape(KGA_Grenze) +
tm_polygons(fill="objektname")
Für die finale Karte wird ein eigener Datensatz erstellt. Dabei
werden nur diejenigen Kleingartenanlagen berücksichtigt, die dem
Zwischenpächter BV Berlin-Süden zugeordnet sind.
Anschließend werden die Attributnamen für eine verständlichere
Popup-Darstellung umbenannt.
Der folgende Schritt filtert die Zwischenpächter
KGA_NK <- KGA |>
filter(zwischenpaechter == "BV Berlin-Süden")
Durch die räumliche Verschneidung wurde die zusätzliche Spalte
namgem aus dem Neukölln-Datensatz übernommen. Für die
finale Popup-Anzeige wird diese Spalte entfernt. Anschließend erhalten
die Attribute verständlichere Namen.
KGA_NK <- KGA |>
filter(zwischenpaechter == "BV Berlin-Süden")
KGA_NK <- KGA_NK[, c(
"objektname",
"strasse",
"flaechengroesse",
"parzellenanzahl",
"landoderbezirk",
"zwischenpaechter",
"geom"
)]
colnames(KGA_NK) <- c(
"Name",
"Straße",
"Größe",
"Parzellenanzahl",
"Eigentum",
"Zwischenpächter",
"geom"
)
st_geometry(KGA_NK) <- "geom"
names(KGA_NK)
## [1] "Name" "Straße" "Größe" "Parzellenanzahl"
## [5] "Eigentum" "Zwischenpächter" "geom"
Die Spalte Eigentum enthält zunächst unverständliche
numerische Werte.
KGA_NK$Eigentum[KGA_NK$Eigentum==1] <- 'Land'
KGA_NK$Eigentum[KGA_NK$Eigentum==0] <- 'Bezirk'
In den folgenden Schritten wird die Darstellung der Karte schrittweise verbessert. Ziel ist eine übersichtliche, interaktive und optisch ansprechende Karte.
Die erste Darstellung zeigt den gefilterten Datensatz noch ohne weitere Gestaltung. Diese Karte dient als Ausgangspunkt.
tmap_mode("view")
tm_shape(Neukoelln) +
tm_lines() +
tm_shape(KGA_NK) +
tm_polygons(fill = "Name", fill.legend = tm_legend_hide())
Die Grenze Neuköllns wird dunkelblau hervorgehoben. Die Kleingarrenflächen werden grün dargestellt.
tm_shape(Neukoelln) +
tm_lines(col = "#00008B", lwd = 2) +
tm_shape(KGA_NK) +
tm_polygons(fill="#32CD32", fill.legend = tm_legend_hide(), fill_alpha=0.5,
col="#32CD32", lwd = 1)
Für das Mockup werden mehrere Hintergrundkarten angeboten. Die
Nutzerinnen und Nutzer können dadurch zwischen unterschiedlichen
Basiskarten wechseln. OpenStreetMap.HOT ist hierbei der
Kartenstil des Humanitarian OpenStreetMap Team - keine
Temperaturkarte!
tm_shape(Neukoelln) +
tm_lines(col="#00008B", lwd=2) +
tm_shape(KGA_NK) +
tm_polygons(fill="#32CD32", fill.legend = tm_legend_hide(), fill_alpha=0.5,
col="#32CD32", lwd=1) +
tm_options(basemap.server = c("OpenStreetMap.HOT", "Esri.WorldTopoMap", "CyclOSM"),
basemaps.alpha = c(1, 1, 1))
Die Hover-Funktion erhöht die Interaktivität der Karte. Beim Überfahren einer Kleingartenfläche wird der Name des Kleingartens angezeigt.
tm_shape(Neukoelln) +
tm_lines(col="#00008B", lwd=2) +
tm_shape(KGA_NK) +
tm_polygons(fill="#32CD32", fill.legend = tm_legend_hide(), fill_alpha=0.5,
col="#32CD32", lwd=1, hover = "Name") +
tm_options(basemap.server = c("OpenStreetMap.HOT", "Esri.WorldTopoMap", "CyclOSM"),
basemaps.alpha = c(1, 1, 1))
Die Popup-Anzeige wird auf die relevanten Attribute reduziert: Straße, Flächengröße, Parzellenanzahl, Zwischenpächter und Eigentumsstatus.
tm_shape(Neukoelln) +
tm_lines(col="#00008B", lwd=2) +
tm_shape(KGA_NK) +
tm_polygons(fill="#32CD32", fill.legend = tm_legend_hide(), fill_alpha=0.5,
col="#32CD32", lwd=1, hover = "Name",
popup.vars = c('Straße'='Straße', 'Flächengröße (m²)'='Größe','Parzellenanzahl'='Parzellenanzahl',
'Zwischenpächter'='Zwischenpächter', 'Eigentum'='Eigentum')) +
tm_options(basemap.server = c("OpenStreetMap.HOT", "Esri.WorldTopoMap", "CyclOSM"),
basemaps.alpha = c(1, 1, 1))
Die finale Karte fasst alle Gestaltungselemente zusammen. Sie enthält die Grenze von Neukölln, die gefilterten Kleingartenanlagen, eine transparente grüne Flächendarstellung, Hover-Informationen, Popups, auswählbare Hintergrundkarten, einen Titel und eine Quellenangabe.
tm_shape(Neukoelln) +
tm_lines(col="#00008B", lwd=2) +
tm_shape(KGA_NK) +
tm_polygons(fill="#32CD32", fill.legend = tm_legend_hide(), fill_alpha=0.5,
col="#32CD32", lwd=1, hover = "Name",
popup.vars = c('Straße'='Straße', 'Flächengröße (m²)'='Größe','Parzellenanzahl'='Parzellenanzahl',
'Zwischenpächter'='Zwischenpächter', 'Eigentum'='Eigentum')) +
tm_options(basemap.server = c("OpenStreetMap.HOT", "Esri.WorldTopoMap", "CyclOSM"),
basemaps.alpha = c(1, 1, 1))+
tm_title_in("Kleingärten in Berlin-Neukölln")+
tm_credits('Ⓒ 2026 M. Hempel, Daten aus Geoportal Berlin')
Zum Abschluss werden die final relevanten Objekte gespeichert.
rm(list=setdiff(ls(),c(‘KGA_NK’,‘Neukoelln’)))
save.image(‘Dein/Pfad.Rdata’)