Visualisierung der Kleingärten in Berlin-Neukölln

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.

Metadaten

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 des Mockups

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.

Vorberitung des Skriptes

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)

1. Datengrundlage und Datenabruf

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.

1.1 Eigenschaftsanfrage der Bezirksgrenzen

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

1.2 Prüfung der verfügbaren Datenformate

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"

1.3 Download der Bezirksgrenzen

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.

1.4 Überblick über den Datensatz der Bezirksgrenzen

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…

2. Auswahl des Untersuchungsgebietes

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.

2.1 Kontrollvisualisierung des Untersuchungsgebietes

Die folgende Darstellung dient als einfache räumliche Kontrolle. Sie zeigt, ob die Geometrie von Neukölln korrekt ausgewählt wurde.

plot(Neukoelln)

3. Abruf und Aufbereitung der Kleingarten-Daten

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.

3.1 Geodatenabruf der Kleingärten

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>

3.2 Aufbereitung der Kleingarten-Daten

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"

4. Räumliche Filterung auf Neukölln

Um nur die für Neukölln relevanten Kleingartenanlagen zu erhalten, werden die Berliner Kleingarten-Daten mit der Geometrie des Untersuchungsgebietes räumlich verschnitten.

4.1 Verschneidung der Kleingärten mit Neukölln

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]>

4.2 Kontrollkarte der räumlichen Verschneidung

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") 

4.3 Vollständig innerhalb Neukölln liegende Kleingärten

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

4.4 Grenzüberlappende Kleingärten

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)) 

4.5 Kontrollkarte der grenzüberlappenden Kleingärten

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") 

5. Erstellung des finalen Neukölln-Datensatzes

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.

5.1 Filterung nach Zwischenpächter

Der folgende Schritt filtert die Zwischenpächter

KGA_NK <- KGA |>
  filter(zwischenpaechter == "BV Berlin-Süden")

5.2 Entfernung nicht benötigter Attribute und Umbenennung

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"

5.3 Umkodierung des Eigentumsstatus

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'

6. Kartographische Aufbereitung

In den folgenden Schritten wird die Darstellung der Karte schrittweise verbessert. Ziel ist eine übersichtliche, interaktive und optisch ansprechende Karte.

6.1 Grundkarte des finalen Datensatzes

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())

6.2 Anpassung von Farben und Linien

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)

6.3 Anpassung der Hintergrundkarten

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))

6.4 Ergänzung einer Hover-Funktion

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))

6.5 Anpassung der Popup-Informationen

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))

7. Finale interaktive Karte

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')

8. Speicherung des Arbeitsstandes

Zum Abschluss werden die final relevanten Objekte gespeichert.

rm(list=setdiff(ls(),c(‘KGA_NK’,‘Neukoelln’)))

save.image(‘Dein/Pfad.Rdata’)