2  Musterlösung Sicherheitsanalyse

Verwendete Pakete laden

```{r}
#| include: false
library(ggplot2)
library(tidyverse)
library(lubridate)
library(readxl)
library(kableExtra)
library(sf)
library(osmdata)
library(giscoR)
library(leaflet)
library(shiny)
```

Daten einlesen und aufbereiten

Deutschlandkarte:

```{r}
d_de <- gisco_get_nuts(country = "Germany", nuts_level = 0, resolution = 03)
```

Unfalldaten:

```{r}
#| warning: false

unfall_csv = read_csv2("data/Unfallorte2022_LinRef.csv") 
unfaelle <- st_as_sf(unfall_csv, coords = c("LINREFX", "LINREFY"), 
                  crs = 25832)
```

Streckenabschnitte:

```{r}
strecke <- read_sf("data/geo/BFStr_Netz_SK.geojson")
```

Streckenabschnitte A43:

```{r}
a43 <- strecke |>
  filter(Str_Kennung == "A43" & Sk_Achse == "Hauptachse") |>
  mutate(rownumber = row_number())
```

Streckenabschnitte Deutschland:

```{r}
strecke_de <- strecke |>
  filter(Str_Klasse_kurz == "A" & Sk_Achse == "Hauptachse") |>
  mutate(rownumber = row_number())
```

2.1 Aufgabe 1 : Unfälle zählen

Unfälle filtern:

```{r}
unfaelle_43 = unfaelle %>%
    # find out which autobahn is closest by
    mutate(nearest_autobahn_id = st_nearest_feature(st_zm(.), a43)) %>% 
    # calculate distance to closest autobahn
    mutate(nearest_autobahn_distance = st_distance(st_zm(.), a43[nearest_autobahn_id, ], by_element = TRUE))
```

Alles nicht in der Nähe von A43 raus:

```{r}
unfaelle_autobahn = unfaelle_43 |> 
    filter(as.double(nearest_autobahn_distance) <= 15) |>
  st_zm()
```

Unfälle zählen:

```{r}
autobahnen_accident_count = unfaelle_autobahn %>% 
    as_tibble() %>% 
    select(-geometry) %>%
    count(nearest_autobahn_id, UKATEGORIE) %>% 
  spread(UKATEGORIE, n) %>%
  rename(Anzahl_UK2 = `2`, Anzahl_UK3 = `3`) %>%
  replace(is.na(.), 0) %>%
  mutate(Anzahl_U_G = Anzahl_UK2 + Anzahl_UK3)
# Hier gehören eigentlich noch Unfaelle nach Kategorie 1 rein
```

Verbinden mit Daten der A43:

```{r}
a43 = a43 |> 
    left_join(autobahnen_accident_count, by = c("rownumber" = "nearest_autobahn_id"))

a43 <- replace(a43, is.na(a43), 0)
```

Anzahl der Unfälle in ggplot plotten:

```{r}
ggplot () +
  geom_sf(data = a43, size = 2, mapping = aes(color = Anzahl_U_G)) +
  scale_color_viridis_b(direction = -1, breaks = seq(2,14,2)) +
  labs(title = "Anzahl der Verkehrsunfälle nach Abschnitten der A43 im Jahr 2022",
       color = "Anzahl Verkehrsunfälle") +
 theme(plot.title = element_text(size=10))
```

2.2 Aufgabe 2

2.2.1 Unfalldichte

2.2.1.1 A43

Unfälle filtern:

```{r}
unfaelle_43 = unfaelle %>%
    # Welche Autobahn am Nächsten
    mutate(nearest_autobahn_id = st_nearest_feature(st_zm(.), a43)) %>% 
    # Distanz zur A43
    mutate(nearest_autobahn_distance = st_distance(st_zm(.), a43[nearest_autobahn_id, ], by_element = TRUE))
```

Alles nicht in der Nähe von A43 raus:

```{r}
unfaelle_autobahn = unfaelle_43 |> 
    filter(as.double(nearest_autobahn_distance) <= 15) |>
  st_zm()
```

Unfälle zählen:

```{r}
autobahnen_accident_count = unfaelle_autobahn %>% 
    as_tibble() %>% 
    select(-geometry) %>%
    count(nearest_autobahn_id, UKATEGORIE) %>% 
  spread(UKATEGORIE, n) %>%
  rename(Anzahl_UK2 = `2`, Anzahl_UK3 = `3`) %>%
  replace(is.na(.), 0) %>%
  mutate(Anzahl_U_G = Anzahl_UK2 + Anzahl_UK3)
# Hier gehören eigentlich noch Unfaelle nach Kategorie 1 rein, existieren aber in diesem Zeitraum nicht.
```

Verbinden mit Daten der A43:

```{r}
a43 = a43 |> 
    left_join(autobahnen_accident_count, by = c("rownumber" = "nearest_autobahn_id"))
```

Plotten:

```{r}
ggplot () +
  geom_sf(data = a43, size = 2, mapping = aes(color = Anzahl_U_G)) +
  scale_color_distiller(palette = 8 , direction = 1, breaks = seq(2,14,2)) +
  labs(title = "Anzahl der Verkehrsunfälle nach Abschnitten der A43 im Jahr 2022",
       color = "Anzahl Verkehrsunfälle") +
 theme(plot.title = element_text(size=10))
```

2.2.1.2 Deutschland

Unfälle filtern:

```{r}
unfaelle_de = unfaelle %>%
    # Welche Autobahn ist am Nächsten
    mutate(nearest_autobahn_id = st_nearest_feature(st_zm(.), strecke_de)) %>% 
    # Distanz zur nächsten Autobahn berechnen
    mutate(nearest_autobahn_distance = st_distance(st_zm(.), strecke_de[nearest_autobahn_id, ], by_element = TRUE))
```

Alles nicht in der Nähe von BAB raus:

```{r}
unfaelle_de_autobahn = unfaelle_de |> 
    filter(as.double(nearest_autobahn_distance) <= 15) |>
  st_zm()
```

Unfälle zählen:

```{r}
de_unfall_anzahl = unfaelle_de_autobahn %>% 
    as_tibble() %>% 
    select(-geometry) %>%
    count(nearest_autobahn_id, UKATEGORIE) %>% 
  spread(UKATEGORIE, n) %>%
  rename(Anzahl_UK1 = `1`,Anzahl_UK2 = `2`, Anzahl_UK3 = `3`) %>%
  replace(is.na(.), 0) %>%
  mutate(Anzahl_U_G = Anzahl_UK1 + Anzahl_UK2 + Anzahl_UK3)
```

Verbinden mit Daten:

```{r}
strecke_de = strecke_de |> 
    left_join(de_unfall_anzahl, by = c("rownumber" = "nearest_autobahn_id"))

strecke_de = strecke_de |>
  mutate(UD = (Anzahl_U_G)/(Sk_Laenge_km))
```

Plotten:

```{r}
ggplot () +
  geom_sf(data = d_de, fill = NA, size = 0.5) +
  geom_sf(data = strecke_de, size = 2, mapping = aes(color = Anzahl_U_G)) +
  scale_color_distiller(palette = 8 , direction = 1) +
  labs(title = "Anzahl der Verkehrsunfälle nach Abschnitten der BAB im Jahr 2022",
       color = "Anzahl Verkehrsunfälle") +
 theme(plot.title = element_text(size=10))
```

2.2.2 Unfallrate

2.2.2.1 A43

2.2.3 Deutschland