Sitzung vorbereiten

Arbeitsplatz aufräumen und R-Bibliotheken laden

rm(list=ls())

#für Datenbearbeitung
library(tidyverse)

#für die räumliche Analyse und Darstellung von Geodaten
library(sf)

#für die Kommunikation mit APIs
library(ows4R) 
library(httr)

#für Erstellung von statischen und interaktiven Web-Karten
library(tmap) 
library(tmaptools) 
library(plotly)

Geodatenabruf

Geodaten der Ortsteile abrufen

#Verbindung mit der API vom Geoportal Berlin aufbauen
wfs_ort <- "https://gdi.berlin.de/services/wfs/alkis_ortsteile"
ort_client <- WFSClient$new(wfs_ort, serviceVersion = "2.0.0") 
ort_client$getFeatureTypes(pretty = TRUE)
##                        name     title
## 1 alkis_ortsteile:ortsteile Ortsteile
#Abfrage der vorliegenden Datenformate
ort_client$ #Rede mit dem Dienst
  getCapabilities()$ #Frage nach den Fähigkeiten
  getOperationsMetadata()$ #Hole die Metadaten
  getOperations() %>% # In den Operationen sind die Formate parametrisiert
  purrr::map(function(x){x$getParameters()}) %>% #Hole diese Parameter
  purrr::pluck(3, "outputFormat") #Suche das Feld '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"
#Geodaten zu den Ortsteile abrufen
url_ort <-parse_url(wfs_ort)
url_ort$query <- list(service = "wfs",
                  version = "2.0.0", 
                  request = "GetFeature",
                  typenames = "alkis_ortsteile:ortsteile",
                  outputFormat='GML2')
request_ort <- build_url(url_ort)
ort<- read_sf(request_ort)

Geodaten des Kleingartenbestands abrufen

#Verbindung mit der API vom Geoportal Berlin aufbauen
wfs_kga <- "https://gdi.berlin.de/services/wfs/kleingarten"
kga_client <- WFSClient$new(wfs_kga, serviceVersion = "2.0.0") 
kga_client$getFeatureTypes(pretty = TRUE)
##                      name                     title
## 1 kleingarten:kleingarten Kleingartenbestand Berlin
#Abfrage der vorliegenden Datenformate
kga_client$ #Rede mit dem Dienst
  getCapabilities()$ #Frage nach den Fähigkeiten
  getOperationsMetadata()$ #Hole die Metadaten
  getOperations() %>% # In den Operationen sind die Formate parametrisiert
  purrr::map(function(x){x$getParameters()}) %>% #Hole diese Parameter
  purrr::pluck(3, "outputFormat") #Suche das Feld '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"
#Geodaten zu den Kleingärten abrufen
url_kga <-parse_url(wfs_kga)
url_kga$query <- list(service = "wfs",
                     version = "2.0.0", 
                     request = "GetFeature",
                     typenames = "kleingarten:kleingarten",
                     outputFormat='GML2')

request_kga <- build_url(url_kga)
kga <- read_sf(request_kga)

Datenaufbereitung

Daten untersuchen

#Ortsteile untersuchen
View(ort)
head(ort)
## Simple feature collection with 6 features and 6 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 384834.8 ymin: 5814275 xmax: 408990.7 ymax: 5825412
## CRS:           NA
## # A tibble: 6 × 7
##   gml_id              uuid  sch   nam      gdf bezeich                      geom
##   <chr>               <chr> <chr> <chr>  <dbl> <chr>              <MULTIPOLYGON>
## 1 ortsteile.DEBE00YY… DEBE… 1100… Hell… 8.15e6 AX_Kom… (((404161.5 5823125, 404…
## 2 ortsteile.DEBE00YY… DEBE… 1100… Mahl… 1.30e7 AX_Kom… (((407376.3 5820918, 407…
## 3 ortsteile.DEBE00YY… DEBE… 1100… Kaul… 8.69e6 AX_Kom… (((405075.4 5820764, 405…
## 4 ortsteile.DEBE01YY… DEBE… 1100… Hans… 5.28e5 AX_Kom… (((387740.3 5820442, 387…
## 5 ortsteile.DEBE01YY… DEBE… 1100… Gesu… 6.13e6 AX_Kom… (((390734.5 5825360, 390…
## 6 ortsteile.DEBE01YY… DEBE… 1100… Wedd… 9.25e6 AX_Kom… (((388622.1 5824819, 388…
#Kleingärten untersuchen
View(kga)
head(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>

Koordinatensystem zuweisen, da beide Datensätze noch keins besitzen

ort <- st_set_crs(ort, 25833)
kga <- st_set_crs(kga, 25833)

Ortsteil Biesdorf auswählen mittels Piping

Biesdorf <- ort |>
  select(c(nam, geom)) |>
  subset(nam=='Biesdorf')

Räumliche Verschneidung der Kleingärten mit Biesdorf mittels Piping

KGA_gesamt <- kga |>
  subset(st_intersects(kga, Biesdorf, sparse=FALSE)) 

Erste Visualisierung der Kleingärten in Biesdorf zur Überprüfung

tmap_mode("view") #Interaktive Karte
## ℹ tmap modes "plot" - "view"
## ℹ toggle with `tmap::ttm()`
tm_shape(Biesdorf) + #Geometrie des Ortsteil
  tm_lines() + #Linie ohne Füllfarbe
  tm_shape(KGA_gesamt) + #Geometrie der Kleingärten
  tm_polygons(fill="objektname") #nach Objektname befülltes Polygon 

Grenzüberschreitende Kleingärten auswählen und anzeigen

KGA_grenze <- kga |>
  subset(st_overlaps(kga, Biesdorf, sparse=FALSE)) 

View(KGA_grenze)

Finales Objekt der Kleingärten in Biesdorf erstellen. Bei den grenzüberschreitenden Kleingärten werden nur Anlagen mit Zwischenpächter „BV Hellersdorf“ berücksichtigt.

KGA_aus <- KGA_grenze[!KGA_grenze$zwischenpaechter=='BV Hellersdorf',] 
KGA <- setdiff(KGA_gesamt, KGA_aus)

Kartenoptimierungen

Inhalte der Spalte “landoderbezirk” anpassen für die Verständlichkeit

KGA$landoderbezirk[KGA$landoderbezirk==1] <- 'Land'
KGA$landoderbezirk[KGA$landoderbezirk==0] <- 'Bezirk'

Klassifizierung der Anlagengröße in der neuen Spalte “groessenklasse” für die Legende

KGA$groessenklasse <- cut(
  KGA$flaechengroesse,
  breaks = c(0, 7500, 15000, Inf),
  labels = c(
    "Klein (< 7.500)",
    "Mittel (7.500–15.000)",
    "Groß (> 15.000)"),
  include.lowest = TRUE
)

Erklärungen der Parameter zur Optimierung der Karte:
tm_shape(Biesdorf) -> Geometrie des Ortsteil
tm_lines col, lwd -> Strichfarbe und -breite des Ortsteil
tm_shape(KGA) -> Geometrie der Kleingärten
tm_polygons col, lwd -> Strichfarbe und -breite der Kleingärten
tm_polygons fill, fill.scale -> Füllfarbe der Kleingärten nach Spalte “groessenklasse”
fill.legend -> Legende erzeugen mit Titel
hover -> Hover-Funktionalität hinzufügen, welche den Namen der Anlage zeigt
popup.vars -> Relevante Attribute auswählen und Pop-Up-Namen anpassen
tm_options -> Hintergundkarten hinzufügen und Transparenz angeben
tm_title_in -> Titel hinzufügen
tm_credits -> Quellenangaben hinzufügen

tmap_mode("view")
## ℹ tmap modes "plot" - "view"
tm_shape(Biesdorf) +
  tm_lines(col = "#525252", lwd = 2) +
  tm_shape(KGA) +
  tm_polygons(col = "#004529", lwd = 1,
              fill = "groessenklasse",
              fill.scale = tm_scale_categorical(values = c("#d9f0a3", "#78c679", "#238443")),
              fill.legend = tm_legend(title = "Anlagengröße in m²"), 
              hover ='objektname', 
              popup.vars = c('Straße'='strasse', 
                             'Flächengröße (m²)'='flaechengroesse',
                             'Parzellenanzahl'='parzellenanzahl', 
                             'Zwischenpächter'='zwischenpaechter', 
                             'Eigentum'='landoderbezirk',
                             'Anlagennummer'='anlagennummer')) +  
  tm_options(basemap.server = c("Esri.WorldTopoMap", "OpenStreetMap.DE"), basemaps.alpha = c(0.7, 0.7)) +
  tm_title_in("Kleingärten in Biesdorf") +
  tm_credits('Ⓒ2026 K. Borchert, Daten aus Geoportal Berlin')