Roads & bike accidents

Making red dots

Berlin
Bike
2022
Open Data
Author

Néhémie Strupler

Published

March 22, 2022

After having a rough understanding of the data representing the road network (but see my warnings of yesterday), I am testing to merge the data concerning bike accidents with the map of the road.

Exhibit of the day

A map plot of accidents location over the road network

Show the code of the exhibit
library(sf)
library(dplyr)
library(ggplot2)
library(units)

# Load data road network
# "https://fbinter.stadt-berlin.de/fb/wfs/data/senstadt/s_vms_detailnetz_spatial_gesamt"

dsn$strassenkl <- factor(dsn$strassenkl)
dsn$strassenkl <- factor(dsn$strassenkl,
                            rev(levels(dsn$strassenkl)))
dsn$length <- st_length(dsn)

# Load data: crash
crash <-
  read.csv2("raw_data/AfSBBB_BE_LOR_Strasse_Strassenverkehrsunfaelle_2020_Datensatz.csv",
colClasses = c(rep("character", 3),
               rep("factor", 9),
               rep("integer", 6),
               rep("factor", 1),
               rep("numeric", 5)
))

colnames(crash) |> tolower() ->  colnames(crash)
crash[13:18] <- sapply(crash[13:18] , as.logical)
crash$umonat <- factor(crash$umonat, levels = 1:12)
levels(crash$umonat) <-
     format(seq.Date(as.Date('2000-01-01'), by = 'month', len = 12), "%b")
# Change name and reorder weekday
# 1 = Sonntag 2 = Montag 3 = Dienstag
# 4 = Mittwoch 5 = Donnerstag 6 = Freitag 7 = Samstag
levels(crash$uwochentag) <-
     format(seq.Date(as.Date('2000-01-02'), by = 'day', len = 7), "%a")
crash$uwochentag <- factor(crash$uwochentag,
                           levels(crash$uwochentag)[c(7,1:6)])
# Select Bike Crash
crash <- subset(crash, istrad == TRUE)
crash_longlat <- as.matrix(crash[c("xgcswgs84", "ygcswgs84")])
crash_geom <- sfheaders::sf_point(crash_longlat)
crash <- st_sf(cbind(crash[1:22], geom= st_geometry(crash_geom)))
st_crs(crash) <-  4326
crash <- st_transform(crash, st_crs(dsn))

# Berlin outline
lor <- st_read("raw_data/lor_planungsraeume_2021.gml")
colnames(lor)[1:6] |> tolower() ->  colnames(lor)[1:6]
lor$plr_id <- lor$plr_id |> as.factor()
subset(lor, select=-bez) -> lor
lor_outer <- st_as_sf(st_union(lor))

ggplot() +
  geom_sf(data = lor_outer,
          fill = "white") +
  geom_sf(data = dsn,
          col = "black",
          alpha = 0.5) +
  geom_sf(data = crash,
           col = "red",
          size = 0.3,
         alpha = 0.5) +
  theme_void() +
  labs(title = "Accidents involving a bike",
       subtitle = "Berlin / 2020",
      caption = "Data: Strassenverkehrsunfälle 2020 + Detailnetz - Straßenabschnitte \nCC BY Amt für Statistik Berlin-Brandenburg & Geoportal Berlin")

ggsave("2022-03-22_roads_bike_accidents.jpg",
       width = 7.0,
       height = 6,
       bg = "white",
       dpi = 220)

Data: Strassenverkehrsunfälle nach Unfallort in Berlin 2020 CC BY Amt für Statistik Berlin-Brandenburg + Detailnetz Straßenabschnitte CC BY Geoportal Berlin”.

Plot made with R, sf and ggplot2.