Analyse der Freiburger Frelo-Stationen

Moritz Lauser

Fragestellung

Das Freiburger Fahrradverleihsystem “Frelo” ist eine Kooperation des städtischen Verkehrsbundes “VAG” und dem Anbieter “Nextbike”. Im Gegensatz zu manchen anderen Städten (z.B. Leipzig) dürfen Fahrräder nicht an beliebigen Orten ausgeliehen bzw. abgestellt werden, sondern dies muss an den derzeit 56 fest installierten Stationen geschehen. Aufgrund dieser Tatsache kommt den Stationen eine besonders große Rolle für den Erfolg des Ausleihsystem in Freiburg zu. In dieser Arbeit sollten daher die Standorte der Stationen bezüglich ihrer Umgebung untersucht werden, genauer:

Können “Points of Interest” (POIs) leicht, d.h. schnell von Frelo-Stationen fußläufig erreicht werden?

Erläuterung: Was ein POI ist, ist im Prinzip eine subjektive Einschätzung. Um sich der Frage dennoch zu nähern, wurden exemplarisch verschiedene, disjunkte Überkategorien gebildet und untersucht:

  • ÖPNV
    • Straßenbahn(haltestellen)
    • Bus(-haltestellen/-bahnhof)
    • Bahnhöfe/Bahnhaltestellen
  • Bildung
    • Schulen (Grund- und Weiterführende Schulen)
    • weitere Hochschulen
    • Universitätseinrichtungen
    • Bibliotheken
  • Supermärkte

  • Freizeit/Kultur

    • Kino
    • Schwimmbad
    • Museum
    • Theater
  • Gastronomie

    • Bars/Pubs
    • Restaurants
    • Fast-Food

Besonderes Augenmerk sollte dabei auf die Kategorie “ÖPNV” gelegt werden, da für eine sinnvolle Nutzung von Leihrädern (z.B. von Pendlern) eine gute Einbindung in das bestehende Nahverkehrsnetz entscheidend ist.

Hypothesen

  1. Im Durchschnitt sind von einer Frelo-Station zu Fuß in 3 Minuten mehr als 5 POIs erreichbar.

  2. Von jeder Frelo-Station ist zu Fuß in 3 Minuten mindestens eine ÖPNV-Anbindung (Straßenbahn, Bus, Bahn) gewährleistet.

  3. Von 70% der Frelo-Station ist zu Fuß in 3 Minuten mindestens eine Bildungseinrichtung erreichbar.

  4. Von 50% der Frelo-Stationen ist zu Fuß in 3 Minuten mindestens ein Supermarkt erreichbar.

  5. Im Durchschnitt sind von einer Frelo-Station zu Fuß in 3 Minuten mindestens 3 Gastronomien erreichbar.

Datenanalyse und Karten

Mit einem Klick auf den Button “Code”, kann der gesamte Code eingesehen werden, der für die Datenakquise, sowie die Datenaufbereitung verwendet wurde.

if (!require(ggmap)){install.packages("ggmap"); library(ggmap)}
if (!require(Matrix)){install.packages("Matrix"); library(Matrix)}
if (!require(ggplot2)){install.packages("ggplot2"); library(ggplot2)}
if (!require(cowplot)){install.packages("cowplot"); library(cowplot)}
if (!require(tidyverse)){install.packages("tidyverse"); library(tidyverse)}
if (!require(sp)){install.packages("sp"); library(sp)}
if (!require(dplyr)){install.packages("dplyr"); library(dplyr)}
if (!require(sf)){install.packages("sf"); library(sf)}
if (!require(osmdata)){install.packages("osmdata"); library(osmdata)}
if (!require(rgdal)){install.packages("rgdal"); library(rgdal)}
if (!require(spData)){install.packages("spData"); library(spData)}
if (!require(lwgeom)){install.packages("lwgeom"); library(lwgeom)}
if (!require(dismo)){install.packages("dismo"); library(dismo)}
if (!require(deldir)){install.packages("deldir"); library(deldir)}
if (!require(gridExtra)){install.packages("gridExtra"); library(gridExtra)}
if (!require(ggsn)){install.packages("ggsn"); library(ggsn)}
if (!require(rgeos)){install.packages("rgeos"); library(rgeos)}
if (!require(topmodel)){install.packages("topmodel"); library(topmodel)}
if (!require(rasterVis)){install.packages("rasterVis"); library(rasterVis)}
if (!require(rgl)){install.packages("rgl"); library(rgl)}
if (!require(raster)){install.packages("raster"); library(raster)}
if (!require(tibble)){install.packages("tibble"); library(tibble)}
if (!require(lubridate)){install.packages("lubridate"); library(lubridate)}
if (!require(tidyr)){install.packages("tidyr"); library(tidyr)}
if (!require(osrm)){install.packages("osrm"); library(osrm)}
if (!require(osrmr)){install.packages("osrmr"); library(osrmr)}
if (!require(sjmisc)){install.packages("sjmisc"); library(sjmisc)}
if (!require(stringr)){install.packages("stringr"); library(stringr)}
if (!require(cartography)){install.packages("cartography"); library(cartography)}
if (!require(tinytex)){install.packages("tinytex"); library(tinytex)}
if (!require(ggspatial)){install.packages("ggspatial"); library(ggspatial)}
if (!require(magrittr)){install.packages("magrittr"); library(magrittr)}
if (!require(readxl)){install.packages("readxl"); library(readxl)}
if (!require(gtable)){install.packages("gtable"); library(gtable)}
if (!require(grid)){install.packages("grid"); library(grid)}
if (!require(viridis)){install.packages("viridis"); library(viridis)}
if (!require(scico)){install.packages("scico"); library(scico)}
if (!require(reshape2)){install.packages("reshape2"); library(reshape2)}

# bbox
bbox_fr<-getbb("Freiburg, Germany")
#bbox_fr
bbox_fr[,1]<-c(7.77,47.97)
bbox_fr[,2]<-c(7.92,48.04)


# Rohdaten
dir.create("Rohdaten")
#download.file("https://download.geofabrik.de/europe/germany/baden-wuerttemberg/freiburg-regbez-latest-free.shp.zip", destfile="Rohdaten/Rohdaten.zip", overwrite=TRUE)
#unzip("Rohdaten/Rohdaten.zip",exdir="Rohdaten/", overwrite = TRUE)

pois_data<-st_read("Rohdaten/gis_osm_pois_free_1.shp", stringsAsFactors=FALSE) #
transport_data<-st_read("Rohdaten/gis_osm_transport_free_1.shp", stringsAsFactors=FALSE) # Transport, Schulen, Supermarkt
places_data<-st_read("Rohdaten/gis_osm_places_free_1.shp", stringsAsFactors=FALSE) # Stadtbezirke etc.
pofw_data<-st_read("Rohdaten/gis_osm_pofw_free_1.shp", stringsAsFactors=FALSE) # religiöse Gebäude
#buildings_data<-st_read("Rohdaten/gis_osm_buildings_a_free_1.shp", stringsAsFactors=FALSE) #  Uni,  etc.

#opq(bbox = bbox_fr)%>%add_osm_feature(key="amenity", value="university")%>%osmdata_sf()%>%saveRDS(file="fr_university_sf.rds")
fr_university_sf <-readRDS(file="fr_university_sf.rds")

#opq(bbox = bbox_fr)%>%add_osm_feature(key="amenity", value="school")%>%osmdata_sf()%>%saveRDS(file="fr_school_sf.rds")
fr_school_sf <-readRDS(file="fr_school_sf.rds")

#opq(bbox = bbox_fr)%>%add_osm_feature(key="leisure", value="sports_centre")%>%osmdata_sf()%>%saveRDS(file="fr_sport_sf.rds")
fr_sport_sf <-readRDS(file="fr_sport_sf.rds")

#opq(bbox = bbox_fr)%>%add_osm_feature(key="amenity", value="theatre")%>%osmdata_sf()%>%saveRDS(file="fr_theatre_sf.rds")
fr_theatre_sf <-readRDS(file="fr_theatre_sf.rds")

# Base-Layer Karte
#get_stamenmap(bbox=bbox_fr, maptype="toner-background", zoom=16) %>%saveRDS(file="map_fr_16.rds")
#get_stamenmap(bbox=bbox_fr, maptype="toner-lite", zoom=16) %>%saveRDS(file="map_fr_16_l.rds")
#get_stamenmap(bbox=bbox_fr, maptype="toner-background", zoom=15) %>%saveRDS(file="map_fr_15.rds")
#get_stamenmap(bbox=bbox_fr, maptype="toner-background", zoom=14) %>%saveRDS(file="map_fr_14.rds")
#get_stamenmap(bbox=bbox_fr, maptype="toner-lines", zoom=14) %>%saveRDS(file="map_fr_14_b.rds")
### 1 ###
#### Konvertiere Rohdaten zu data.frame
pois_data<-data.frame(pois_data)
transport_data<-data.frame(transport_data)
#buildings_data<-data.frame(buildings_data)
places_data<-data.frame(places_data)
university1<-fr_university_sf$osm_lines#%>%data.frame()
university2<-fr_university_sf$osm_polygons#%>%data.frame()
schools<-fr_school_sf$osm_polygons%>%data.frame()

#### Extrahiere Frelo-Stationen und POIs/Kategorien, bereinige und konvertiere zu sf
### Frelo-Stationen
frelo_st_sf<-filter(pois_data,fclass=="bicycle_rental")%>%filter(str_detect(name,"frelo"))%>%st_as_sf()
### ÖPNV
tram_stop<-filter(transport_data,fclass=="tram_stop")
tram_stop<-tram_stop[-which(duplicated(tram_stop$name)),]# Haltestationen nicht doppelt zählen
bus_stop<-filter(transport_data,fclass=="bus_stop")
bus_stop<-bus_stop[-which(duplicated(bus_stop$name)),]# Haltestationen nicht doppelt zählen
bus_stop<-bus_stop[-grep("Freiburg ZOB ",bus_stop$name),]
bus_station<-filter(transport_data,fclass=="bus_station")
railway_station<-filter(transport_data,fclass=="railway_station")
railway_halt<-filter(transport_data,fclass=="railway_halt")
OePNV_sf<-bind(tram_stop,bus_stop,railway_station,railway_halt,bus_station)%>%st_as_sf() ###
### Bildung
college<-filter(pois_data,fclass=="college")
college<-data.frame(osm_id=college$osm_id,type="library",college$geometry)
college<-st_as_sf(college)
bibliotheken<-filter(pois_data,fclass=="library")
bibliotheken<-data.frame(osm_id=bibliotheken$osm_id,type="library",bibliotheken$geometry)
bibliotheken<-st_as_sf(bibliotheken)
schools<-schools[-which(duplicated(schools$name))]
schools<-data.frame(osm_id=schools$osm_id,type="school",schools$geometry)
schools<-st_as_sf(schools)%>%st_centroid() 
university<-rbind(university1,university2)
university<-data.frame(osm_id=university$osm_id,type="university",university$geometry)
university<-st_as_sf(university)%>%st_centroid()
Bildung_sf<-rbind(university,schools, bibliotheken, college) ###
### Versorgung
supermarkt<-filter(pois_data, fclass=="supermarket")%>%st_as_sf()
apotheke<-filter(pois_data, fclass=="pharmacy")%>%st_as_sf()
Versorgung_sf<-rbind(supermarkt)#,apotheke) ###
### Gastronomie
bars<-filter(pois_data, fclass=="bar")%>%st_as_sf()
fastfood<-filter(pois_data, fclass=="fast_food")%>%st_as_sf()
restaurant<-filter(pois_data, fclass=="restaurant")%>%st_as_sf()
pub<-filter(pois_data, fclass=="pub")%>%st_as_sf()
#nightclub<-filter(pois_data, fclass=="nightclub")%>%st_as_sf()
Gastronomie_sf<-rbind(fastfood,bars,restaurant,pub)#,nightclub) ###
### Freizeit
sport<-filter(pois_data, fclass=="sports_centre")%>%st_as_sf()
sport2<-st_centroid(fr_sport_sf$osm_polygons)
sport2<-data.frame(osm_id=sport2$osm_id,code="",fclass="sports_centre",name=sport2$name,sport2$geometry)%>%st_as_sf()
theater<-filter(pois_data, fclass=="theatre")%>%st_as_sf()
theater2<-st_centroid(fr_theatre_sf$osm_polygons)
theater2<-data.frame(osm_id=theater2$osm_id,code="",fclass="sports_centre",name=theater2$name,theater2$geometry)%>%st_as_sf()
kino<-filter(pois_data, fclass=="cinema")%>%st_as_sf()
Freizeit_sf<-rbind(sport,sport2,theater,theater2,kino) ###
### 2 ###
#### Berechne (3,5)-Minuten-Umgebungen
options(osrm.server = "http://localhost:5000/", osrm.profile="walk") # lokaler OSRM-Server 
### loop über alle Frelo-Stationen
nres<-15 # Auflösung der Polygone, 15 stellt einen guten Kompromiss aus Genauigkeit und Rechenzeit dar (Rechenzeit steigt proportional zu nres^2)
nbreaks<-c(3,5) # 3- bzw. 5-Minuten-Umgebung 
#nrow(frelo_st_sf)# offizielle Anzahl von Frelo-Stationen: 56
######## loop auskommentiert, wegen langer Berechnungsdauer  
# for(i in nrow(frelo_st_sf):1){
#   if(i==nrow(frelo_st_sf)){
#     frelo_isochrone_sf<-osrmIsochrone(loc = frelo_st_sf[i,], breaks = nbreaks,res=nres, returnclass="sf")}
#   else{
#    frelo_isochrone_sf<-osrmIsochrone(loc = frelo_st_sf[i,], breaks = nbreaks,res=nres, returnclass="sf")%>%rbind(.,frelo_isochrone_sf)
#   }
# }
# saveRDS(frelo_isochrone_sf,file=sprintf("frelo_isochrone_sf_nres_%i_nbreaks_%i_%i.rds",nres,nbreaks[1],nbreaks[2]))
####

frelo_isochrone_sf<-readRDS(sprintf("frelo_isochrone_sf_nres_%i_nbreaks_%i_%i.rds",nres,nbreaks[1],nbreaks[2]))

# export <- st_write(frelo_isochrone_sf, dsn ="D:/GIT_NEW/spatial_thinking_website/blogdown/content/showcase/lauser/frelo_isochrone_sf.shp")

frelo_isochrone_sf <- st_read("frelo_isochrone_sf.shp")

frelo_isochrone_3_sf<-frelo_isochrone_sf[frelo_isochrone_sf$max==nbreaks[1],]
frelo_isochrone_5_sf<-frelo_isochrone_sf[frelo_isochrone_sf$max==nbreaks[2],]


### 3 ###
### Pröfe öberschneidungen von X-Minuten-Umgebung mit POIs
## öPNV
OePNV_intersect_id_3<-data.frame(st_intersects(frelo_isochrone_3_sf, OePNV_sf))
OePNV_intersect_id_5<-data.frame(st_intersects(frelo_isochrone_5_sf, OePNV_sf))
OePNV_intersect_3_sf<-OePNV_sf[OePNV_intersect_id_3$col.id,]
OePNV_intersect_5_sf<-OePNV_sf[OePNV_intersect_id_5$col.id,]
OePNV_intersect_count_3<-rowSums(as.matrix(st_intersects(frelo_isochrone_3_sf, OePNV_sf))!=0)
OePNV_intersect_count_5<-rowSums(as.matrix(st_intersects(frelo_isochrone_5_sf, OePNV_sf))!=0)
OePNV_intersect_count_total<-OePNV_intersect_count_3+OePNV_intersect_count_5
## Bildung
Bildung_intersect_id_3<-data.frame(st_intersects(frelo_isochrone_3_sf, Bildung_sf))
Bildung_intersect_3_sf<-Bildung_sf[Bildung_intersect_id_3$col.id,]
Bildung_intersect_id_5<-data.frame(st_intersects(frelo_isochrone_5_sf, Bildung_sf))
Bildung_intersect_5_sf<-Bildung_sf[Bildung_intersect_id_5$col.id,]
Bildung_intersect_count_3<-rowSums(as.matrix(st_intersects(frelo_isochrone_3_sf, Bildung_sf))!=0)
Bildung_intersect_count_5<-rowSums(as.matrix(st_intersects(frelo_isochrone_5_sf, Bildung_sf))!=0)
Bildung_intersect_count_total<-Bildung_intersect_count_3+Bildung_intersect_count_5
Bildung_intersect_count_3
## Versorgung
Versorgung_intersect_id_3<-data.frame(st_intersects(frelo_isochrone_3_sf, Versorgung_sf))
Versorgung_intersect_3_sf<-Versorgung_sf[Versorgung_intersect_id_3$col.id,]
Versorgung_intersect_id_5<-data.frame(st_intersects(frelo_isochrone_5_sf, Versorgung_sf))
Versorgung_intersect_5_sf<-Versorgung_sf[Versorgung_intersect_id_5$col.id,]
Versorgung_intersect_count_3<-rowSums(as.matrix(st_intersects(frelo_isochrone_3_sf, Versorgung_sf))!=0)
Versorgung_intersect_count_5<-rowSums(as.matrix(st_intersects(frelo_isochrone_5_sf, Versorgung_sf))!=0)
Versorgung_intersect_count_total<-Versorgung_intersect_count_3+Versorgung_intersect_count_5
## Gastronomie
Gastronomie_intersect_id_3<-data.frame(st_intersects(frelo_isochrone_3_sf, Gastronomie_sf))
Gastronomie_intersect_3_sf<-Gastronomie_sf[Gastronomie_intersect_id_3$col.id,]
Gastronomie_intersect_id_5<-data.frame(st_intersects(frelo_isochrone_5_sf, Gastronomie_sf))
Gastronomie_intersect_5_sf<-Gastronomie_sf[Gastronomie_intersect_id_5$col.id,]
Gastronomie_intersect_count_3<-rowSums(as.matrix(st_intersects(frelo_isochrone_3_sf, Gastronomie_sf))!=0)
Gastronomie_intersect_count_5<-rowSums(as.matrix(st_intersects(frelo_isochrone_5_sf, Gastronomie_sf))!=0)
Gastronomie_intersect_count_total<-Gastronomie_intersect_count_3+Gastronomie_intersect_count_5
## Freizeit
Freizeit_intersect_id_3<-data.frame(st_intersects(frelo_isochrone_3_sf, Freizeit_sf))
Freizeit_intersect_3_sf<-Freizeit_sf[Freizeit_intersect_id_3$col.id,]
Freizeit_intersect_id_5<-data.frame(st_intersects(frelo_isochrone_5_sf, Freizeit_sf))
Freizeit_intersect_5_sf<-Freizeit_sf[Freizeit_intersect_id_5$col.id,]
Freizeit_intersect_count_3<-rowSums(as.matrix(st_intersects(frelo_isochrone_3_sf, Freizeit_sf))!=0)
Freizeit_intersect_count_5<-rowSums(as.matrix(st_intersects(frelo_isochrone_5_sf, Freizeit_sf))!=0)
Freizeit_intersect_count_total<-Freizeit_intersect_count_3+Freizeit_intersect_count_5
## Alle POIs
AllPois_intersect_count_3<-Freizeit_intersect_count_3+
  Gastronomie_intersect_count_3+
  Versorgung_intersect_count_3+
  Bildung_intersect_count_3+
  OePNV_intersect_count_3
AllPois_intersect_count_total<-Freizeit_intersect_count_total+
  Gastronomie_intersect_count_total+
  Versorgung_intersect_count_total+
  Bildung_intersect_count_total+
  OePNV_intersect_count_total

hist_all_3_bucket<-list(OePNV=OePNV_intersect_count_3,
           Bildung=Bildung_intersect_count_3,
           Versorgung=Versorgung_intersect_count_3,
           Gastronomie=Gastronomie_intersect_count_3,
           Freizeit=Freizeit_intersect_count_3)

hist_all_3_frame<-data.frame(AllPois_intersect_count_3,
           OePNV_intersect_count_3,
           Bildung_intersect_count_3,
           Versorgung_intersect_count_3,
           Gastronomie_intersect_count_3,
           Freizeit_intersect_count_3)

hist_all_5_frame<-data.frame(AllPois_intersect_count_total,
           OePNV_intersect_count_total,
           Bildung_intersect_count_total,
           Versorgung_intersect_count_total,
           Gastronomie_intersect_count_total,
           Freizeit_intersect_count_total)
### 4 ###
### Wöhle Zoom-Ausschnitt
zoom_id<-10
#frelo_st_sf$name
#which(Bildung_intersect_count_3>0 & OePNV_intersect_count_3 & Versorgung_intersect_count_3 & Gastronomie_intersect_count_3 & Freizeit_intersect_count_3)
#Bildung_intersect_count_3[which(Bildung_intersect_count_3>0 & OePNV_intersect_count_3 & Versorgung_intersect_count_3 & Gastronomie_intersect_count_3 & Freizeit_intersect_count_3)]
OePNV_intersect_3_zoom_sf<-OePNV_sf[OePNV_intersect_id_3$col.id[OePNV_intersect_id_3$row.id==zoom_id],]
Bildung_intersect_3_zoom_sf<-Bildung_sf[Bildung_intersect_id_3$col.id[Bildung_intersect_id_3$row.id==zoom_id],]
Versorgung_intersect_3_zoom_sf<-Versorgung_sf[Versorgung_intersect_id_3$col.id[Versorgung_intersect_id_3$row.id==zoom_id],]
Gastronomie_intersect_3_zoom_sf<-Gastronomie_sf[Gastronomie_intersect_id_3$col.id[Gastronomie_intersect_id_3$row.id==zoom_id],]
Freizeit_intersect_3_zoom_sf<-Freizeit_sf[Freizeit_intersect_id_3$col.id[Freizeit_intersect_id_3$row.id==zoom_id],]


### Eigene Funktionen
#Hierin befinden sich eigen definierte Funktionen för grafische "themes" (angelehnt an https://timogrossenbacher.ch/2016/12/beautiful-thematic-maps-with-ggplot2-only/), die in den anschlieöenden Plots und Karten verwendet werden. 

#### Custom Functions
theme_map <- function(...) {
  theme_minimal() +
  theme(
    #text = element_text(family = "Ubuntu Regular", color = "#22211d"),
    axis.line = element_blank(),
    axis.text.x = element_blank(),
    axis.text.y = element_blank(),
    axis.ticks = element_blank(),
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    #panel.grid.minor = element_line(color = "#ebebe5", size = 0.2),
    #panel.grid.major = element_line(color = "#ebebe5", size = 0.2),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    plot.background = element_rect(fill = "#f5f5f2", color = NA),
    panel.background = element_rect(fill = "#f5f5f2", color = NA),
    legend.background = element_rect(fill = "#f5f5f2", color = NA),
    panel.border = element_blank()
  )+
    theme(
      legend.position = "bottom",
      #legend.direction="vertical",
      legend.justification = "left",
      #legend.text.align = 0,
      legend.background = element_rect(fill = alpha('white', 0.0)),
      legend.text = element_text(size = 7, hjust = 0, color = "#4e4d47"),
      plot.title = element_text(hjust = 0.5, color = "#4e4d47", margin = margin(b=-0.7,unit="cm")),
      plot.subtitle = element_text(hjust = 0.5, color = "#4e4d47"),
                                   # margin = margin(b = -0.1,
                                   #                 t = -0.1,
                                   #                 l = 2,
                                   #                 unit = "cm"),
                                   # debug = F),
      
      legend.title = element_text(size = 8),
      plot.margin = unit(c(.5,.5,.2,.5), "cm"),
      panel.spacing = unit(c(-.1,0.2,.2,0.2), "cm"),
      panel.border = element_blank(),
      plot.caption = element_text(size = 6,
                                  hjust = 0,
                                  margin = margin(t = -0.4,unit = "cm"),
                                   #               b = 0,
                                    #              unit = "cm"),
                                  color = "#939184")
    )
}

theme_hist <- function(...) {
  theme_minimal() +
  theme(
    #text = element_text(family = "Ubuntu Regular", color = "#22211d"),
    #axis.line = element_blank(),
    axis.text.x = element_text(size = 7, color="#4e4d47"),
    axis.text.y = element_text(size = 7, color="#4e4d47"),
    #axis.ticks = element_blank(),
    axis.title.x = element_text(size = 9, color="#4e4d47"),
    axis.title.y = element_text(size = 9, color="#4e4d47"),
    #panel.grid.minor = element_line(color = "#ebebe5", size = 0.2),
    panel.grid.major = element_line(color = "white", size = 0.7),
    panel.grid.minor = element_blank(),
    plot.background = element_rect(fill = "#f5f5f2", color = NA),
    panel.background = element_rect(fill = "#f5f5f2", color = NA),
    legend.background = element_rect(fill = "#f5f5f2", color = NA),
    panel.border = element_blank()
  )+
    theme(
      legend.position = "right",
      legend.text.align = 1,
      legend.background = element_rect(fill = alpha('white', 0.0)),
      legend.text = element_text(size = 7, hjust = 0, color = "#4e4d47"),
      plot.title = element_text(size=11,hjust = 0.5, color = "#4e4d47"),
      plot.subtitle = element_text(hjust = 0.5, color = "#4e4d47",
                                   margin = margin(b = -0.1,
                                                   t = -0.1,
                                                   l = 2,
                                                   unit = "cm"),
                                   debug = F),
      legend.title = element_text(size = 8),
      plot.margin = unit(c(.5,.5,.2,.5), "cm"),
      panel.spacing = unit(c(-.1,0.2,.2,0.2), "cm"),
      panel.border = element_blank(),
      plot.caption = element_text(size = 6,
                                  hjust = 0,
                                  margin = margin(t = 0.2,
                                                  b = 0,
                                                  unit = "cm"),
                                  color = "#939184")
    )
}

# Zoom Karte:
bbox_zoom<-bbox_fr
bbox_beispiel<-st_bbox(frelo_isochrone_3_sf[zoom_id,])
bbox_zoom[,1]<-c(bbox_beispiel$xmin,bbox_beispiel$ymin)-(bbox_beispiel$xmax-bbox_beispiel$xmin)/20
bbox_zoom[,2]<-c(bbox_beispiel$xmax,bbox_beispiel$ymax)+(bbox_beispiel$xmax-bbox_beispiel$xmin)/20

#get_stamenmap(bbox=bbox_zoom, maptype="toner-background",zoom=18)%>%saveRDS(file="map_fr_zoom_18.rds")
zoom_box<-st_as_sfc(st_bbox(bbox_beispiel))
# Lade gespeicherte Karten
map_fr<-readRDS(file="map_fr_14.rds")
map_zoom<-readRDS(file="map_fr_zoom_18.rds")

# Lade Isochrone-Model
nbreaks=c(3,5)
nres=15
frelo_isochrone_sf<-readRDS(sprintf("frelo_isochrone_sf_nres_%i_nbreaks_%i_%i.rds",nres,nbreaks[1],nbreaks[2]))

# Plot Farben
frelo_color<-"#e1001a"
isochrone_3_color<-"#99D41B"
isochrone_5_color<-"#f2cb0a"
background_color<-"#f5f5f2"
OePNV_color<-"#2A7EF1"
Bildung_color<-"#F79021"
Versorgung_color<-"#ffe700"
Gastronomie_color<-"#AE0F7C"
Freizeit_color<-"#42E1ED"

Kategorien_pallette<-c(OePNV_color,Bildung_color,Versorgung_color,Gastronomie_color,Freizeit_color)

Im Folgenden werden die Ergebnisse in Form von Karten und Histogrammen grafisch dargestellt und diskutiert.

Übersicht

Erstes Ergebnis ist eine Übersichtsgrafik bestehend aus einer Karte aller Freiburger Frelo-Stationen inklusive ihrer 3-Minuten-Umgebungen und einer Zoom-Karte eines vorher gewählten Beispiels.

#### bersicht, Poster 1
## Zoom Ausschnitt
plot_zoom<-ggmap(map_zoom)+coord_sf(crs = st_crs(4326))+
  theme_map()+
  geom_sf(data=frelo_isochrone_3_sf[zoom_id,],inherit.aes = FALSE, 
          aes(colour=isochrone_3_color), 
          fill=isochrone_3_color, size=0.4,alpha=0.1,show.legend = "polygon")+
  geom_sf(data=frelo_st_sf[zoom_id,], inherit.aes = FALSE,
          aes(colour=frelo_color),
          fill=frelo_color,
          size=3,shape=16,show.legend = "point")+
  geom_sf(data=OePNV_intersect_3_zoom_sf, inherit.aes = FALSE,
          aes(colour=OePNV_color),
          fill=OePNV_color,
          size=3,shape=8,show.legend = "point")+
  geom_sf(data=Bildung_intersect_3_zoom_sf, inherit.aes = FALSE,
          aes(colour=Bildung_color),
          fill=Bildung_color,
          size=3,shape=18,show.legend = "point")+
  geom_sf(data=Versorgung_intersect_3_zoom_sf, inherit.aes = FALSE,
          aes(colour=Versorgung_color),
          fill=Versorgung_color,
          size=3,shape=17,show.legend = "point")+
  geom_sf(data=Gastronomie_intersect_3_zoom_sf, inherit.aes = FALSE,
          aes(colour=Gastronomie_color),
          fill=Gastronomie_color,
          size=3,shape=4,show.legend = "point")+
  geom_sf(data=Freizeit_intersect_3_zoom_sf, inherit.aes = FALSE,
          aes(colour=Freizeit_color),
          fill=Freizeit_color,
          size=3,shape=15,show.legend = "point")+
  scale_color_identity(name="Elemente:",
                       breaks=c(isochrone_3_color,frelo_color,OePNV_color,Bildung_color,
                                Versorgung_color,Gastronomie_color,Freizeit_color),
                       labels=c("3 min Umgebung","Frelo-Station","ÖPNV","Bildung",
                                "Supermarkt",
                                "Gastronomie","Freizeit/Kultur"),
                       guide = guide_legend(ncol =2,byrow = T,override.aes = list(
                         fill=c(isochrone_3_color,background_color,background_color,background_color,
                                background_color,background_color,background_color),
                         linetype = c("solid", "blank","blank","blank","blank","blank","blank"),
                         shape = c(0,16,8,
                                   18,
                                   17,4,15))))+
  #scale_color_manual(guide_legend(nrow = 2))+
  theme(
    legend.position = "bottom",
    legend.direction = "vertical",
    panel.border = element_rect(colour = "black",size = 1,fill=NA)
    #legend.key = element_rect(size = 0.5)
  )+
  labs(x=NULL,
       y=NULL,
       #title="Alle Frelo-Stationen mit 3-Minuten-Umgebung",
       subtitle = "Beispiel: Moltkestraße")+#,
       #caption = "Karte: StamenMaps, Daten: Geofabrik/OpenStreetMaps, Mai 2020")+
  annotation_scale(location = "tl") +
  annotation_north_arrow(location = "tr", 
                         which_north = "true", 
                         height =unit(0.8,"cm"),
                         width=unit(0.7,"cm"))
#plot_zoom
##

## Allgemeine ßbersichtskarte
plot_allgemein<-ggmap(map_fr)+coord_sf(crs = st_crs(4326))+
  theme_map()+
  geom_sf(data=frelo_isochrone_3_sf,inherit.aes = FALSE, 
          #aes(colour=isochrone_3_color), 
          colour=isochrone_3_color,
          fill=isochrone_3_color, size=0.3,alpha=0.5,show.legend = "polygon")+
  geom_sf(data=frelo_st_sf, inherit.aes = FALSE,
          #aes(colour=frelo_color),
          colour=frelo_color,
          fill=frelo_color,
          size=1,shape=16,show.legend = "point")+
  geom_sf(data=zoom_box, inherit.aes = FALSE,
          #aes(colour=frelo_color),
          colour="black",
          fill=NA,
          size=0.5)+
  # scale_color_identity(name="Elemente:",
  #                      breaks=c(isochrone_3_color,frelo_color),
  #                      labels=c("3 min Umgebung","Frelo-Station"),
  #                      guide = guide_legend(override.aes = list(
  #                        fill=c(isochrone_3_color,background_color),
  #                        linetype = c("solid", "blank"),
  #                        shape = c(0,16))))+
  theme(
    
  )+
  labs(x=NULL,
       y=NULL,
       #title="Alle Frelo-Stationen mit 3-Minuten-Umgebung",
       subtitle = "Übersicht aller Stationen")+#,
       #caption = "Karte: StamenMaps, Daten: Geodatenfabrik, Mai 2020")+
  annotation_scale(location = "bl") +
  annotation_north_arrow(location = "tr", 
                         which_north = "true", 
                         height =unit(0.8,"cm"),
                         width=unit(0.7,"cm"))
#plot_allgemein
##

### Poster zusammenfÜgen
arrowA <- data.frame(x1 = 10.25, x2 = 21.5, y1 = 7.9, y2 = 11)
poster1<-ggdraw(xlim = c(0, 31), ylim = c(1.5, 17))+
  theme_map()+
  #draw_plot(plot2,x = 17.8, y = -0.3, width = 11, height = 11)+
  draw_plot(plot_allgemein,x = -1, y = 2.2, width = 22, height = 15)+
  draw_plot(plot_zoom,x = 20.5, y = 0, width = 11, height = 17)+
  geom_segment(aes(x = x1, y = y1, xend = x2, yend = y2), data = arrowA, 
        arrow = arrow(), lineend = "round",color="#7E7E7E")+
  labs(caption="Karte: Tiles by Stamen Design, Daten: Geofabrik/OpenStreetMaps, Autor: Moritz Lauser, Mai 2020",
       title="Frelo-Stationen mit fußläufigen 3-Minuten-Umgebungen")

### Histogramme
### Nach Kategorien
histo_all_3_Kat<-ggplot(melt(hist_all_3_bucket),
                    aes(value,fill=L1))+
  geom_histogram(position="stack",binwidth = 1)+#aes(fill=factor(..count..)),binwidth=1)+
  # geom_text(aes(x=mean(AllPois_intersect_count_3),
  #               y=4,
  #               label=sprintf("Mittelwert = %.2f",
  #                             mean(AllPois_intersect_count_3))),
  #           hjust=-0.1,
  #           colour="orange")+
  theme_hist()+
  scale_fill_manual(values=c(OePNV=Kategorien_pallette[1],
                             Bildung=Kategorien_pallette[2],Versorgung=Kategorien_pallette[3],
                             Gastronomie=Kategorien_pallette[4],Freizeit=Kategorien_pallette[5]),
                    breaks=c("OePNV","Bildung","Versorgung","Gastronomie","Freizeit"),
                    labels=c("ÖPNV","Bildung","Supermarkt","Gastronomie","Freizeit/Kultur"),
                    name="Kategorien",#Anzahl der Frelo-Stationen",
                    guide = guide_legend(
                     direction = "vertical",
                     keyheight = unit(4/length(labels), units = "mm"),
                     keywidth = unit(1.5, units = "mm"),
                     title.position = 'top',
                     title.hjust = 0.5,
                     label.hjust = 1,
                     #nrow = 1,
                     #byrow = T,
                     #reverse = T,
                     label.position = "right"
                     ))+
  #geom_vline(xintercept = mean(AllPois_intersect_count_3),linetype="longdash", color="orange", size=1.5)+
  labs(x = "Anzahl der POIs pro Kategorie",
             y = "Anzahl der Frelo-Stationen",
            caption="Daten: Geofabrik/OpenStreetMaps, Autor: Moritz Lauser, Mai 2020",
             title= "Anzahl der erreichbaren POIs nach Kategorien, 3-Min-Umgebung")
#histo_all_3_Kat

### Summe (nach Stationen)
histo_all_3_Stat<-ggplot(hist_all_3_frame,
                    aes(hist_all_3_frame$AllPois_intersect_count_3))+
  geom_histogram(aes(fill=factor(..count..)),binwidth=1)+
  geom_text(aes(x=mean(hist_all_3_frame$AllPois_intersect_count_3),
                y=4,
                label=sprintf("Mittelwert = %.2f",
                              mean(hist_all_3_frame$AllPois_intersect_count_3))),
            hjust=-0.1,
            colour="orange")+
  theme_hist()+
  scale_fill_manual(values=rev(scico(length(unique(hist_all_3_frame$AllPois_intersect_count_3)/2),palette = "tofino"))[1:9],
                    name="",#Anzahl der Frelo-Stationen",
                    guide = guide_legend(
        direction = "vertical",
        keyheight = unit(4/length(labels), units = "mm"),
        keywidth = unit(1.5, units = "mm"),
        title.position = 'bottom',
        title.hjust = 0.5,
        label.hjust = 1,
        #nrow = 1,
        #byrow = T,
        reverse = T,
        label.position = "right"
      ))+
  geom_vline(xintercept = mean(hist_all_3_frame$AllPois_intersect_count_3),linetype="longdash", color="orange", size=1.5)+
  labs(x = "Summe der POIs",
             y = "Anzahl der Frelo-Stationen",
       caption="Daten: Geofabrik/OpenStreetMaps, Autor: Moritz Lauser, Mai 2020",
             title= "Summe der erreichbaren POIs nach Frelo-Stationen, 3-Min-Umgebung")

##### Ausgabe der Allgemeinen Grafiken
poster1

Darüberhinaus werden zwei Histogramme erstellt.

  • Das erste Histogramm stellt die Anzahl der erreichbaren POIs für jede Kategorie einzeln dar und dient einer ersten Übersicht bzw. einem ersten Vergleich, welche POI-Kategorien besonders häufig vertreten sind und welche nicht. Besonders auffällig ist dabei die “Sonderrolle” der Gastronomien: Es ist fast die einzige Kategorie, von der mehr als 10 (bis über 30) Standorte von einer einzigen Frelo-Station aus in 3 Minuten erreicht werden können (Ausnahme eine Frelo-Station mit 15 Bildungsstandorten). Eine erste Vermutung zur Erklärung könnte die hohe Dichte von Gastronomien in der Freiburger Innenstadt sein.
histo_all_3_Kat

#histo_all_3_Stat
  • Das zweite Histogramm stellt die Anzahl der erreichbaren POIs für jede Station unabhängig von Kategorien dar. Aus dem Histogramm geht hervor, dass von den meisten (83%) der Frelo-Stationen 0 bis 10 POIs in 3 Minuten erreicht werden können, wobei nur von 2 Stationen aus überhaupt kein POI erreicht werden kann. Dieser Grafik kann auch der Mittelwert der erreichbaren POIs aller Stationen entnommen werden: 6,91 POIs pro Station. Damit ist die erste These verifiziert.
#histo_all_3_Kat
histo_all_3_Stat

Beispiel: ÖPNV

Im Folgenden wurden die einzelnen Katgeorien genauer analysisiert. Das Vorgehen wird hier exemplarisch nur für die Kategorie ÖPNV ausführlich dargestellt.

  • Die erste Grafik zeigt einmal die in 3 Minuten erreichbaren ÖPNV-Anbindungen im Vergleich zu den 5-Minuten-Umgebungen, wobei die einzelnen Umgebungen für eine bessere Übersichtlichkeit in Gebieten von Überschneidungen mit Hilfe der st_union()-Funktion “verschmolzen” wurden. Bereits optisch zu erkennen ist die deutliche Vergrößerung des 5-Minuten-Gebiets im Vergleich zum 3-Minuten-Gebiet. Die Berechnung des Flächenverhältnisses der jeweils “verschmolzenen” Gebiete ergibt einen Faktor von 1,7 (5-Minuten/3-Minuten), was dazu führt, dass 30% mehr ÖPNV-Standorte in 5 Minuten erreichbar werden.
#### ÖPNV Öbersichtskarten

#st_area(st_union(frelo_isochrone_5_sf))/st_area(st_union(frelo_isochrone_3_sf))
#nrow(OePNV_intersect_5_sf)/nrow(OePNV_intersect_3_sf)
plot_OePNV_3<-ggmap(map_fr)+coord_sf(crs = st_crs(4326))+
  theme_map()+
  geom_sf(data=st_union(frelo_isochrone_3_sf),inherit.aes = FALSE, 
          aes(colour=isochrone_3_color), 
          #colour=isochrone_3_color,
          fill=isochrone_3_color, size=0.3,alpha=0.3,show.legend = "polygon")+
  geom_sf(data=OePNV_sf, inherit.aes = FALSE,
          aes(colour=Freizeit_color),
          #colour=Freizeit_color,
          fill=Freizeit_color,
          size=1,shape=8,show.legend = "point")+
  geom_sf(data=OePNV_intersect_3_sf, inherit.aes = FALSE,
          aes(colour="#e50074"),
          #colour="#e50074",
          fill="#e50074",
          size=1,shape=8,show.legend = "point")+
  scale_color_identity(name="Elemente:",
                       breaks=c(isochrone_3_color,Freizeit_color,"#e50074"),
                       labels=c("3 min Umgebung","ÖPNV nicht in 3 min erreichbar",
                                "ÖPNV in 3 min erreichbar"),
                       guide = guide_legend(override.aes = list(
                         fill=c(isochrone_3_color,background_color,background_color),
                         linetype = c("solid", "blank","blank"),
                         shape = c(0,8,8))))+
  theme(
    legend.position = "bottom",
    legend.direction = "vertical"
    #legend.key = element_rect(size = 0.5)
  )+
  labs(x=NULL,
       y=NULL,
       subtitle="3-Minuten-Umgebung")+#, in den 3-Minuten-Umgebungen der Frelo-Stationen",
       #title = "Öbersicht aller Stationen")+#,
       #caption = "Karte: Tiles by Stamen Design, Daten: Geofabrik/OpenStreetMaps, Autor: Moritz Lauser, Mai 2020")+
  annotation_scale(location = "bl") +
  annotation_north_arrow(location = "tr", 
                         which_north = "true", 
                         height =unit(0.8,"cm"),
                         width=unit(0.7,"cm"))
#plot_OePNV_3

plot_OePNV_5<-ggmap(map_fr)+coord_sf(crs = st_crs(4326))+
  theme_map()+
  geom_sf(data=st_union(rbind(frelo_isochrone_3_sf, frelo_isochrone_5_sf)),
          inherit.aes = FALSE, 
          aes(colour=isochrone_5_color), 
          #colour=isochrone_3_color,
          fill=isochrone_5_color, size=0.3,alpha=0.3,show.legend = "polygon")+
  geom_sf(data=OePNV_sf, inherit.aes = FALSE,
          aes(colour=Freizeit_color),
          #colour=Freizeit_color,
          fill=Freizeit_color,
          size=1,shape=8,show.legend = "point")+
  geom_sf(data=rbind(OePNV_intersect_3_sf,OePNV_intersect_5_sf), inherit.aes = FALSE,
          aes(colour="#e50074"),
          #colour="#e50074",
          fill="#e50074",
          size=1,shape=8,show.legend = "point")+
  scale_color_identity(name="Elemente:",
                       breaks=c(isochrone_5_color,Freizeit_color,"#e50074"),
                       labels=c("5 min Umgebung","ÖPNV nicht in 5 min erreichbar",
                                "ÖPNV in 5 min erreichbar"),
                       guide = guide_legend(override.aes = list(
                         fill=c(isochrone_5_color,background_color,background_color),
                         linetype = c("solid", "blank","blank"),
                         shape = c(0,8,8))))+
  theme(
    legend.position = "bottom",
    legend.direction = "vertical"
    #legend.key = element_rect(size = 0.5)
  )+
  labs(x=NULL,
       y=NULL,
       subtitle="5-Minuten-Umgebung")+#, in den 3-Minuten-Umgebungen der Frelo-Stationen",
       #title = "Öbersicht aller Stationen")+#,
       #caption = "Karte: Tiles by Stamen Design, Daten: Geofabrik/OpenStreetMaps, Autor: Moritz Lauser, Mai 2020")+
  annotation_scale(location = "bl") +
  annotation_north_arrow(location = "tr", 
                         which_north = "true", 
                         height =unit(0.8,"cm"),
                         width=unit(0.7,"cm"))
#plot_OePNV_5

### Die entsprechenden Histogramme
histo_OePNV_3_Stat<-ggplot(hist_all_3_frame,
                    aes(hist_all_3_frame$OePNV_intersect_count_3))+
  geom_histogram(aes(fill=factor(..count..)),binwidth=1)+
  geom_text(aes(x=mean(hist_all_3_frame$OePNV_intersect_count_3),
                y=20,
                label=sprintf("Mittelwert = %.2f",
                              mean(hist_all_3_frame$OePNV_intersect_count_3))),
            hjust=-0.1,
            colour="orange")+
  theme_hist()+
  scale_fill_manual(values=rev(scico(20,palette = "tofino"))[1:8],
                    name="",#Anzahl der Frelo-Stationen",
                    guide = guide_legend(
        direction = "vertical",
        keyheight = unit(4/length(labels), units = "mm"),
        keywidth = unit(1.5, units = "mm"),
        title.position = 'bottom',
        title.hjust = 0.5,
        label.hjust = 1,
        #nrow = 1,
        #byrow = T,
        reverse = T,
        label.position = "right"
      ))+
  geom_vline(xintercept = mean(hist_all_3_frame$OePNV_intersect_count_3),linetype="longdash", color="orange", size=1.5)+
  labs(x = "Anzahl der ÖPNV-Anbindungen",
             y = "Anzahl der Frelo-Stationen",
             subtitle= "3-Min-Umgebung")
#histo_OePNV_3_Stat

histo_OePNV_5_Stat<-ggplot(hist_all_5_frame,
                    aes(hist_all_5_frame$OePNV_intersect_count_total))+
  geom_histogram(aes(fill=factor(..count..)),binwidth=1)+
  geom_text(aes(x=mean(hist_all_5_frame$OePNV_intersect_count_total),
                y=14,
                label=sprintf("Mittelwert = %.2f",
                              mean(hist_all_5_frame$OePNV_intersect_count_total))),
            hjust=-0.1,
            colour="#009900")+
  theme_hist()+
  scale_fill_manual(values=rev(scico(20,palette = "lajolla"))[18:10],
                    name="",#Anzahl der Frelo-Stationen",
                    guide = guide_legend(
        direction = "vertical",
        keyheight = unit(4/length(labels), units = "mm"),
        keywidth = unit(1.5, units = "mm"),
        title.position = 'bottom',
        title.hjust = 0.5,
        label.hjust = 1,
        #nrow = 1,
        #byrow = T,
        reverse = T,
        label.position = "right"
      ))+
  geom_vline(xintercept = mean(hist_all_5_frame$OePNV_intersect_count_total),linetype="longdash", color="#009900", size=1.5)+
  labs(x = "Anzahl der ÖPNV-Anbindungen",
             y = "Anzahl der Frelo-Stationen",
             subtitle= "5-Min-Umgebung")
#histo_OePNV_5_Stat

#### Poster
poster_OePNV1<-ggdraw(xlim = c(0, 31), ylim = c(0,20))+
  theme_map()+
  draw_plot(plot_OePNV_3,x = 0, y = 0, width = 16, height = 20)+
  draw_plot(plot_OePNV_5,x = 15, y = 0, width = 16, height = 20)+
  labs(caption="Karte: Tiles by Stamen Design, Daten: Geofabrik/OpenStreetMaps, Autor: Moritz Lauser, Mai 2020",
       title="ÖPNV Erreichbarkeit in 3 bzw. 5 Minuten")
#poster_OePNV1

poster_OePNV2<-ggdraw(xlim = c(0, 31), ylim = c(0,20))+
  theme_map()+
  draw_plot(histo_OePNV_3_Stat,x = 0, y = 1, width = 16, height = 17)+
  draw_plot(histo_OePNV_5_Stat,x = 15, y = 1, width = 16, height = 17)+
  labs(caption="Daten: Geofabrik/OpenStreetMaps, Autor: Moritz Lauser, Mai 2020",
       title="ÖPNV Erreichbarkeit in 3 bzw. 5 Minuten")

#### Ausgabe der ÖPNV-Grafiken
poster_OePNV1

#poster_OePNV2
  • Die zweite Grafik greift diesen Vergleich auf und stellt die entsprechenden Histogramme dar. Bemerkenswert ist, dass obwohl im Mittel 1,3 ÖPNV-Standorte erreicht werden, es immerhin 10 Stationen gibt, von denen aus in 3 Minuten keine ÖPNV-Anbindung möglich ist. Dies stellt eine Falsifizierung der 2. These dar. Allerdings ist in 5 Minuten von jeder Station aus ein ÖPNV-Standort erreichbar. Dieser Umstand spricht daher - trotz Falsifizierung der 2. These - dafür, dass bei der Planung der Frelo-Standorte die schnelle fußläufige ÖPNV-Anbindung sehr wahrscheinlich bewusst berücksichtigt wurde.
#### Ausgabe der ÖPNV-Grafiken
#poster_OePNV1
poster_OePNV2

Zusammenfassung und abschließende Diskussion der Ergebnisse

Für die anderen Kategorien wurde ein ähnliches Vorgehen gewühlt, um die eingangs gestellten Hypothesen zu falsifizieren bzw. zu verifizieren.

Hypothesen:

  1. Im Durchschnitt sind von einer Frelo-Station zu Fuß in 3 Minuten mehr als 5 POIs erreichbar. Verfiziert: Es sind im Mittel 6,91 POIs in 3 Minuten erreichbar.

  2. Von jeder Frelo-Station ist zu Fuß in 3 Minuten mindestens eine ÖPNV-Anbindung (Straßenbahn, Bus, Bahn) gewährleistet. Falsifiziert: Von 10 Stationen ist kein ÖPNV-Standort in 3 Minuten erreichbar. Ergänzung: in 5 Minuten kann von jeder Station mindestens ein ÖPNV-Standort erreicht werden

  3. Von 70% der Frelo-Station ist zu Fuß in 3 Minuten mindestens eine Bildungseinrichtung erreichbar. Falsifiziert: Lediglich von 42% der Stationen kann mindestens eine Bildungseinrichtung erreicht werden.

  4. Von 50% der Frelo-Stationen ist zu Fuß in 3 Minuten mindestens ein Supermarkt erreichbar. Falsifiziert: Lediglich von 26% der Stationen kann mindestens ein Supermarkt erreicht werden.

  5. Im Durchschnitt sind von einer Frelo-Station zu Fuß in 3 Minuten mindestens 3 Gastronomien erreichbar. Verfiziert: Es sind im Mittel 3,73 Gastronomien in 3 Minuten erreichbar, die Verteilung ist jedoch sehr breit.

Diskussion

Auch wenn nur 2 von 5 Hypothesen verifiziert werden konnten, lässt sich festhalten, dass sehr viele POIs (nach den gewählten Kategorien 384) von den Freiburger Frelo-Stationen aus erreicht werden können. Die genaue Anzahl hängt natürlich sehr stark mit den gewählten Kategorien und damit vom Untersuchungsgegenstand ab. Ziel dieser Arbeit war es exemplarisch für einige Kategorien die Erreichbarkeit zu prüfen und aufzuzeigen. Besonderes Merkmal wurde hierbei auf die ÖPNV-Anbindung gelegt, da diese vor dem Hintergrund städtischer, nachhaltiger Mobilitätstransformationen von besonderer Bedeutung ist. Daher wurden die Daten vor allem hier sorgfältig auf Vollständigkeit überprüft und diese sichergestellt (z.B. Haltestellen werden nicht doppelt gezählt, obwohl sie teilweise doppelt auftauchen (für beide Fahrtrichtungen)).

Bei den anderen Kategorien fiel die überprüfung aufgrund der Datenstrukturen ungemein schwerer. Ein grundsätzliches Problem ergab sich vor allem aus dem Begriff des “Point of Interest” und der “Einheit von Orten”: Wie soll mit größeren Arealen, in denen sich POIs einer Kategorie häufen (z.B. Institutsviertel, Pädagogische Hochschule etc.) umgegangen werden? Sind dies ein POI oder viele? Für eine akribische Einzelfallbetrachtung fehlte im Rahmen dieser Arbeit die Zeit/Kapazität, weswegen die (absoluten) Zahlenergebnisse der übrigen Kategorien mit einer gewissen Unsicherheit belegt sind. Zum einen werden also häufiger Orte “doppelt” gezählt, wodurch die hier angegebenen erreichbaren POIs als Obergrenze fungieren. Zum anderen konnte nicht vollständig sichergestellt werden, dass z.B. alle vorhandenen Gastronomien, tatsächlich in den OpenStreetMaps-Daten abgebildet werden, wodurch hier die Zahlen wiederum als Untergrenze verstanden werden sollten.

Ausblick

  • Die Dimension der tatsächlichen Nutzung konnte in dieser Analyse aufgrund fehlender Daten nicht beachtet werden. Gleichzeitig wäre für eine Bewertung der Freiburger Frelo-Stationen die tatsächliche Nutzung von entscheidender Bedeutung. Andere Städte (wie z.B. Köln) veröffentlichen die (natärlich vollständig anonymisierten) Nutzungsdaten ihres Nextbike-Fahrradverlehsystem als Open-Source-Daten. Hierbei können Ausleih- und Abgabe-Stationen sowie die Zeit der Nutzung eingelesen werden. Dies ermöglicht eine deutlich vielschichtigere Analyse, um zu untersuchen wann, welche Stationen viel genutzt (ausgelastet/überlastet) werden und könnte auch Aufschluss geben, welche Akteure (Studierende, Tourist*innen etc.) hauptsächlich Gebrauch von dem Angebot machen. Auch für Freiburg wäre es daher wünschenswert diese Daten zugänglich zu machen und damit das Frelo-System weiter zu entwickeln und zu verbessern.

  • Mit Hilfe von Nutzungsdaten einerseits und Standortdaten andererseits könnte zudem weitere Forschung in Richtung der Modellierung von “idealen” Stations-Standorten durchgeführt werden.

Previous
Next