1 Leeswijzer

Met deze rapportage wordt de deelscore op het kenmerk ‘gescheiden voorziening voor fietsers’ van de SPI Veilige Infrastructuur beschikbaar gesteld. De rapportage bevat tevens de programmacode en biedt daarmee een verantwoording voor het bepalen van de deelscore vanuit de beschikbare data.

De lezer die op zoek is naar de deelscore vindt deze onder hoofdstuk 6, ‘Scores en Benchmark SPI Veilige Infrastructuur - kenmerk gescheiden voorziening voor fietsers’. De hoofdstukken daarvoor vormen de meer inhoudelijke en technische verantwoording om tot die score te komen. Deze verantwoording omvat tevens alle programmeercode voor het gepresenteerde resultaat.

2 Voorwoord programma code

Deze rapportage is opgemaakt als R Markdown document (.Rmd) met behulp van R in Rstudio. Het html-bestand is zelfstandig leesbaar. Het voorwoord is bedoeld voor personen die het script (het .Rmd bestand) willen draaien en/of geïnteresseerd zijn in de technische verantwoording van de bepaling van de kenmerkscore gescheiden voorziening voor fietsers van de SPI. Lezers van de rapportage (het html bestand) kunnen dit voorwoord verder overslaan.

Het voorwoord bevat de programmacode voor het controleren van de mappenstructuur, het installeren/inladen van de benodigde packages en het aanmaken van een aantal hulpvariabelen.

# list required libraries
libraries_to_load <- c("here", "tidyverse", "data.table", "dtplyr", "sf", "mapview", "stringr",
                       "this.path", "units", "kableExtra", "curl", "openxlsx2", "readr", "gt", 
                       "plotly", "qgisprocess", "future.apply", "writexl", "nngeo", "doParallel", 
                       "foreach", "lwgeom", "stplanr", "parallel")

# Install and load libraries if they are missing
for (library_name in libraries_to_load) {
  if (!requireNamespace(library_name, quietly = TRUE)) {
    install.packages(library_name, dependencies = TRUE, repos = "https://cloud.r-project.org/")
  }
  library(library_name, character.only = TRUE)
}

# unload here to reload it later after defining the location of the script and the relative path
# for the data downloads and outputs. 
detach("package:here", unload = TRUE)
# set locale naar nl in utf8 
Sys.setlocale("LC_ALL", "Dutch_Netherlands.utf8") 

Bij het runnen van het script (.rmd bestand) worden de benodigde data en resulterende outputs in mappen geplaatst in de map waar het script zich bevindt.

# Define a function for getting the relative path of the script based on the level of the subfolder
# relative to the folder where the script resides. With the script folder level = 0
relative_path_script <- function(level = 0) {
  # Split the string by "/"
  split_string <- stringr::str_split(this.path::this.path(), "/")[[1]]
  
  # Calculate the starting index for the nth part from the right
  start_index <- length(split_string) - level 
  
  # Check if the start_index is valid
  if (start_index == 1 || start_index > length(split_string)) {
    print("The value of level is absolute and not relative, thus not applicable for use with i_am")
  }
  
  # Check if the start_index is valid
  if (start_index < 1 || start_index > length(split_string)) {
    stop("The value of level is out of bounds for the given string.")
  }
  
  # Reconstruct the substring from the specified index
  subset_string <- paste(split_string[start_index:length(split_string)], collapse = "/")
  
  return(subset_string)
}
# Verwijs here naar de map waarin het script zelf staat met level = 0
here_locatie <- relative_path_script()

# 
here::i_am(here_locatie)

library(here)
# controleer de aanwezigheid van '.here'
if (!file.exists(here(".here"))) {    # If not, create the folder
  file.create(".here")
  cat(paste("Bestand '", ".here", "' aangemaakt.\n", sep = ""))
} else {
  cat(paste("Bestand '", ".here", "' bestaat al.\n", sep = ""))
}

De code gaat uit van een vaste mappenstructuur. Deze wordt gecontroleerd en aangemaakt als deze ontbreekt.

# folder structure
# Check list of folders
folder_list <- c("Data", "Output", "RDS")

# Check for folders and create missing folders
for (folder_name in folder_list) {
  if (!file.exists(here(folder_name))) {
    # If not, create the folder
  dir.create(here(folder_name))
  cat(paste("Folder '", folder_name, "' created.\n", sep = ""))
  } else {
  cat(paste("Folder '", folder_name, "' already exists.\n", sep = ""))
  }
}

Ten slotte worden een aantal hulpfuncties aangemaakt die in het script worden gebruikt.

# helper function to deal with missing values. Missing values as indexer are
# considered to be false.
na.as.false <- function(x){
  x[is.na(x)] <- FALSE
  x
}

na.as.true <- function(x){
  x[is.na(x)] <- TRUE
  x
}

# helper function for negate
`%nin%` = Negate(`%in%`)
blue_rgb <- c("39 42 102", "99 94 138",
              "136 130 164", "168 163 189",
              "206 203 217", "219 216 226")
blue_vals <- sapply(strsplit(blue_rgb, " "), function(x)
  rgb(x[1], x[2], x[3], maxColorValue=255))

orange_rgb <- c("216 87 44", "224 126 85",
                "233 164 130", "241 197 173",
                "247 224 210", "249 233 222")
orange_vals <- sapply(strsplit(orange_rgb, " "), function(x)
  rgb(x[1], x[2], x[3], maxColorValue=255))

green_rgb <- c("184 203 51", "204 215 115",
               "217 224 152", # 35% komt enkel bij groen voor
               "227 232 182", "231 235 191",
               "238 241 211", "245 247 231")
green_vals <- sapply(strsplit(green_rgb, " "), function(x)
  rgb(x[1], x[2], x[3], maxColorValue=255))

col_comb <- c(blue_vals[1], green_vals[2], orange_vals[3],
              blue_vals[4], green_vals[5], orange_vals[6], 
              blue_vals[2], green_vals[3], orange_vals[4])

long_list <- c(blue_vals[1:3], green_vals[1:3], orange_vals[1:3])
long_list_full <- c(blue_vals[1:6], orange_vals[1:6], green_vals[1:7] )
tabel_preview <- function(data, title = NULL, rows = 9, top_n = 7, bottom_n = 1, incl_rownums = TRUE) {

    gt_preview(data, top_n = top_n, bottom_n = bottom_n, incl_rownums = TRUE) %>%
    tab_header(title = title) %>%
    # Table background color and other style options
    tab_options(
      #table.background.color = blue_vals[6],
      column_labels.background.color = blue_vals[1],
      column_labels.font.size = px(16),
      table.font.size = px(12),
      data_row.padding = px(4)
      # Uncomment and set table.width if needed
      # table.width = px(250)
    ) %>%
    tab_style(
      style = cell_borders(sides = "bottom", color = blue_vals[1], weight = px(3)),
      locations = cells_body(rows = rows)
    )
}
scroltabel_gt <- function (data, title = NULL, table.height = px(350)) {
    gt(data) %>%
      # tabel titel
      tab_header(title = title) %>%
      # tabel opmaak opties
      tab_options(
        #table.background.color = blue_vals[6],
        column_labels.background.color = blue_vals[1],
        column_labels.font.size = px(16),
        table.font.size = px(12),
        data_row.padding = px(4),
        table.width = pct(100), # px(250)
        container.height = table.height,
        container.overflow.y =  TRUE # px(250)
      ) %>%
      # tabel opmaak optie onderkant
      tab_style(
        style = cell_borders(sides = "bottom", color = blue_vals[1], weight = px(3)),
        locations = cells_body(rows = nrow(data))
      )
}

3 Introductie

De SPI Veilige Infrastructuur bevat het kenmerk gescheiden voorziening voor fietsers. Menging van fietsers met motorvoertuigen of zwaar verkeer wordt op wegen met een snelheidslimiet van 50 km/uur, 70 km/uur of 80 km/uur als onveilig beoordeeld gelet op de kwetsbaarheid van fietsers. Fietsers dienen, indien aanwezig in een straat/weg, gebruik te kunnen maken van een vrijliggend fietspad of een parallelweg met een veilige snelheidslimiet. Deze rapportage beschrijft de bepaling van scores van de SPI Veilige Infrastructuur op dit kenmerk en de resultaten daarvan. Een wegvak scoort positief op dit kenmerk wanneer er de rijbaan gesloten is verklaard voor voor fietsers en/of wanneer een gescheiden voorziening voor fietsers aanwezig is. Daaronder vallen een vrijliggend fietspad of een parallelweg met een veilige snelheidslimiet. Per wegbeheerder wordt bepaald welk deel van het wegennet positief scoort. Dit vormt de score van de wegbeheerder op dit kenmerk. Deze score wordt bepaald over het voor dit kenmerk relevante deel van het wegennet.

Een verantwoording van de bepaling van scores wordt mede gegeven door het meeleveren van de programmacode waarmee deze scores zijn bepaald. Meer informatie over de SPI Infrastructuur is te vinden via de website van Aanpak SPV.

4 Data

In de analyse wordt gebruik gemaakt van het NWB (Nationaal Wegenbestand) en WKD (Wegkenmerkendatabase) data voor snelheidslimieten en verkeerstypen. Deze laatste dataset bevat informatie over geslotenverklaringen voor fietsers op basis van het verkeersbordenbestand. Na het vaststellen van de verkeerstypen zijn deze resultaten door het NDW (Nationaal Dataportaal Wegverkeer) vergeleken met de coderingen zoals beschikbaar in OSM (OpenStreetMap) en met de coderingen zoals beschikbaar in het netwerk (Routeplanner) van de Fietsersbond. Van het NWB worden zowel de wegen als de fietspaden gebruikt. Voor de fietspaden worden ook data gebruikt over de breedtelabels van fietspaden. Dit is openbare data van het NDW.

Documentatie over het NWB is te vinden bij het NDW: https://docs.ndw.nu/handleidingen/nwb/

Documentatie over de WKD is te vinden onder de download pagina van rijkswaterstaatdata https://downloads.rijkswaterstaatdata.nl/wkd/Documentatie/ en via het NDW op https://docs.ndw.nu/en/handleidingen/wkd/

Het update beleid kan verschillen tussen de WKD onderdelen. In ieder geval krijgt elk onderdeel een ‘grote’ jaarlijkse update gekoppeld aan het januari bestand van het NWB. Daarom worden bij het gebruik van de WKD de januari bestanden gebruikt. Deze updates komen in de loop van elk jaar binnen. Een planning daarvoor is nog niet beschikbaar. De laatste updates zijn te vinden op de WKD download-pagina en het NDW Verkeersveiligheid Dataportaal. Berichten hierover worden tevens geplaatst op het Nationaal Toegangspunt Mobiliteitsdata.

Verder wordt er ruimtelijke data gebruikt van de Basisregistratie Adressen en Gebouwen (BAG) en de topografische data van TOP10NL. Uit de BAG worden de gebouwen gebruikt en uit de TOP10NL data over wateroppervlakten.

4.1 Data downloads

4.1.1 NWB

# -------------KIES JAAR------------------------
# indien gewenst, kies een ander jaar, bijv 2025
# Jaar versie nwb
nwbjaar <- "2025"

# ----------------------------------------------

#' Deze code chunk bevat het jaar waarvan de data wordt gedownload en waarvoor de analyse wordt gedraaid. 
#' Het is niet mogelijk om de analyse op jaren voor 2024 te draaien vanwege beperkingen aan de datakwaliteit.
#' Nieuwe januari bestanden komen in de loop van 2025 beschikbaar. Wanneer deze beschikbaar komt,
#' kan het jaar worden aangepast.

De analyse is uitgevoerd op het NWB van januari 2025. Door het NWB-jaar (variabele ‘nwbjaar’) aan te passen in het script worden een aantal van de databronnen updatete naar de versie van dat jaar. Dit geldt echter niet voor de fietsintensiteiten data, de BAG en TOP10NL.

Het NWB is gedownload van: https://downloads.rijkswaterstaatdata.nl/nwb-wegen/geogegevens/shapefile/Nederland_totaal/

# Deze code chunk verzorgt de download en het inladen in R van het NWB. 

#' Wanneer het script eerder lokaal is gedraaid en het NWB al is gedownload en verwerkt wordt de .RDS
#' versie van het NWB geladen. Wanneer de RDS niet beschikbaar is, wordt het bestand gedownload en 
#' verwerkt.

# rds bestandsnaam op basis van jaar
nwb_rds_naam <- paste0("nwb", nwbjaar, "jan.sf.RDS")
# nwb datum op basis van jaar
nwb_datum <- paste0("01-01-", nwbjaar)
# zip bestandsnaam op basis van jaar
nwb_zip <- paste0("nwb", nwbjaar, "jan.zip")

# conditioneel laden of downloaden en verwerken van het NWB
if (file.exists(here("RDS", nwb_rds_naam))) {
  # if file exist load RDS
  nwb <- readRDS(here("RDS", nwb_rds_naam))
  cat(paste("Bestand geladen uit .RDS"))

  } else {

  # url for dutch open data
  nwbjaarjan_url <- paste0("https://downloads.rijkswaterstaatdata.nl/nwb-wegen/geogegevens/shapefile/Nederland_totaal/01-01-", nwbjaar, ".zip")

  # destination file + folder
  dest_file_nwbjaarjan <- here("Data", nwb_zip)
  dest_folder <- here("Data", paste0("nwb", nwbjaar, "jan"))

  # download file
  curl_download(nwbjaarjan_url, destfile = dest_file_nwbjaarjan, mode = "wb")

  # unzip
  unzip(dest_file_nwbjaarjan, exdir = dest_folder)

  # load the shapefile
  nwb <- st_read(here(dest_folder, nwb_datum, "Wegvakken", "Wegvakken.shp"))

  # Save as RDS
  saveRDS(nwb, here("RDS", nwb_rds_naam))

  # clear zip
  file.remove(dest_file_nwbjaarjan)
    
  # code resultaat bericht
  cat(paste("Bestand opgehaald van internet van https://downloads.rijkswaterstaatdata.nl/nwb-wegen/"))
  }

4.1.2 WKD

4.1.2.1 Snelheidslimieten

De analyse maakt gebruik van snelheidslimieten, gekoppeld aan het NWB, uit de WKD van januari 2025. Ook hier geldt dat door het NWB-jaar aan te passen in het script, de volledige analyse op een ander jaar kan worden gedraaid. De snelheidslimieten data is gedownload van: https://downloads.rijkswaterstaatdata.nl/wkd/Maximum%20Snelheden/

# Deze code chunk verzorgt de download en het inladen in R van de wkd snelheidslimieten 

#' Wanneer het script eerder lokaal is gedraaid en het NWB al is gedownload en verwerkt wordt de .RDS
#' versie van het bestand geladen. Wanneer de RDS niet beschikbaar is, wordt het bestand gedownload en 
#' verwerkt.

# rds bestandsnaam op basis van jaar
maxsnelheden_rds_naam <- paste0("maxsnelheden", nwbjaar, "jan.sf.RDS")
# nwb datum op basis van jaar
maxsnelheden_datum <- paste0("01-01-", nwbjaar)
# zip bestandsnaam op basis van jaar
maxsnelheden_zip <- paste0("maxsnelheden", nwbjaar, "jan.zip")

# conditioneel laden of downloaden en verwerken van de data
if (file.exists(here("RDS", maxsnelheden_rds_naam))) {
  # if file exist load RDS
  wkd_maxsnelheden <- readRDS(here("RDS", maxsnelheden_rds_naam))
  cat(paste("Bestand geladen uit .RDS"))
  } else {

  # url for dutch open data
  maxsnelhedenjaarjan_url <- paste0("https://downloads.rijkswaterstaatdata.nl/wkd/Maximum%20Snelheden/01-01-", nwbjaar, ".zip") 

  # destination file + folder
  dest_file_maxsnelhedenjaarjan <- here("Data", maxsnelheden_zip)
  dest_folder <- here("Data", paste0("maxsnelheden", nwbjaar,"jan"))

  # download file
  curl_download(maxsnelhedenjaarjan_url, destfile = dest_file_maxsnelhedenjaarjan, mode = "wb")

  # unzip
  unzip(dest_file_maxsnelhedenjaarjan, exdir = dest_folder)

  # load the shapefile
  wkd_maxsnelheden <- st_read(here(dest_folder, maxsnelheden_datum, "Snelheden.shp"))

  # Save as RDS
  saveRDS(wkd_maxsnelheden, here("RDS", maxsnelheden_rds_naam))

  # clear zip
  file.remove(dest_file_maxsnelhedenjaarjan)
    
  # code resultaat bericht
  cat(paste("Bestand opgehaald van internet van https://downloads.rijkswaterstaatdata.nl/wkd/"))
  }

4.1.2.2 Verkeerstypen

Om wegen te onderscheiden met een geslotenverklaring voor fietsers, heeft het NDW gebruik gemaakt van de het verkeersbordenbestand en de resultaat gecontroleeerd met de coderingen uit OSM en de Routeplannerdata van de Fietsersbond. Deze informatie is toegevoegd aan de WKD voor Verkeerstypen. De data uit de WKD van januari 2025 wordt gekoppeld aan het NWB. Hier geldt wederom dat door het NWB-jaar aan te passen in het script, de volledige analyse op een ander jaar kan worden gedraaid. De dataset is uitgebreid beschreven op NDW docs. De verkeerstypen-data zijn gedownload van: https://downloads.rijkswaterstaatdata.nl/wkd/Verkeerstypen/

# Deze code chunk verzorgt de download en het inladen in R van de wkd verkeerstypen 

#' Wanneer het script eerder lokaal is gedraaid en het NWB al is gedownload en verwerkt wordt de .RDS
#' versie van het bestand geladen. Wanneer de RDS niet beschikbaar is, wordt het bestand gedownload en 
#' verwerkt.

# rds bestandsnaam op basis van jaar
verkeerstypen_rds_naam <- paste0("verkeerstypen", nwbjaar, "jan.sf.RDS")
# nwb datum op basis van jaar
verkeerstypen_datum <- paste0("01-01-", nwbjaar)
# zip bestandsnaam op basis van jaar
verkeerstypen_zip <- paste0("verkeerstypen", nwbjaar, "jan.zip")

# conditioneel laden of downloaden en verwerken van de data
if (file.exists(here("RDS", verkeerstypen_rds_naam))) {
  # if file exist load RDS
  wkd_verkeerstypen <- readRDS(here("RDS", verkeerstypen_rds_naam))
  cat(paste("Bestand geladen uit .RDS"))
  } else {

  # url for dutch open data
  verkeerstypenjaarjan_url <- paste0("https://downloads.rijkswaterstaatdata.nl/wkd/Verkeerstypen/01-01-", nwbjaar, ".zip") 

  # destination file + folder
  dest_file_verkeerstypenjaarjan <- here("Data", verkeerstypen_zip)
  dest_folder <- here("Data", paste0("verkeerstypen", nwbjaar,"jan"))

  # download file
  curl_download(verkeerstypenjaarjan_url, destfile = dest_file_verkeerstypenjaarjan, mode = "wb")

  # unzip
  unzip(dest_file_verkeerstypenjaarjan, exdir = dest_folder)

  # load the csv file
  wkd_verkeerstypen <- read_csv2(here(dest_folder, verkeerstypen_datum, "wkd_035-VRKRSTPNV2.csv"))

  # Save as RDS
  saveRDS(wkd_verkeerstypen, here("RDS", verkeerstypen_rds_naam))

  # clear zip
  file.remove(dest_file_verkeerstypenjaarjan)
    
  # code resultaat bericht
  cat(paste("Bestand opgehaald van internet van https://downloads.rijkswaterstaatdata.nl/wkd/"))
  }

4.1.3 Ruimtelijke data

4.1.3.1 BAG

Voor deze analyse is data van gebouwen nodig, in dit geval polygonen. De data komt uit de Basisregistratie Adressen en Gebouwen (BAG). Hieronder worden de juiste layers ingeladen. Verderop wordt uitgelegd hoe deze data gebruikt worden.

if (file.exists(here("RDS", "bag_gebouwen.sf.RDS"))) {
  # if file exist load RDS
  bag_gebouwen <- readRDS(here("RDS", "bag_gebouwen.sf.RDS"))
  cat(paste("Bestand geladen uit .RDS"))

  } else {

  # url voor openbare data
  bag_gebouwen_url <- "https://service.pdok.nl/lv/bag/atom/downloads/bag-light.gpkg"

  # destination file + folder
  dest_file_bag_gebouwen <- here("Data", "bag-light.gpkg")
  dest_folder <- here("Data")

  # download file
  curl_download(bag_gebouwen_url, destfile = dest_file_bag_gebouwen, mode = "wb")

  # load the buildings gpkg layer
  bag_gebouwen <- st_read(dest_file_bag_gebouwen, layer = "pand")

  # Save as RDS
  saveRDS(bag_gebouwen, here("RDS", "bag_gebouwen.sf.RDS"))

  # clear zip
  file.remove(dest_file_bag_gebouwen)
  }
## Bestand geladen uit .RDS

4.1.3.2 TOP10NL

Voor deze analyse is data van wateroppervlakten nodig, ook polygonen. De data voor wateroppervlakten komt uit de TOP10NL data. Hieronder worden de juiste layers ingeladen. Verderop wordt uitgelegd hoe deze data gebruikt worden.

# wateroppervlakten inladen
if (file.exists(here("RDS", "top10nl_water_mpol.sf.RDS"))) {
  # if file exist load RDS
  # laad waterdelen
  top10nl_water_mpol <- readRDS(here("RDS", "top10nl_water_mpol.sf.RDS"))
  } else {

  # url for dutch open data
  top10nlgml_url <- "https://service.pdok.nl/brt/topnl/atom/downloads/top10nl-gml-nl-nohist.zip"

  # destination file + folder
  dest_file_top10 <- here("Data", "top10nl_gml.zip")
  dest_folder <- here("Data")

  # download top10nl
  curl_download(top10nlgml_url, destfile = dest_file_top10, mode = "wb")

  # unzip
  unzip(dest_file_top10, files = "top10nl_waterdeel.gml", exdir = dest_folder)

  # load the gml
  top10nl_water_gml <- st_read(here("Data", "top10nl_waterdeel.gml"))

  # subset polygons and multipolygons and cast all to the type MULTOPOLYGON
  top10nl_water_mpol <- top10nl_water_gml[st_geometry_type(top10nl_water_gml) %in% c("POLYGON", "MULTIPOLYGON"), ] %>%
    st_cast(., "MULTIPOLYGON") %>%
    # set crs 28992 RD new
    st_set_crs(., 28992)

  # Save as RDS
  saveRDS(top10nl_water_mpol, here("RDS", "top10nl_water_mpol.sf.RDS"))

  # clear zip
  file.remove(dest_file_top10)

  # clean
  rm(top10nl_water_gml)
  }

# registratiegebieden inladen
if (file.exists(here("RDS", "top10nl_reggebied_mpol.sf.RDS"))) {
  # if file exist load RDS
  # laad waterdelen
  top10nl_reggebied_mpol <- readRDS(here("RDS", "top10nl_reggebied_mpol.sf.RDS"))
  } else {

  # url for dutch open data
  top10nlgml_url <- "https://service.pdok.nl/brt/topnl/atom/downloads/top10nl-gml-nl-nohist.zip"

  # destination file + folder
  dest_file_top10 <- here("Data", "top10nl_gml.zip")
  dest_folder <- here("Data")

  # download top10nl
  curl_download(top10nlgml_url, destfile = dest_file_top10, mode = "wb")

  # unzip
  unzip(dest_file_top10, files = "top10nl_registratiefgebied.gml", exdir = dest_folder)

  # load the gml
  top10nl_reggebied_gml <- st_read(here("Data", "top10nl_registratiefgebied.gml"))

  # subset polygons and multipolygons and cast all to the type MULTOPOLYGON
  top10nl_reggebied_mpol <- top10nl_reggebied_gml[st_geometry_type(top10nl_reggebied_gml) %in% c("POLYGON", "MULTIPOLYGON"), ] %>%
    st_cast(., "MULTIPOLYGON") %>%
    # set crs 28992 RD new
    st_set_crs(., 28992)

  # Save as RDS
  saveRDS(top10nl_reggebied_mpol, here("RDS", "top10nl_reggebied_mpol.sf.RDS"))

  # clear zip
  file.remove(dest_file_top10)

  # clean
  rm(top10nl_reggebied_gml)
  }

4.1.4 Fietsintensiteiten

Als laatste worden de fietsintensiteiten en bijbehorende breedtelabels van NDW ingeladen. Verderop wordt uitgelegd waar deze voor gebruikt worden.

if (file.exists(here("RDS", "fietsintensiteiten.RDS"))) {
  # if file exist load RDS
  ndw_fietsintensiteiten <- readRDS(here("RDS", "fietsintensiteiten.RDS"))
  cat(paste("Bestand geladen uit RDS"))
  } else {

  # url for dutch open data
  fietsintensiteiten_url <- "https://opendata.ndw.nu/2023_fietsintensiteiten.zip"

  # destination file + folder
  dest_file_fietsintensiteiten <- here("Data", "fietsintensiteiten.zip")
  dest_folder <- here("Data", "fietsintensiteiten" )

  # download file
  curl_download(fietsintensiteiten_url, destfile = dest_file_fietsintensiteiten, mode = "wb")

  # unzip
  unzip(dest_file_fietsintensiteiten, exdir = dest_folder)

  # load the csv
  ndw_fietsintensiteiten <- st_read(here(dest_folder, "nwb_breedtelabels.gpkg"))

  # Save as RDS
  saveRDS(ndw_fietsintensiteiten, here("RDS", "fietsintensiteiten.RDS"))

  # clear zip
  file.remove(dest_file_fietsintensiteiten)
  }
## Bestand geladen uit RDS
#https://opendata.ndw.nu/2023_fietsintensiteiten.zip
#https://opendata.ndw.nu/

4.2 Data preparatie

De data dient te worden geprepareerd voorafgaand aan de analyses en bepaling van het kenmerk gescheiden voorziening voor fietsers van de SPI Veilige Infrastructuur. De preparatie bevat onder meer het koppelen van de verschillende datasets, het selecteren van de juiste wegvakken in het NWB en het aanmaken van transects.

4.2.1 NWB fietspaden

Na het inladen van de meest recente versie van het NWB kunnen hierin de fietspaden geselecteerd worden. Hier wordt de Baansubsoort-code (BST_CODE) voor gebruikt, welke het type wegvak specificeert (wegvak, fietspad etc.). De verschillende betekenissen van de BST_CODEs kan in de online handleiding gevonden worden: https://docs.ndw.nu/en/handleidingen/nwb/nwb-basisstructuur/baansubsoort/

De BST_CODE “FP” wordt gebruikt om fietspaden te selecteren.

nwb_fietspaden <- nwb %>%
  # selecteer alleen fietspaden
  filter(BST_CODE == "FP") %>%
  # selecteer aantal relevante variabelen
  select(WVK_ID, STT_NAAM, GME_NAAM, WPSNAAM, BST_CODE, RPE_CODE, RIJRICHTNG, WEGBEHSRT) %>%
  # bereken de wegvaklengte
  mutate(lengte_fietspad = as.numeric(st_length(.)))

4.2.2 Koppeling tussen NWB en WKD

Om de juiste data te kunnen analyseren, is het van belang om het NWB te koppelen aan de snelheidslimieten en de verkeerstypen. Voor de snelheidslimieten geldt dat we ons richten op wegen met een limiet van 50, 70 of 80 km/uur. Er zijn wegvakken waarop meerdere snelheidslimieten aanwezig zijn. Hiervoor bepalen we de maatgevende limiet door de snelheidslimiet te selecteren die op het grootste deel van het wegvak geldt. Voor verkeerstypen geldt dat we ons richten op een geslotenverklaring voor fietsers. Met een koppeling tussen deze databronnen kan deze filtering uitgevoerd worden.

# Eerst worden de snelheidslimieten uit de WKD aan het NWB gekoppeld op basis van de WVK_ID
nwb_snelheid <- nwb %>% 
  # we maken als eerste een variabele aan die de lengte van een wegvak weergeeft
  mutate(wvk_lengte = as.numeric(st_length(.))) %>% 
  #st_drop_geometry() %>% 
  left_join(select(st_drop_geometry(wkd_maxsnelheden), MAXSHD, VAN, NAAR, WVK_ID), "WVK_ID") %>% 
  # initiate dtplyr
  as.data.frame() %>%
  lazy_dt() %>%
  # vervolgens wordt bepaald op welk deel van een wegvak de snelheidslimiet geldt
  mutate(shd_lengte = NAAR - VAN) %>% 
  # met deze lengte wordt de maatgevende limiet vooor een wegvak bepaald, omdat een wegvak meerdere limieten kan hebben
  # Hiervoor groeperen we per WVK_ID en nemen we de snelheidlimiet die op het langste deel van het wegvak geldt
  group_by(WVK_ID) %>% 
  mutate(shd_maatgevend = MAXSHD[which.max(shd_lengte)]) %>% 
  # sorteer op lengte limiet
  arrange(desc(shd_lengte)) %>%
  # bewaar het record met de maximale lengte van de wkd limiet segmenten
  slice_head(n=1) %>%
  ungroup() %>%
  select(c(WVK_ID, JTE_ID_BEG, JTE_ID_END, WEGBEHSRT, BST_CODE, RIJRICHTNG, STT_NAAM, WPSNAAM, GME_NAAM,
           WEGBEHNAAM, MAXSHD, wvk_lengte, shd_lengte, shd_maatgevend, geometry)) %>%
  # stop dtplyr
  as.data.frame() %>%
  # herinitieer sf obv de geometry kolom
  st_sf()

# Als tweede wordt de informatie over geslotenverklaringen aan de hierboven aangemaakte dataset gekoppeld
nwb_snelheid_gesloten_fiets <- nwb_snelheid %>% 
  # Alleen gesloten verklarnig voor fietsers wordt meegenomen
  left_join(select(wkd_verkeerstypen, FIETS_H, FIETS_T, WVK_ID), "WVK_ID") %>%
  mutate(rijrichting = ifelse(RIJRICHTNG == "H" | RIJRICHTNG == "T", "eenrichting", "tweerichting")) %>%
  # filter op codes die we niet tot de rijbaan rekenen
  filter(BST_CODE %nin% c("FP", "VP", "CADO", "VZ", "VD", "VDA", "VDF", "VDV", "RP", "VV", "PP", "BVP"))

4.2.3 Filter snelheden en geslotenverklaring bepalen

Het uitgangspunt voor deze SPI is dat wegen met een 50, 70 en 80 km/u limiet een geslotenverklaring hebben voor fietsers. In deze stap worden de wegvakken met deze limieten geselecteerd. Daarnaast wordt een variabele aangemaakt die aangeeft of een wegvak een geslotenverklaring voor fietsers heeft. Op dit moment is per rijrichting bepaald of er een geslotenverklaring is. Er zijn echter situaties waarin de ene rijrichting wel gesloten is voor fietsers en de andere niet. In deze situaties wordt het gehele wegvak beschouwd als opengesteld voor fietsers omdat er tenminste in een rijrichting fietsers op de rijbaan rijden.

In deze analyse laten we wegvakken met de volgende BST_CODEs buiten beschouwing: “FP”, “VP”, “CADO”, “VZ”, “VD”, “VDA”, “VDF”, “VDV”, “RP”, “VV”, “PP”, “BVP”. Deze codes zijn gekozen om een aantal NA-probelemen met de koppeling van het NWB en WKD Verkeerstypen op te lossen.

nwb_50_70_80_gesloten_fiets <- nwb_snelheid_gesloten_fiets %>% 
  # filter snelheden
  filter(shd_maatgevend %in% c("50", "70", "80")) %>% 
  # creëer variabele voor geslotenverklaring met 1 = gesloten voor fieters
  mutate(gesloten_fiets = case_when(
    # beide richtingen gesloten voor fiets
    na.as.false(FIETS_H == "N") & na.as.false(FIETS_T == "N") ~ 1, 
    # 1 richting straat met heenrichting gesloten voor fiets en andere richting open of onbekend
    na.as.false(FIETS_H == "N") & na.as.true(FIETS_T == "J") & rijrichting == "eenrichting" ~ 1, 
    # 1 richting straat met terugrichting gesloten voor fiets en andere richting open of onbekend
    na.as.true(FIETS_H == "J") & na.as.false(FIETS_T == "N") & rijrichting == "eenrichting" ~ 1, 
    .default = 0
  ),
    # variabele om te testen welk verschil het meenemen van de rijtichtingen in het beoordelen van 
    # de gesloten verklaring maakt
    gesloten_fiets2 = case_when(
    # beide richtingen gesloten voor fiets
    na.as.false(FIETS_H == "N") & na.as.false(FIETS_T == "N") ~ 1, 
    .default = 0
  ))

 test_gesloten <- table(nwb_50_70_80_gesloten_fiets$gesloten_fiets, nwb_50_70_80_gesloten_fiets$rijrichting)
# test_gesloten
 
 test2_gesloten <- table(nwb_50_70_80_gesloten_fiets$gesloten_fiets2, nwb_50_70_80_gesloten_fiets$rijrichting)
# test2_gesloten

nwb_50_70_80_gesloten_fiets <- select(nwb_50_70_80_gesloten_fiets, -gesloten_fiets2)

4.2.4 Transects genereren

Transects zijn loodlijnen die op wegvakken geplaatst worden. In deze analyse zijn de loodlijnen 30 meter lang en worden ze om de 10 meter op een wegvak geplaatst. Met deze transects wordt gekeken of deze een vrijliggend fietspad of parallelweg naast een wegvak kruisen. Zo kan beoordeeld worden of er een vrijliggend fietspad of parallelweg met een veilige snelheidslimiet van 30 km/uur bij het wegvak hoort om deze informatie later toe te schrijven aan het betreffende wegvak.

4.2.4.1 Transects aanmaken

In deze stap worden transects aangemaakt die gebruikt worden in vervolgstappen. Deze stap duurt vaak lang omdat hij erg intensief is voor het geheugen. Geadviseerd wordt om een krachtige computer voor deze stap te gebruiken.

Transects zijn loodlijnen van 30 meter lang welke om de 10 meter aan beide kanten op een wegvak gezet worden. In vervolgstappen worden deze transects afgeknipt op plekken waar zich gebouwen of wateroppervlakten binnen 30 meter van het wegvak bevinden.

LET OP: Wees ervan bewust dat dit een intensieve en tijdrovende klus is.

# let op, dit script kan meerdere dagen nodig hebben

# We kijken eerst of de transects al eerder zijn aangemaakt
if (all(file.exists(here("RDS", c("transectsL.rds", "transectsR.rds"))))) {
  # if file exist load RDS
  transectsL <- readRDS(here("RDS", "transectsL.rds"))
  transectsR <- readRDS(here("RDS", "transectsR.rds"))
  cat(paste("Bestanden geladen uit .RDS"))

  #Zo niet, dan gaan we door met het aanmaken van de transects
  } else {

  # bepaal de gewenste transect lengte in m
  transect_lengte_benodigd <- 30
  # Bepaal de segmentlength waarin het wegvak wordt opgesplits. De afstand tussen transecten is tevens gelijk aan de segementlengte 
  segmentlengte <- 5
  # afstand waarover transects worden uitgezet vanaf het beginpunt van het wegvak gerekend
  transect_afstand <- 10
  # groepsgrootte van wegvaken die tegelijkertijd berekend worden
  groepsgrootte <- 50

  # creëer groepsid
  nwb_id <- nwb_50_70_80_gesloten_fiets %>%
    mutate(groupid = (row_number()-1) %/% groepsgrootte + 1) %>%
    relocate(geometry, last_col()) 

  # groepeer ids voor gelijktijdige berekening
  nwb_groupid <- unique(nwb_id$groupid)

  # Bepaal paralelle clusters voor foreach
  n.cores <- detectCores() - 2
  my.cluster <- makeCluster(n.cores, type = "PSOCK")
  registerDoParallel(my.cluster)

  transectsLR <- foreach(i = seq_along(nwb_groupid), #1:length(NWB_UTR_groupid)
                        .combine = function(...) rbindlist(list(...)),
                        .multicombine = TRUE,
                        .packages = c("dplyr", "sf", "nngeo", "lwgeom", "stplanr")) %dopar% {
    # initieer transects dataset
    transectsLR_par <- filter(nwb_id, groupid %in% nwb_groupid[i]) %>%
    # selecteer beperkte selectie aan variabelen
    #select(groupid, limiet, STT_NAAM, WPSNAAMNEN, WPSNAAM) %>%
    # Bepaal segmentlengte per wegvak voor hele wegvaklengte
    mutate(segmentlengte_wvkid = ifelse(wvk_lengte <= 50, wvk_lengte/2, segmentlengte)) %>%
    # Verdichting an wegvakken met vertices voor elk x meter per segmentlengte_wvkid, behalve als wegvakken korter of even lang als 50m zijn
    st_segmentize(., dfMaxLength = segmentlengte) %>%
    # splits het wegvak op basis van vertices
    st_segments() %>%
    # creëer segment ids per groep
    group_by(WVK_ID) %>%
    mutate(segmentID = row_number(),
           # Afstand van het startpunt van het wegvak naar de transect
           transect_sp_afstand = segmentlengte + (segmentID * segmentlengte)) %>%
    # Selecter segmentIDs 
    # Voor korte wegvakenn selecteer segmentID dichtbij het midden en op zijn minst de eerste 
    filter((wvk_lengte <= 50 & segmentID == max(round(wvk_lengte/2/segmentlengte),1)) |
             # Voor langere wegvakken selecteer segmentID's minimaal 25 meter van een node 
             (segmentID >= (25/segmentlengte)   &  
                segmentID <= round((wvk_lengte-25) / segmentlengte) & segmentID %% 5 == 0)
           ) %>%
    ungroup() %>%
    # Bepaal geometrie van de segmenten: beginpunt, eindpunt, middelpunt, oriëntatie
    mutate(XYcentrum = st_geometry(st_centroid(.)),  # middelpunt of centrum lijnsegment
           XYstart = st_startpoint(.),  # beginpunt lijnsegment
           XYend = st_endpoint(.),      # eindpunt lijnsegment
           # Bepaal de lijn oriëntatie met line_bearing. De functie bepaalt de hoek ten opzichte van een noordelijke
           # richting (0 graden) met een hoek tussen de -180 to 180 graden, waarbij een oostwaartse richting positief is
           # en een westwaardse richting negatief. De functie werkt niet met crs 28992, wel met 4326.
           orientatie = line_bearing(st_transform(., crs = 4326), bidirectional = FALSE),
           # Vorm een 360 graden hoek. hier vormen alle lijnen het beginpunt op het kruispunt. Dus van het kruispunt af
           hoek360 = case_when(
             orientatie >= 0 ~ orientatie,
             orientatie < 0 ~ orientatie + 360,
             TRUE ~ NA_real_
           ),
           lengte = as.numeric(st_length(.)),
           extend = transect_lengte_benodigd  #
           ) %>%
    rowwise() %>%
    # bepaal de ligging van de punten van de transects
    mutate(
      # door 90 graden bij de oriëntatie van het segment op te tellen zetten we het nieuwe punt haaks op het segment
      hoek = hoek360 + 90,
      R_Xend = XYcentrum[[1]][1] + extend * sin(hoek * pi / 180), # dX = sin(alpha) * extend
      R_Yend = XYcentrum[[1]][2] + extend * cos(hoek * pi / 180),
      L_Xend = XYcentrum[[1]][1] - extend * sin(hoek * pi / 180),
      L_Yend = XYcentrum[[1]][2] - extend * cos(hoek * pi / 180)) %>%
    ungroup()

  # creëer nieuwe XY start en eindpunt
  transectsLR_par$R_XYend <- st_geometry(st_as_sf(select(as.data.frame(transectsLR_par), R_Xend, R_Yend),
      coords = c("R_Xend", "R_Yend")))
  transectsLR_par$L_XYend <- st_geometry(st_as_sf(select(as.data.frame(transectsLR_par), L_Xend, L_Yend),
      coords = c("L_Xend", "L_Yend")))

  # initialiseer data frame met correct aantal rijen
  geom_transectLR <- data.frame(1:nrow(transectsLR_par))
  # crëer transects vanaf nieuwe begin- en eindpunten
  for (j in 1:nrow(transectsLR_par)) {
    pairL <- st_combine(c(st_set_crs(transectsLR_par$XYcentrum[j], 28992), st_set_crs(transectsLR_par$L_XYend[j], 28992)))
    lineL <- st_cast(pairL, "LINESTRING")
    geom_transectLR$geom_transectL[j] <- st_geometry(lineL)
    pairR <- st_combine(c(st_set_crs(transectsLR_par$XYcentrum[j], 28992), st_set_crs(transectsLR_par$R_XYend[j], 28992)))
    lineR <- st_cast(pairR, "LINESTRING")
    geom_transectLR$geom_transectR[j] <- st_geometry(lineR)
  }

  # creëer sf om een goede geometrie kolom te krijgen
  geom_transectL <- st_sf(select(geom_transectLR, geom_transectL)) %>%
    st_set_crs(28992)
  geom_transectR <- st_sf(select(geom_transectLR, geom_transectR)) %>%
    st_set_crs(28992)

  # Voeg nieuwe geometrie kolom to aan originele dataset
  transectsLR_par$geom_transectL <- geom_transectL$geom_transectL
  transectsLR_par$geom_transectR <- geom_transectR$geom_transectR

  # resultaat per iteratie

  # Sommige opdrachten leveren geen hits op. We willen geen lege objecten als resultaat opvoeren omdat daarmee
  # conflicten tussen variabelen typen ontstaan. Daarom gebruiken we rm() om object bij return te verwijderen
  if (nrow(transectsLR_par) == 0) {
    NULL
    } else {
      transectsLR_par
      }

  }

  # Merk de nieuwe geometrie kolom aan als geom kolom in aparte transectL en transectR objecten
  transectsL <- as.data.frame(transectsLR) %>%
  st_sf(., sf_column_name = "geom_transectL", crs = 28992) #%>%
  #select(-geom)

  transectsR <- as.data.frame(transectsLR) %>%
  st_sf(., sf_column_name = "geom_transectR", crs = 28992) #%>%
  #select(-geom)

  rm(geom_transectL, geom_transectR, transectsLR)

  # Beëindig parallel cluster
  stopCluster(cl = my.cluster)

  # Opslaan voor later gebruik
  saveRDS(transectsL, here("RDS", "transectsL.RDS"))
  saveRDS(transectsR, here("RDS", "transectsR.RDS"))
    
  }
## Bestanden geladen uit .RDS

Voordat de transects in de volgende stap afgeknipt worden bekijken we eerst of het berekenen van de transects goed is gegaan. Dit doen we voor één gemeente.

# Selecteer NWB in IJsselstein
nwb_gemeente_50plus <- nwb_snelheid_gesloten_fiets %>% 
  filter(GME_NAAM == "IJsselstein" & MAXSHD %in% c("50", "70", "80"))

nwb_gemeente_30min <- nwb_snelheid_gesloten_fiets %>% 
  filter(GME_NAAM == "IJsselstein" & MAXSHD %in% c("15", "30"))

# Selecteer fietspaden in IJsselstein
nwb_fietspaden_gemeente <- nwb_fietspaden %>% 
  filter(GME_NAAM == "IJsselstein")

# Filter transects voor gemeente IJsselstein
transectsL_gemeente <- transectsL %>% 
  filter(GME_NAAM == "IJsselstein")
transectsR_gemeente <- transectsR %>% 
  filter(GME_NAAM == "IJsselstein")

mapview(nwb_gemeente_50plus, color = "purple") +
  mapview(nwb_gemeente_30min, color = "black") +
  mapview(nwb_fietspaden_gemeente, color = "orange") +
  mapview(transectsL_gemeente, color = "blue") +
  mapview(transectsR_gemeente, color = "red")
# # Selecteer NWB in Utrecht
# nwb_utr <- nwb_snelheid_gesloten_fiets %>% 
#   filter(GME_NAAM == "Utrecht")
# 
# # Selecteer fietspaden in Utrecht
# nwb_fietspaden_utr <- nwb_fietspaden %>% 
#   filter(GME_NAAM == "Utrecht")
# 
# # Filter transects voor gemeente Utrecht
# transectsL_utr <- transectsL %>% 
#   filter(GME_NAAM == "Utrecht")
# transectsR_utr <- transectsR %>% 
#   filter(GME_NAAM == "Utrecht")
# 
# mapview(nwb_utr, color = "black") +
#   mapview(nwb_fietspaden_utr, color = "orange") +
#   mapview(transectsL_utr, color = "blue") +
#   mapview(transectsR_utr, color = "red")

4.2.4.2 Transects afknippen

In deze stap worden de hiervoor geproduceerde transects afgeknipt bij gebouwen en wateroppervlakten die binnen 30 meter van het wegvak liggen. Voor deze verwerking is QGIS nodig, waarvoor we een R pakket gebruiken wat het mogelijk maakt om QGIS tools te gebruiken in de R omgeving. In dit geval is het de difference tool.

Met de volgende codechunk worden de transects afgeknipt bij gebouwen en wateroppervlakten die binnen 30 meter van het wegvak liggen waarop de transects aansluiten. Hiervoor gebruiken we de QGIS tool.

# Voordat we de wateroppervlakten kunnen gebruiken maken we er eerst polygonen ipv mult polygonen van
top10nl_water <- top10nl_water_mpol %>% 
   st_cast("POLYGON") %>% 
   select(-c(naamNL, naamFries))

# We kijken eerst of de transects al eerder zijn afgeknipt
if (all(file.exists(here("RDS", c("transectsL_gebouw.rds", "transectsR_gebouw.rds",
                                  "transectsL_water.rds", "transectsR_water.rds"))))) {
    # if file exist load RDS
    transectsL_gebouw <- readRDS(here("RDS", "transectsL_gebouw.rds"))
    transectsR_gebouw <- readRDS(here("RDS", "transectsR_gebouw.rds"))
    transectsL_water <- readRDS(here("RDS", "transectsL_water.rds"))
    transectsR_water <- readRDS(here("RDS", "transectsR_water.rds"))
    cat(paste("Bestanden geladen uit .RDS"))

  #Zo niet, dan gaan we door met het afknippen van de transects
  } else {
    
    # Bepaal paralelle clusters voor foreach
    n.cores <- 6
    my.cluster <- makeCluster(n.cores, type = "PSOCK")
    registerDoParallel(my.cluster)
        
    # Zet parameters in een lijst zodat je die in foreach kunt itereren
    jobs <- list(
      list(input = transectsL, overlay = bag_gebouwen),
      list(input = transectsR, overlay = bag_gebouwen),
      list(input = transectsL, overlay = top10nl_water),
      list(input = transectsR, overlay = top10nl_water)
    )
    
    
    # Run parallel jobs
    results <- foreach(job = jobs, .packages = c("qgisprocess", "sf", "dplyr")) %dopar% {
      job$input %>%
        qgis_run_algorithm_p(
          algorithm = "native:difference",
          OVERLAY = job$overlay
        ) %>%
        st_as_sf(.)
    }
        
    # Beëindig parallel cluster
    stopCluster(cl = my.cluster)
        
    # Zet resultaten in aparte variabelen als je wilt
    transectsL_gebouw <- results[[1]]
    transectsR_gebouw <- results[[2]]
    transectsL_water  <- results[[3]]
    transectsR_water  <- results[[4]]
    
    # Save as RDS
    saveRDS(transectsL_gebouw, here("RDS", "transectsL_gebouw.rds"))
    saveRDS(transectsR_gebouw, here("RDS", "transectsR_gebouw.rds"))
    saveRDS(transectsL_water, here("RDS", "transectsL_water.rds"))
    saveRDS(transectsR_water, here("RDS", "transectsR_water.rds"))

}

De resulterende lijnen zijn van het geometrie type multilinestring. Dit betekent dat meerdere stukjes van de transects - welke het resultaat zijn van het uitknippen van stukken van de transects - gezien worden als een multiline string. Deze kunnen opgesplitst worden naar enkele line strings met st_cast. Omdat de tekenrichting van de transects en de volgorde de knippunten bewaard is gebleven, betreft het eerste lijnstuk van een opgeknipte transect altijd het deel dat start bij het wegvak. Dit eerste lijnstuk wordt vervolgens bewaard.

Onderstaande kaart toont een voorbeeld van opgeknipte transects langs een watergang, waarvan het lijnstuk dat bij het wegvak begint zal worden bewaard.

mapview(filter(nwb_gemeente_50plus, WVK_ID == 600772287), color = "purple", basemaps = c(
  "Esri.WorldImagery",        # This will be the default shown
  "OpenStreetMap",
  "CartoDB.Positron",
  "CartoDB.DarkMatter"
)) +
  mapview(filter(transectsL_water, WVK_ID == 600772287), color = "blue")

Het verwerken van de transects naar links die afgeknipt zijn bij gebouwen gebeurt als volgt:

# bepaal de geometry kolomnaam
geometryname <- attr(transectsL_gebouw, "sf_column")

# verwerk trasects L geknipt op gebouw polygonen
transectsL_gebouw_first <- transectsL_gebouw %>%
  # use dtplyr
  lazy_dt() %>%
  arrange(GME_NAAM, WPSNAAM, WVK_ID) %>%
  # creëer een id voor transects vooraf aan het splitsen
  mutate(ID_WVK_SEGMENT = paste0(WVK_ID,"_", segmentID, "_L"),) %>%
  # some grouping and arranging
  group_by(WVK_ID) %>%
  arrange(segmentID, .by_group = TRUE) %>%
  ungroup() %>%
  # revert back to sf
  as.data.frame() %>%
  st_sf() %>%
  # cast naar linestring
  st_cast(., "LINESTRING") %>%
  # use dtplyr
  lazy_dt() %>%
  # groepeer op transect id
  group_by(ID_WVK_SEGMENT) %>%
  # behoud het eerste transect deel dat aan het wegvak zit
  slice_head(n=1) %>%
  ungroup() %>%
  as.data.frame() %>%
  st_sf() %>%
  # bepaal de nieuwe transect lengte
  mutate(lengte_transect = st_length(.),
         transect_side = "L",
         transect_split_object = "gebouw") %>%
  # selection of variables
  select(ID_WVK_SEGMENT, WVK_ID, groupid, STT_NAAM, GME_NAAM, WPSNAAM, MAXSHD, wvk_lengte, shd_lengte,
         shd_maatgevend, FIETS_H, FIETS_T, gesloten_fiets, lengte_transect, transect_sp_afstand, 
         transect_side, transect_split_object)

En voor rechts:

# bepaal de geometry kolomnaam
geometryname <- attr(transectsL_gebouw, "sf_column")

# verwerk trasects R geknipt op gebouw polygonen
transectsR_gebouw_first <- transectsR_gebouw %>%
  # use dtplyr
  lazy_dt() %>%
  arrange(GME_NAAM, WPSNAAM, WVK_ID) %>%
  # creëer een id voor transects vooraf aan het splitsen
  mutate(ID_WVK_SEGMENT = paste0(WVK_ID,"_", segmentID, "_R"),) %>%
  # some grouping and arranging
  group_by(WVK_ID) %>%
  arrange(segmentID, .by_group = TRUE) %>%
  ungroup() %>%
  # revert back to sf
  as.data.frame() %>%
  st_sf() %>%
  st_cast(., "LINESTRING") %>%
  # use dtplyr
  lazy_dt() %>%
  # groepeer op trasnect id
  group_by(ID_WVK_SEGMENT) %>%
  # behoud het eerste transect deel dat aan het wegvak zit
  slice_head(n=1) %>%
  ungroup() %>%
  # revert back to sf
  as.data.frame() %>%
  st_sf() %>%
  # bepaal de nieuwe transect lengte
  mutate(lengte_transect = st_length(.),
         transect_side = "R",
         transect_split_object = "gebouw") %>%
  # selection of variables
  select(ID_WVK_SEGMENT, WVK_ID, groupid, STT_NAAM, GME_NAAM, WPSNAAM, MAXSHD, wvk_lengte, shd_lengte,
         shd_maatgevend, FIETS_H, FIETS_T, gesloten_fiets, lengte_transect, transect_sp_afstand, 
         transect_side, transect_split_object)

Het verwerken van de transects naar links die afgeknipt zijn bij water gebeurt als volgt:

# verwerk trasects L geknipt op water polygonen
transectsL_water_first <- transectsL_water %>%
  # use dtplyr
  lazy_dt() %>%
  arrange(GME_NAAM, WPSNAAM, WVK_ID) %>%
  # creëer een id voor transects vooraf aan het splitsen
  mutate(ID_WVK_SEGMENT = paste0(WVK_ID,"_", segmentID, "_L"),) %>%
  # some grouping and arranging
  group_by(WVK_ID) %>%
  arrange(segmentID, .by_group = TRUE) %>%
  ungroup() %>%
  # revert back to sf
  as.data.frame() %>%
  st_sf() %>%
  st_cast(., "LINESTRING") %>%
  # use dtplyr
  lazy_dt() %>%
  # groepeer op trasnect id
  group_by(ID_WVK_SEGMENT) %>%
  # behoud het eerste transect deel dat aan het wegvak zit
  slice_head(n=1) %>%
  ungroup() %>%
  # revert back to sf
  as.data.frame() %>%
  st_sf() %>%
  st_cast(., "LINESTRING") %>%
  # bepaal de nieuwe transect lengte
  mutate(lengte_transect = st_length(.),
         transect_side = "L",
         transect_split_object = "water") %>%
  # selection of variables
  select(ID_WVK_SEGMENT, WVK_ID, groupid, STT_NAAM, GME_NAAM, WPSNAAM, MAXSHD, wvk_lengte, shd_lengte,
         shd_maatgevend, FIETS_H, FIETS_T, gesloten_fiets, lengte_transect, transect_sp_afstand, 
         transect_side, transect_split_object)

En voor rechts:

# verwerk trasects R geknipt op water polygonen
transectsR_water_first <- transectsR_water %>%
  # use dtplyr
  lazy_dt() %>%
  arrange(GME_NAAM, WPSNAAM, WVK_ID) %>%
  # creëer een id voor transects vooraf aan het splitsen
  mutate(ID_WVK_SEGMENT = paste0(WVK_ID,"_", segmentID, "_R"),) %>%
  # some grouping and arranging
  group_by(WVK_ID) %>%
  arrange(segmentID, .by_group = TRUE) %>%
  ungroup() %>%
  # revert back to sf
  as.data.frame() %>%
  st_sf() %>%
  st_cast(., "LINESTRING") %>%
  # use dtplyr
  lazy_dt() %>%
  # groepeer op trasnect id
  group_by(ID_WVK_SEGMENT) %>%
  # behoud het eerste transect deel dat aan het wegvak zit
  slice_head(n=1) %>%
  ungroup() %>%
  # revert back to sf
  as.data.frame() %>%
  st_sf() %>%
  # bepaal de nieuwe transect lengte
  mutate(lengte_transect = st_length(.),
         transect_side = "R",
         transect_split_object = "water") %>%
  # selection of variables
  select(ID_WVK_SEGMENT, WVK_ID, groupid, STT_NAAM, GME_NAAM, WPSNAAM, MAXSHD, wvk_lengte, shd_lengte,
         shd_maatgevend, FIETS_H, FIETS_T, gesloten_fiets, lengte_transect, transect_sp_afstand, 
         transect_side, transect_split_object)

4.2.4.3 Transects combineren

De sets van transects naar links en naar rechts kunnen gecombineerd worden. Daarna is het mogelijk om voor elke transect id (ID_WVK_SEGTMENT) de kortste te pakken.

Eerst worden alle transects samengevoegd:

# voeg alle transects samen in een object
transect_bind <- rbindlist(list(transectsL_gebouw_first, transectsL_water_first, 
                                transectsR_gebouw_first, transectsR_water_first)) %>%
  as.data.frame()

Vervolgens wordt van elk paar van transects de kortste geselecteerd.

# We kijken eerst of de korste al eerder zijn geselecteerd
if (file.exists(here("RDS", "transects_trimmed.rds"))) {
  
  # Laad bestand uit .rds
  transects <- readRDS(here("RDS", "transects_trimmed.rds"))
  cat(paste("Bestand geladen uit .rds"))
  
  # Zo niet, dan voeren we de rest van de chunk uit
} else {
  
  transects <- transect_bind %>% 
  # gebruik dtplyr
  lazy_dt() %>%
  mutate(istrimmed = ifelse(round(as.numeric(lengte_transect),1) == 30,FALSE, TRUE),
         lengte_transect = round(as.numeric(lengte_transect),1)) %>%
  arrange(GME_NAAM, WPSNAAM, WVK_ID, ID_WVK_SEGMENT) %>%
  # groepeer transects per ID_WVK_SEGMENT
  group_by(ID_WVK_SEGMENT) %>%
  # sorteer elke transect groep van kort naar lang
  arrange(lengte_transect, .by_group = TRUE) %>%
  # behoud de kortste transect op basis van transect lengte
  slice_head(n=1) %>%
  ungroup() %>%
  mutate(type_trimmed = ifelse(istrimmed, transect_split_object, "not trimmed")) %>%
  relocate(geom, last_col()) %>%
  # terug naar df sf
  as.data.frame() %>%
  st_sf()

  # Opslaan voor later gebruik
  saveRDS(transects, here("RDS", "transects_trimmed.RDS"))  
  
}
## Bestand geladen uit .rds

Ook van dit resultaat kunnen we een voorbeeld tonen. Op het voorbeeld is te zien dat de transects zijn afgesneden op de gebouwen en het water. Let op, door het perspectief lijken de transects minder scherp afgesneden.

# Set the full list of basemaps, with your preferred one first
mapviewOptions(
  basemaps = c("Esri.WorldImagery", # shown initially
                "CartoDB.Positron",        
               "OpenStreetMap",
               "CartoDB.DarkMatter")
)

nwb_voorbeeld <- filter(nwb_gemeente_50plus, WVK_ID == 600771716)
transects_voorbeeld <- filter(transects, WVK_ID == 600771716)

mapview(nwb_voorbeeld, color = "purple") +
  mapview(transects_voorbeeld, color = "blue")

4.2.5 Splitsen van transects bij fietspaden

In deze stap worden de in de vorige stap gecreëerde transects gesplitst bij vrijliggende fietspaden. Door de transects te splitsen bij fietspaden kan achterhaald worden welke transects een fietspad kruisen en op welke afstand dit gebeurt.

fietspad <- nwb_fietspaden %>%
  left_join(st_drop_geometry(select(ndw_fietsintensiteiten, wvk_id, fietstype, breedte, rijrichtng, os_int_kl)), by = join_by(WVK_ID == wvk_id))

Eerst maken we een functie aan om het splitsen sneller te laten verlopen.

# Creëer functie voor sneller splitsen
st_split_faster <-  function(x,y,...){

# first subset x and y to where they intersect
y_subset <- y[x, , op = st_intersects]
x_subset <- x[y, , op = st_intersects]

st_split(x_subset, y_subset,...)
}

Vervolgens bepalen we welke transects kruisen met een fietspad. Dit gebeurt parallel per gemeente.

# We kijken eerst of de deze chunk al eerder is uitgevoerd
if (file.exists(here("RDS", "transects_join_fietspaden.RDS"))) {
  
  # Laad eerder aangemaakte .rds
  transects_join_fietspaden <- readRDS(here("RDS", "transects_join_fietspaden.RDS"))
  cat(paste("Bestand geladen uit .RDS"))
  
  # Zo niet, dan voeren we de chunk verder uit
} else {
  
  time15 <- Sys.time()

  # vector voor subset van gemeenten
  #i_vector <- c(1:342)
  # unique(transects$GME_NAAM)[294] : Schiermonnikoog gives an error and is left out of the calculations

  gemeente_lijst <- unique(transects$GME_NAAM)

  # Define parallel cluster for foreach
  n.cores <- detectCores() - 2
  my.cluster <- makeCluster(n.cores, type = "PSOCK")
  registerDoParallel(my.cluster)

  transects_join_fietspaden <- foreach(i = seq_along(gemeente_lijst),
                        .combine = function(...) rbindlist(list(...)),
                        .multicombine = TRUE,
                        .packages = c("dplyr", "sf", "lwgeom", "data.table")) %dopar% {
                         # initieer transects dataset

    # subset fietspaden per gemeente
   fietspaden_subset <- fietspad %>%
      filter(GME_NAAM == gemeente_lijst[i]) %>%
      select(WVK_ID, STT_NAAM, lengte_fietspad, fietstype, breedte, rijrichtng, os_int_kl) %>%
      rename(STT_NAAM_fp = STT_NAAM, WVK_ID_fp = WVK_ID, fp_rijrichting = rijrichtng, fp_breedte = breedte,
             fp_type = fietstype, fp_intensiteitsklasse = os_int_kl)
    
    # subset transects per gemeente
    transects_subset <- filter(transects, GME_NAAM == gemeente_lijst[i])  
    
    # voer st_split uit voor transpects per fietspad
    transects_i_split <- st_split_faster(transects_subset, fietspaden_subset)
    
    # zet resultaten van st_split om in lijn geometire en behoud elke eerste transect van ID_WVK_SEGMENT
    a <- transects_i_split %>%
      # st_plit creëert een geometrie collectie. De lijn geometrieën moeten we extracten
      st_collection_extract(., type = "LINESTRING") %>%
      # groepeer per ID_WVK_SEGMENT en behoud eerste transect. Dit is degene die begint bij het wegvak
      group_by(ID_WVK_SEGMENT) %>%
      # mutate(id_count = n()) %>%
      # filter(id_count >1) %>%
      slice_head(n=1) %>%
      ungroup() %>%
      st_sf() %>%
      mutate(fietspad_intersect = TRUE,
             fietspad_afst = round(as.numeric(st_length(.)),1)) %>%
      relocate(geom, .after = last_col())
    
    # subset alle transects b set door filter van transects per ID_WVK_SEGMENT uit a
    b <- transects_subset %>%
      filter(ID_WVK_SEGMENT %nin% a$ID_WVK_SEGMENT) %>%
      mutate(fietspad_intersect = FALSE,
             fietspad_afst = NA_real_ ) %>%
      relocate(geom, .after = last_col())
    
    
    transects_i_trim_fietspad <- rbindlist(list(a,b)) %>%
      relocate(geom, .after = last_col()) %>%
      st_sf()
    
    transects_fietspad_join <- transects_i_trim_fietspad %>%
      filter(fietspad_intersect) %>%
      select(ID_WVK_SEGMENT) %>%
      st_buffer(., 0.001) %>%
      st_join(., fietspaden_subset, suffix = c("",".ct")) %>%
      st_drop_geometry() %>%
      right_join(transects_i_trim_fietspad) %>%
      relocate(WVK_ID_fp:type_trimmed, .after = last_col()) %>%
      mutate(type_trimmed = ifelse(is.na(fp_type), type_trimmed, "fietspad")) %>%
      relocate(geom, .after = last_col())

    # resultaten per iteratie
    
    # Sommige opdrachten leveren geen hits op. We willen geen lege objecten als resultaat opvoeren omdat daarmee
    # conflicten tussen variabelen typen ontstaan. Daarom gebruiken we rm() om object bij return te verwijderen
    if (nrow(transects_fietspad_join) == 0) {
      NULL
    } else {
      transects_fietspad_join
    }                         
                         
  }

  time16 <- Sys.time()
  timer15 <- time16 - time15


  # Beëindig parallel cluster
  stopCluster(cl = my.cluster)

  #rm(a,b)
  print(timer15)

  # save results
  saveRDS(transects_join_fietspaden, here("RDS", "transects_join_fietspaden.RDS"))
  st_write(transects_join_fietspaden, here("Output", "transects_join_fietspaden.gpkg"), append = FALSE, delete_dsn = TRUE)
  
}

4.2.6 Join transects met wegvakken

Als laatste worden de transects aan de wegvakken gekoppeld. Dit wordt gedaan om te kunnen bepalen of er een voor de fiets geschikte voorziening aanwezig is. In de analyse gaat het daarbij om parallelwegen met een limiet van 60 km/uur (ETW bubeko), parallelwegen met een limiet van 30 km/uur en lager of parallelwegen met een vrijliggend fietspad. Wegen met een limiet van 30 of 60 zijn niet getoetst op de aanwezigheid van een fietspad. Tenslotte zal ook worden beoordeeld of parallele rijbanen met eenzelfde straatnaam een vrijliggend fietspad hebben. Wanneer op een parallele rijbaan B (langs rijbaan A) een fietspad gedetecteerd wordt, dan zal deze informatie worden toegevoegd aan rijbaan A.

Hier wordt allereerst de join tussen transects en wegvakken uitgevoerd. De verwerking daarvan in de hierboven beschreven analyse volgt in de volgende paragrafen.

Bij het uitvoeren van de join wordt enkel naar twee groepen wegvakken gekeken. De eerste groep betreft wegvakken met een straatnaam die in de transects voorkomen. De tweede groep betreft wegvakken die in het NWB zijn geregistreerd als parallelweg (BST_CODE is PAR of VWG). Hiervoor zijn twee redenen. De eerste is dat de kans hiermee wordt verkleind dat transects worden gekoppeld aan wegvakken die geen parallelweg betreffen, maar de transects wel snijden (hier zijn verschillende oorzaken voor mogelijk). De tweede reden is dat een filtering van wegvakken de join aanzienlijk versnelt in R. Deze keuze leidt naar verwachting tot minder vals positieven (identificeren van een parallelweg, terwijl die er in werkelijkheid niet is), maar tegelijkertijd ook tot meer vals negatieven (het missen van een parallelweg die er wel is). Het missen van een parallelweg via deze route komt voor wanneer de parallelweg een straatnaam heeft die niet voorkomt in de lijst straatnamen die uit de set transects wordt gehaald en deze in het NWB niet is geregistreerd als parallelweg. De impact van het deze vals negatieven wordt vooralsnog als beperkt ingeschat omdat er meerdere mechanismen zijn om een weg met een limiet van 50, 70 of 80 km/uur positief te beoordelen op dit kenmerk van de SPI.Een wegvak met limiet 50, 70 of 80 zal verderop namelijk positief worden beoordeeld als;

  • is vastgelegd dat deze een gesloten verklaring heeft voor fietsers,
  • of op basis van de GIS analyse een parallel fietspad is geïdentificeerd,
  • of op basis van de GIS analyse een voor fietsers positief beoordeelde parallele rijbaan is geïdentificeerd met de volgende eigenschappen
    • een parallel wegvak met een lagere limiet en een registratie in het NWB als parallelweg
    • een parallel wegvak met een lagere limiet en dezelfde straatnaam als de hoofdrijbaan

Nadere analyses zijn nodig om ook joins met parallele wegvakken met een andere straatnaam die niet als parallelweg zijn geregistreerd mee te kunnen nemen. Daarbij gaat het om een optimalisatie van de join en een analyse van vals positieven en negatieven. Dit paste niet meer binnen de voor deze opdracht beschikbare tijd.

# We kijken eerste of de join al eerder is uitgevoerd
if (file.exists(here("RDS", "transects_parallelwegen.rds"))) {
  
  # Laad de .rds
  transects_parallelwegen <- readRDS(here("RDS", "transects_parallelwegen.rds"))
  cat(paste("Bestand geladen uit .rds"))
  
  # Zo niet, dan voeren we de join uit
} else {
  
  time11 <- Sys.time()

  # groepsgroote van wegvakken om berekeningen in parallel te doen
  groupsize <- 1000 

  transects_regrouped <- transects %>%
  arrange(GME_NAAM, WPSNAAM) %>%
  mutate(regroupid = (row_number()-1) %/% groupsize + 1) %>%
  st_sf()

  gemeente_lijst_fixed <- unique(filter(transects_regrouped)$GME_NAAM)#, GME_NAAM != "Schiermonnikoog")$GME_NAAM)

  gemeente_lijst <- gemeente_lijst_fixed # [340:341]

  # Define parallel cluster for foreach
  n.cores <- detectCores() - 2
  #n.cores <- 2
  my.cluster <- makeCluster(n.cores, type = "PSOCK")
  registerDoParallel(my.cluster)

  transects_parallelwegen <- foreach(i = seq_along(gemeente_lijst),
                       .combine = function(...) rbindlist(list(...)),
                       .multicombine = TRUE,
                       .packages = c("dplyr", "sf", "data.table")) %dopar% {
    # creëer een stratenlijst per iteratie i                    
    regroupid  <-   unique(filter(transects_regrouped, GME_NAAM == gemeente_lijst[i])$regroupid)    
    
    
    for (j in c(0,regroupid)){
        # creëer object f bij iteratie nul
        if (j==0){f <- list()}
        # voer spatial join uit op straatnaam voor iteratie 1:aantal straten
        else{
          # subset transects per gemeente en straatnaam
          c <- transects_regrouped %>%
            filter(GME_NAAM == gemeente_lijst[i] & regroupid == j)# %>%
            #filter(regroupid == regroupid[1])
          
          c_streets <- unique(c$STT_NAAM)
          
          # subset wegen naar gemeenten en straten
          d <- nwb_snelheid_gesloten_fiets %>%
            filter(GME_NAAM == gemeente_lijst[i] & (STT_NAAM %in% c_streets | BST_CODE %in% c("PAR", "VWG"))) %>%
            select(WVK_ID, STT_NAAM, MAXSHD, BST_CODE) %>%
            rename(parallel_WVK_ID = WVK_ID, parallel_STT_NAAM = STT_NAAM, parallel_MAXSHD = MAXSHD, 
                   parallel_BST_CODE  = BST_CODE)
          
          # voer spatial joint uit voor transect met wegen 
          e <- st_join(c, d) %>%
            # verwijder joins met het originele wegvak per wvk_id
            filter(WVK_ID != parallel_WVK_ID)
          
            # resultaten per iteratie

            # Sommige opdrachten leveren geen hits op. We willen geen lege objecten als resultaat opvoeren omdat daarmee
            # conflicten tussen variabelen typen ontstaan. Daarom gebruiken we rm() om object bij return te verwijderen
            if (nrow(e) == 0) {
                NULL
            }
          # zet de resultaten in de lijst als er op zijn minst een join is
         else {f[[length(f)+1]] <- e
         }
        }

    }
    # creëer df door lijst f te kopplen na alle iteraties
    g <- rbindlist(f)
}

  time12 <- Sys.time()
  timer9 <- time12 - time11
  print(timer9)

  stopCluster(cl = my.cluster)

  # Opslaan voor later gebruik
  saveRDS(transects_parallelwegen, here("RDS", "transects_parallelwegen.rds"))
  st_write(transects_parallelwegen, here("Output", "transects_parallelwegen.gpkg"), append = FALSE)
  
}

4.2.7 Classificeren transects per wegvak

Om de uiteindelijke SPI-score voor dit onderdeel te berekenen is het van belang om wegvakken te classificeren op basis van de aanwezigheid van vrijliggende fietspaden, de aanwezigheid van voor fietsers veilig geachte parallelwegen (erftoegangswegen) en een geslotenverklaring voor fietsers.

4.2.7.1 Aanwezigheid fietspaden en geslotenverklaring

Nu de kruising van transects voor fietspaden en wegvakken bekend is, kan begonnen worden met het aggregeren van transects op wegvakniveau. Voor de zekerheid controleren we op dubbele transects en ontdubbelen die indien nodig.

# ontdubbelen transects data
transects_join_fietspaden_deduplicated <- transects_join_fietspaden %>%
  as.data.frame() %>%
  # gebruik dtplyr voor snellere verwerking
  lazy_dt() %>%
  # er zijn enkele dubbele transects. Dit kan door dubbele NWB geometrieën en moeten  
  # verwijderd worden. Dit doen we simpelweg door de eerste te pakken
  group_by(ID_WVK_SEGMENT) %>%
  slice_head(n=1) %>%
  ungroup() %>%
  # creëer een overkoepelende id voor transects die naar L en R gaan en op hettzelfde punt beginnen op
  # een wegvak
  mutate(ID_WVK_SEGMENT_unsided = str_sub(ID_WVK_SEGMENT, 1, -3)) %>%
  relocate(ID_WVK_SEGMENT_unsided, .after = ID_WVK_SEGMENT) %>%
  # reconvert lazy_dat object naar df
  as.data.frame()

Voor elk wegvak wordt het aantal en aandeel transects bepaald waar een fietspad aanwezig is. Dit gebeurt voor het totaal en voor de linker- en rechterkant van het wegvak apart.

Wanneer een wegvak voor minimaal 50% een vrijliggend fietspad heeft (dit aandeel kan naar wens aangepast worden), dan wordt deze als zodanig geclassificeerd.

# Creëer een threshold voor het minimale aandeel van een wegvak dat een fietspad moet hebben om als zodanig geclassificeerd te worden
threshold_aandeel_fietspad <- 0.5

# geaggregeerde karakteristieken door transects te tellen voor paren van L en R
transects_aggregated_fietspaden <- transects_join_fietspaden_deduplicated %>%
  as.data.frame() %>%
  lazy_dt() %>%
  # groepeer op ID_WVK_SEGMENT_unsided met behoud van WVK_ID
  # Toelichting: ID_WVK_SEGMENT is opgebouwd uit wvkid_segmentnr_wegzijde (L of R). ID_WVK_SEGMENT_unsided is dezelfde zonder wegzijde. 
  # Van elk ID_WVK_SEGMENT_unsided zijn er twee, 1 links 1 rechts. 
  group_by(WVK_ID, ID_WVK_SEGMENT_unsided) %>%
  # Bepaal of een fietspad aanwezig is, een- en/of tweezijdig (3 varianten)
            # true false variabele, true als fietspad aanwezig aan minimaal een kant van het wegvak
  summarise(fietspad_intersect_unsided = any(na.as.false(fietspad_intersect)), 
            # true false variabele, true als fietspad aanwezig aan een kant van het wegvak
            fietspad_intersect_onesided = ifelse(sum(na.as.false(fietspad_intersect))==1, TRUE, FALSE), 
            # true false variabele, true als fietspad aanwezig aan twee kanten van het wegvak
            fietspad_intersect_twosided = ifelse(sum(na.as.false(fietspad_intersect))==2, TRUE, FALSE)) %>% 
  group_by(WVK_ID) %>%
  # aantal aanwezige fietspaden per transect
  summarise(n_transectlocations_unsided = n(), # aantal transects locaties (dus L en R samen, dwz indien 4 L en 4 R -> 4 transectlocaties)
            n_fietspad_unsided_locations = sum(ifelse(fietspad_intersect_unsided, 1, 0)), # optellen als true
            n_fietspad_onesided_locations = sum(ifelse(fietspad_intersect_onesided, 1, 0)), # optelen als true
            n_fietspad_twosided_locations = sum(ifelse(fietspad_intersect_twosided, 1, 0))) %>% # optellen als true
  # bepaal aandeel
  mutate(aandeel_fietspad_unsided = round(n_fietspad_unsided_locations / n_transectlocations_unsided,2),
         aandeel_fietspad_onesided = round(n_fietspad_onesided_locations / n_transectlocations_unsided,2),
         aandeel_fietspad_twosided = round(n_fietspad_twosided_locations / n_transectlocations_unsided,2)) %>%
  # bepaal of wegvak aangemerkt moet worden als aanwezigheid fietspad
  mutate(fietspad_aanwezig = ifelse(aandeel_fietspad_unsided >= threshold_aandeel_fietspad, TRUE, FALSE)) %>%
  as.data.frame()


#unique(transects_join_fietspads_deduplicated$fietspad_intersect)

4.2.7.2 Aanwezigheid parallelweg met veilige snelheidslimiet

Op eenzelfde wijze als bij de fietspaden bepalen we of er een parallelweg geschikt voor fietsers aanwezig is naast een wegvak. Daarbij maken we gebruik van de aanname dat een weg met een limiet van 60 km/uur een erftoegangsweg betreft. Wegen met de volgende geregistreerde limieten worden daarmee als geschikt beschouwd: 60, 30, 20, 15, 5, NOA.

Als eerste maken we een lijst aan met wegvakken die een geschikte snelheidslimiet hebben en een lijst met wegvakken die een fietspad hebben.

# creëer een lookup lijst van wegvakken met een fietspad
wegvakken_fietspad <- filter(transects_aggregated_fietspaden, fietspad_aanwezig)$WVK_ID

# creëer een lookup lijst van wegvakken met een veilige snelheid van 30 of lager, of limiet 60 onder aanname dat 
# een weg met limiet 60 een etw buiten de bebouwde kom betreft. 
wegvakken_veiligesnelheid <- filter(nwb_snelheid_gesloten_fiets, MAXSHD %in% c("60", "30", "20", "15", "5", "NOA"))$WVK_ID

Deze lijst wordt gebruikt om te bepalen voor elke transect die met een wegvak kruist - met dezelfde straatnaam of BST_CODE PAR of VWG - of deze een geschikte snelheidslimiet of niet heeft, of dat er een vrijliggend fietspad aanwezig is langs de rijbaan waarmee de transect intersect.

# Voeg variabelen toe aan transects met parallelwegen
# Let op, de dataset is niet uniek voor ID_WVK_SEGMENT want een transect kan met meerdere wegvakken met dezelfde straatnamen of bst_code par/vwg intersecten die een verschillende WVK_ID hebben
transects_parallelwegen_plus <- transects_parallelwegen %>%
  relocate(geom, .after = last_col()) %>%
  st_sf() %>%
  select(ID_WVK_SEGMENT, WVK_ID, STT_NAAM, transect_side, starts_with("parallel")) %>%
  # voeg informatie aan variabelen toe met behulp van lookup lijsten
  mutate(parallel_veiligesnelheid = ifelse(parallel_WVK_ID %in% wegvakken_veiligesnelheid, TRUE, FALSE),
         parallel_fietspad = ifelse(parallel_WVK_ID %in% wegvakken_fietspad, TRUE, FALSE)) %>%
  filter(parallel_STT_NAAM == STT_NAAM | parallel_BST_CODE %in% c ("PAR", "VWG"))
  

# bepaal per transect identifier ID_WVK_SEGMENT of een van de transects intersects met een wegvak met een vrijliggend fietspad en/of een parallelweg met een veilige snelheidslimiet 
transects_parallels_aggregated <- transects_parallelwegen_plus %>%
  st_drop_geometry() %>%
  group_by(ID_WVK_SEGMENT, WVK_ID, transect_side) %>%
  arrange(ID_WVK_SEGMENT, WVK_ID, transect_side) %>%
  summarise(parallel_veiligesnelheid = any(parallel_veiligesnelheid),
            parallel_fietspad = any(parallel_fietspad))

Deze informatie wordt gebruikt om een nieuwe dataset aan te maken van wegvakken waarvan we nu weten of er een fietspad en/of een parallelweg met een veilige snelheidslimiet aanwezig is.

Wanneer een wegvak voor minimaal 50% een parallelweg met een veilige snelheidslimiet heeft (dit aandeel kan naar wens aangepast worden), dan wordt deze als zodanig geclassificeerd.

# Creëer een threshold voor het minimale aandeel van een wegvak dat een parallelweg met een veilige snelheid moet hebben om als zodanig geclassificeerd te worden
threshold_aandeel_parallel_vs <- 0.5

# creëer een nieuwe transects dataset met informatie over fietspaden en parallelwegen
transects_aggregated_FP_PAR <- transects_join_fietspaden_deduplicated %>%
  as.data.frame() %>%
  left_join(select(transects_parallels_aggregated, ID_WVK_SEGMENT, parallel_veiligesnelheid,
                   parallel_fietspad)) %>%
  # herhaal wat we deden om te bepalen of er een fietspad of parallelweg met een veilig snelheid aanwezig is en of een wegvak gezien wordt als veilig door de aanwezigheid van een ander wegvak dat als veilig gezien wordt
  lazy_dt() %>%
  #filter(GME_NAAM == "Utrecht") %>%
  # groepeer per ID_WVK_SEGMENT_unsided met behoud van WVK_ID
  group_by(WVK_ID, ID_WVK_SEGMENT_unsided) %>%
  # Bepaal of een fietpad aanwezig is links en/of rechts
            # true false variabele, true als fietspad aanwezig aan een van de zijden van het wegvak
  summarise(fietspad_intersect_unsided = any(na.as.false(fietspad_intersect)), 
            # true false variabele, true als fietspad aanwezig aan een kant van het wegvak
            fietspad_intersect_onesided = ifelse(sum(na.as.false(fietspad_intersect))==1, TRUE, FALSE), 
            # true false variabele, true als fietspad aanwezig aan beide kanten van het wegvak
            fietspad_intersect_twosided = ifelse(sum(na.as.false(fietspad_intersect))==2, TRUE, FALSE),
  # voeg parallel variabelen toe
            # true false variabele, true als parallelweg aanwezig aan een van de kanten van het wegvak
            parallel_v.s_unsided = any(na.as.false(parallel_veiligesnelheid)), 
            # true false variabele, true als parallwelweg aanwezig aan een kant van het wegvak
            parallel_v.s_onesided = ifelse(sum(na.as.false(parallel_veiligesnelheid))==1, TRUE, FALSE), 
            # true false variabele, true als parallelweg aanwezig aan beide kanten van het wegvak
            parallel_v.s_twosided = ifelse(sum(na.as.false(parallel_veiligesnelheid))==2, TRUE, FALSE),
            # true false variabele, true als een parallele rijbaan met fietspad aanwezig is aan een van de kanten van het wegvak
            parallel_fietspad_unsided = any(na.as.false(parallel_fietspad)) 
            ) %>% # true false variabele, true als parallewegl aanwezig aan twee kanten van het wegvak
  group_by(WVK_ID) %>%
  # aantal fietspaden aanwezig bij transects
  summarise(n_transectlocations_unsided = n(),
            n_fietspad_unsided_locations = sum(ifelse(fietspad_intersect_unsided, 1, 0)), # tel op als true
            n_fietspad_onesided_locations = sum(ifelse(fietspad_intersect_onesided, 1, 0)), # tel op als true
            n_fietspad_twosided_locations = sum(ifelse(fietspad_intersect_twosided, 1, 0)),
 # voeg parallelweg variabelen toe
            n_parallel_v.s_unsided = sum(ifelse(parallel_v.s_unsided, 1, 0)), # tel op als true
            n_parallel_v.s_onesided = sum(ifelse(parallel_v.s_onesided, 1, 0)), # tel op als true
            n_parallel_v.s_twosided = sum(ifelse(parallel_v.s_twosided, 1, 0)),
            n_parallel_fietspad_unsided = sum(ifelse(parallel_fietspad_unsided, 1, 0))
            ) %>% # tel op als true
  # bepaal aandelen
  mutate(aandeel_fietspad_unsided = round(n_fietspad_unsided_locations / n_transectlocations_unsided,2),
         aandeel_fietspad_onesided = round(n_fietspad_onesided_locations / n_transectlocations_unsided,2),
         aandeel_fietspad_twosided = round(n_fietspad_twosided_locations / n_transectlocations_unsided,2),
  # voeg parallelweg variabelen toe 
         aandeel_parallel_v.s_unsided = round(n_parallel_v.s_unsided / n_transectlocations_unsided,2),
         aandeel_parallel_v.s_onesided = round(n_parallel_v.s_onesided / n_transectlocations_unsided,2),
         aandeel_parallel_v.s_twosided = round(n_parallel_v.s_twosided / n_transectlocations_unsided,2),
         aandeel_parallel_with_fietspad_unsided = round(n_parallel_fietspad_unsided / n_transectlocations_unsided,2)
  ) %>%
  # bepaal of een wegvak geclassifieerd moet worden als fietspad of parallelweg aanwezig
  mutate(# bepaling aanwezigheid fietspad
         fietspad_aanwezig = ifelse(aandeel_fietspad_unsided >= threshold_aandeel_fietspad, TRUE, FALSE),
         # bepaling aanwezigheid parallelweg met veilige limiet
         parallel_vs_aanwezig = ifelse(aandeel_parallel_v.s_unsided >= threshold_aandeel_parallel_vs, TRUE, FALSE),
         # bepaling aanwezigheid parallele rijbaan met fietspad
         parallel_metfp_aanwezig = ifelse(aandeel_parallel_with_fietspad_unsided >= threshold_aandeel_parallel_vs, 
                                          TRUE, FALSE)) %>%
         # # bepaling aanwezigheid parallelweg of parallele rijbaan met fietspad
         # parallel_vs_fietspad_aanwezig = ifelse(aandeel_parallel_v.s_unsided >= threshold_aandeel_parallel_vs | 
         #                                aandeel_parallel_with_fietspad_unsided >= threshold_aandeel_parallel_vs, 
         #                                TRUE, FALSE)) %>%
  as.data.frame()

# # controle of berekeningen goed zijn gegaan
checkpar <- any(is.na(transects_aggregated_FP_PAR$parallel_vs_fietspad_aanwezig))
checkfp <- any(is.na(transects_aggregated_FP_PAR$fietspad_aanwezig))

print(paste0("Controle of de bepaling van de aanwezigheid van fietspaden missende waarden oplevert: ", checkpar ))
print(paste0("Controle of de bepaling van de aanwezigheid van veilige parallelbanen missende waarden oplevert: ", checkpar ))

4.2.8 Dataset voor analyse

Als laatste kan de volledige dataset aangemaakt worden met alle variabelen die nodig zijn voor de analyse.

nwb_wegvak_join_all <- nwb_50_70_80_gesloten_fiets %>%
  left_join(transects_aggregated_FP_PAR)

# names(nwb_wegvak_join_all)

nwb_wegvak_analyse <- nwb_wegvak_join_all %>%
          # wegvak informatie
  select(WVK_ID, STT_NAAM, GME_NAAM, WPSNAAM, shd_lengte, wvk_lengte, BST_CODE,
         # snelheidslimiet
         MAXSHD, shd_maatgevend,
         # aanwezigheid van ...
         gesloten_fiets, fietspad_aanwezig, parallel_vs_aanwezig, parallel_metfp_aanwezig,
         # wegbeheerders
         WEGBEHSRT, WEGBEHNAAM)

5 Analyse

In de analyse wordt gekeken welke wegvakken aan de SPI voldoen. Een wegvak voldoet wanneer:

  • het wegvak een geslotenverklaring heeft voor fietsers;
  • het wegvak een vrijliggend fietspad heeft; en/of
  • het wegvak een parallelweg met een veilige snelheidslimiet heeft.

Wanneer er geen registratie is over de gesloten verklaring voor fietsers, dan wordt er vanuit gegaan dat de weg open is voor fietsers wanneer er tevens geen vrijliggend fietspad of een parallelweg met een veilige snelheidslimiet aanwezig is.

nwb_wegvak_analyse_cat <- nwb_wegvak_analyse %>%
  # wegakken die aan de SPI voldoen
  mutate(wvk_voldoet = ifelse(na.as.false(gesloten_fiets == 1) | na.as.false(parallel_vs_aanwezig) | 
                              na.as.false(fietspad_aanwezig) | 
                              # Een wegvak wordt ook als wegvak met fp aanwezig bedoordeeld als een fp aan een parallel 
                              # wegvak met dezelfde straatnaam is gekoppeld. 
                              na.as.false(parallel_metfp_aanwezig), TRUE, FALSE))

De volgende tabel is de bijbehorende attributentabel die de variabelen in de analysetabel beschrijft

# attributen en omschrijving in een data frame
tabel_wegvakken_fietsrijbaan_beschr <- data.frame(
  Attribuut = c(
    "WVK_ID", "STT_NAAM", "GME_NAAM", "WPSNAAM",
    "shd_lengte", "wvk_lengte", "BST_CODE", "MAXSHD", "shd_maatgevend",
    "gesloten_fiets", "fietspad_aanwezig", "parallel_vs_aanwezig", "parallel_metfp_aanwezig", 
    "WEGBEHSRT", "WEGBEHNAAM", "geometry", "wvk_voldoet"
    ),
  Omschrijving = c(
    "Het unieke nummer voor een Wegvak.",
    "Straatnaam", 
    "Naam van de gemeente waarin de straat ligt", 
    "Naam van de plaats waarin het wegvak ligt.", 
    "Lengte van het deel van het wegvak waarvoor de snelheidslimiet geldt.",
    "Lengte van het wegvak.",
    "NWB Baan subsoort code", 
    "Snelheidslimiet op basis van WKD.",
    "De maatgevende snelheidslimiet die geldt op het grootste deel van het wegvak.",
    "Geslotenverklaring aanwezig voor fietsers.",
    "Vrijliggend fietspad aanwezig.",
    "Parallelweg met veilige snelheidslimiet aanwezig.",
    "Parallel wegvak met daaraan gekoppeld fietspad aanwezig.",
    "Het type wegbeheerder met G: Gemeente, W: Waterschap, P: Provincie, R: Rijk en T: Particulier.",
    "Naam van de wegbeheerder.", 
    "Het type geometrie; in dit geval lijn.",
    "Geeft aan of het wegvak voldoet aan de SPI."
    )
)

scroltabel_gt(tabel_wegvakken_fietsrijbaan_beschr, title = "Variabelen gescheiden voorziening voor fietsers" )
Variabelen gescheiden voorziening voor fietsers
Attribuut Omschrijving
WVK_ID Het unieke nummer voor een Wegvak.
STT_NAAM Straatnaam
GME_NAAM Naam van de gemeente waarin de straat ligt
WPSNAAM Naam van de plaats waarin het wegvak ligt.
shd_lengte Lengte van het deel van het wegvak waarvoor de snelheidslimiet geldt.
wvk_lengte Lengte van het wegvak.
BST_CODE NWB Baan subsoort code
MAXSHD Snelheidslimiet op basis van WKD.
shd_maatgevend De maatgevende snelheidslimiet die geldt op het grootste deel van het wegvak.
gesloten_fiets Geslotenverklaring aanwezig voor fietsers.
fietspad_aanwezig Vrijliggend fietspad aanwezig.
parallel_vs_aanwezig Parallelweg met veilige snelheidslimiet aanwezig.
parallel_metfp_aanwezig Parallel wegvak met daaraan gekoppeld fietspad aanwezig.
WEGBEHSRT Het type wegbeheerder met G: Gemeente, W: Waterschap, P: Provincie, R: Rijk en T: Particulier.
WEGBEHNAAM Naam van de wegbeheerder.
geometry Het type geometrie; in dit geval lijn.
wvk_voldoet Geeft aan of het wegvak voldoet aan de SPI.

6 Scores en Benchmark SPI Veilige Infrastructuur - kenmerk gescheiden voorziening voor fietsers

De SPI Veilige Infrastructuur bevat het kenmerk “gescheiden voorziening voor fietsers”. Idealiter hebben alle wegen met een 50, 70 en 80 km/uur snelheidslimiet een geslotenverklaring voor fietsers. Fietsers mogen hier niet op de rijbaan fietsen en zijn verplicht, indien aanwezig, een vrijliggend fietspad te gebruiken of een parallelweg met een veilige snelheidslimiet. Onder wegen met een veilige snelheidslimiet beschouwen we erftoeganswegen binnen en buiten de bebouwde kom (snelheidslimiet 30 km/uur of lager en 60 km/uur bubeko respectievelijk) en GOW30 wegen.

6.1 Bepaling scores per wegbeheerder

In het vorige hoofdstuk zijn wegvakken beoordeeld ten aanzien van de SPI kenmerk gescheiden voorziening voor fietsers. Een wegvak voldoet wanneer het:

  • een geslotenverklaring heeft voor fietsers;
  • een vrijliggend fietspad heeft; en/of
  • een parallelweg met een veilige snelheidslimiet.

Hierbij geldt dat een wegvak aangemerkt wordt als wegvak met een vrijliggend fietspad of een parallelweg met een veilige snelheidslimiet, wanneer dit kenmerk aanwezig is op minimaal de helft van de wegvaklengte. Indien een wegvak aan geen van de bovenstaande kenmerken voldoet, wordt deze afgekeurd.

De beoordeling op wegvakniveau wordt vertaald naar een score op netwerkniveau per wegbeheerder. Daarbij wordt gekeken naar het aandeel van de wegvakken dat als voldoende wordt beoordeeld. Per wegbeheerder wordt het volgende gescoord.

  1. Kenmerk gescheiden voorziening voor fietsers: [aantal wegvakken dat voldoet] / [totaal aantal wegvakken]
  2. Score kenmerk naar weglengte: [totale weglengte van de wegvakken die voldoen] / [totale weglengte]

De eerste score is de hoofdscore, omdat deze ook gebruikt kan worden bij de bepaling van een totaal score van de infrastructuur. Daarnaast kan de score worden onderscheiden op het totale areaal en per limiet.

#### landelijk ####
scores_landelijk_totaal_wvk <- nwb_wegvak_analyse_cat %>%
  st_drop_geometry(.) %>%
  ungroup() %>% 
  # bepaal scores
  summarise(`Wegbeheerder soort` = "Totaal",
            Wegbeheerder = "Totaal",
            Snelheidslimiet = "Totaal",
            `Score kenmerk gescheiden voorziening voor fietsers` = sum(wvk_voldoet) / n(),
            `Score kenmerk naar weglengte` = sum(ifelse(wvk_voldoet == TRUE, wvk_lengte, 0)) / sum(wvk_lengte),
            `Totale weglengte [km]` = round(sum(wvk_lengte) / 1000, 1),
            ) %>%
  mutate(across(c(`Score kenmerk gescheiden voorziening voor fietsers`, `Score kenmerk naar weglengte`), 
                ~ set_units(. * 100, "%"))) %>%
  mutate(across(c(`Score kenmerk gescheiden voorziening voor fietsers`, `Score kenmerk naar weglengte`), 
                ~ round(., 1))) 

# scores per limiet bepalen
scores_landelijk_limiet_wvk <- nwb_wegvak_analyse_cat %>% 
  st_drop_geometry() %>% 
  # groepeer naar limiet
  group_by(shd_maatgevend) %>%
  # bepaal scores
  summarise(`Wegbeheerder soort` = "Totaal" ,
            Wegbeheerder = "Totaal",
            #Snelheidslimiet = shd_maatgevend,
            `Score kenmerk gescheiden voorziening voor fietsers` = sum(wvk_voldoet) / n(),
            `Score kenmerk naar weglengte` = sum(ifelse(wvk_voldoet == TRUE, wvk_lengte, 0)) / sum(wvk_lengte),
            `Totale weglengte [km]` = round(sum(wvk_lengte) / 1000, 1)) %>%
  mutate(across(c(`Score kenmerk gescheiden voorziening voor fietsers`, `Score kenmerk naar weglengte`), 
                ~ set_units(. * 100, "%"))) %>%
  mutate(across(c(`Score kenmerk gescheiden voorziening voor fietsers`, `Score kenmerk naar weglengte`), 
                ~ round(., 1))) %>%
  relocate(shd_maatgevend, .after = Wegbeheerder) %>%
  rename(Snelheidslimiet = shd_maatgevend) %>% 
  ungroup()

# combineer alle landelijke scores
scores_landelijk <- bind_rows(scores_landelijk_limiet_wvk, scores_landelijk_totaal_wvk) %>%
  # Limiet als factor om arrange in de juiste volgorde te krijgen
  mutate(Snelheidslimiet = factor(Snelheidslimiet, 
                                  levels = c("50", "70", "80", "Totaal"))) %>% 
  arrange(Wegbeheerder, Snelheidslimiet)

head(scores_landelijk)

#### provincies ####

# scores voor het totaal bepalen
scores_provincies_totaal_wvk <- nwb_wegvak_analyse_cat %>%
  st_drop_geometry() %>%
  # selecteer op basis van wegbeheersoort
  filter(WEGBEHSRT == "P") %>%
  # groepeer naar webeheerder
  group_by(WEGBEHNAAM) %>%
  # bepaal scores
  summarise(`Wegbeheerder soort` = "Provincie" ,
            Snelheidslimiet = "Totaal",
            `Score kenmerk gescheiden voorziening voor fietsers` = sum(wvk_voldoet) / n(),
            `Score kenmerk naar weglengte` = sum(ifelse(wvk_voldoet == TRUE, wvk_lengte, 0)) / sum(wvk_lengte),
            `Totale weglengte [km]` = round(sum(wvk_lengte) / 1000, 1)) %>%
  mutate(across(c(`Score kenmerk gescheiden voorziening voor fietsers`, `Score kenmerk naar weglengte`), 
                  ~ set_units(. * 100, "%"))) %>%
  mutate(across(c(`Score kenmerk gescheiden voorziening voor fietsers`, `Score kenmerk naar weglengte`), 
                  ~ round(., 1))) %>%
  rename(Wegbeheerder = WEGBEHNAAM) %>%
  relocate(`Wegbeheerder soort`) %>%
  ungroup()

# scores per limiet bepalen 
scores_provincies_limiet_wvk <- nwb_wegvak_analyse_cat %>%
  st_drop_geometry() %>%
  # selecteer op basis van wegbeheersoort
  filter(WEGBEHSRT == "P") %>%
  # groepeer naar webeheerder
  group_by(WEGBEHNAAM, shd_maatgevend) %>%
  # bepaal scores
  summarise(`Wegbeheerder soort` = "Provincie" ,
            `Score kenmerk gescheiden voorziening voor fietsers` = sum(wvk_voldoet) / n(),
            `Score kenmerk naar weglengte` = sum(ifelse(wvk_voldoet == TRUE,wvk_lengte, 0)) / sum(wvk_lengte),
            `Totale weglengte [km]` = round(sum(wvk_lengte) / 1000, 1)) %>%
  mutate(across(c(`Score kenmerk gescheiden voorziening voor fietsers`, `Score kenmerk naar weglengte`), 
                ~ set_units(. * 100, "%"))) %>%
  mutate(across(c(`Score kenmerk gescheiden voorziening voor fietsers`, `Score kenmerk naar weglengte`), 
                ~ round(., 1))) %>%
  rename(
    Wegbeheerder = WEGBEHNAAM,
    Snelheidslimiet = shd_maatgevend
    ) %>%
  relocate(`Wegbeheerder soort`) %>%
  ungroup()

# head(scores_provincies_limiet_wvk)

# combineer alle provincie scores
scores_provincies <- bind_rows(scores_provincies_limiet_wvk, scores_provincies_totaal_wvk) %>%
  # Limiet als factor om arrange in de juiste volgorde te krijgen
  mutate(Snelheidslimiet = factor(Snelheidslimiet, 
                                  levels = c("50", "70", "80", "Totaal"))) %>% 
  arrange(Wegbeheerder, Snelheidslimiet)


#### gemeenten ####

# scores voor het totaal bepalen
scores_gemeenten_totaal_wvk <- nwb_wegvak_analyse_cat %>%
  st_drop_geometry() %>%
  # selecteer op basis van wegbeheersoort
  filter(WEGBEHSRT == "G") %>%
  # groepeer naar webeheerder
  group_by(GME_NAAM) %>%
  # bepaal scores
  summarise(`Wegbeheerder soort` = "Gemeente" ,
            Snelheidslimiet = "Totaal",
            `Score kenmerk gescheiden voorziening voor fietsers` = sum(wvk_voldoet) / n(),
            `Score kenmerk naar weglengte` = sum(ifelse(wvk_voldoet == TRUE, wvk_lengte, 0)) / sum(wvk_lengte),
            `Totale weglengte [km]` = round(sum(wvk_lengte) / 1000, 1)) %>%
  mutate(across(c(`Score kenmerk gescheiden voorziening voor fietsers`, `Score kenmerk naar weglengte`), 
                  ~ set_units(. * 100, "%"))) %>%
  mutate(across(c(`Score kenmerk gescheiden voorziening voor fietsers`, `Score kenmerk naar weglengte`), 
                  ~ round(., 1))) %>%
  rename(Wegbeheerder = GME_NAAM) %>%
  relocate(`Wegbeheerder soort`) %>%
  ungroup()

# scores per limiet bepalen
scores_gemeenten_limiet_wvk <- nwb_wegvak_analyse_cat %>%
  st_drop_geometry() %>%
  # selecteer op basis van wegbeheersoort
  filter(WEGBEHSRT == "G") %>%
  # groepeer naar webeheerder
  group_by(GME_NAAM, shd_maatgevend) %>%
  # bepaal scores
  summarise(`Wegbeheerder soort` = "Gemeente" ,
            `Score kenmerk gescheiden voorziening voor fietsers` = sum(wvk_voldoet) / n(),
            `Score kenmerk naar weglengte` = sum(ifelse(wvk_voldoet == TRUE, wvk_lengte, 0)) / sum(wvk_lengte),
            `Totale weglengte [km]` = round(sum(wvk_lengte) / 1000, 1)) %>%
  mutate(across(c(`Score kenmerk gescheiden voorziening voor fietsers`, `Score kenmerk naar weglengte`), 
                ~ set_units(. * 100, "%"))) %>%
  mutate(across(c(`Score kenmerk gescheiden voorziening voor fietsers`, `Score kenmerk naar weglengte`), 
                ~ round(., 1))) %>%
  rename(
    Wegbeheerder = GME_NAAM,
    Snelheidslimiet = shd_maatgevend
    ) %>%
  relocate(`Wegbeheerder soort`) %>%
  ungroup()

# head(scores_provincies_limiet)

# combineer alle gemeente scores
scores_gemeenten <- bind_rows(scores_gemeenten_limiet_wvk, scores_gemeenten_totaal_wvk) %>%
  # Limiet als factor om arrange in de juiste volgorde te krijgen
  mutate(Snelheidslimiet = factor(Snelheidslimiet, 
                                  levels = c("50", "70", "80", "Totaal"))) %>% 
  arrange(Wegbeheerder, Snelheidslimiet)

#### waterschappen ####

# scores voor het totaal bepalen - wegvakniveau
scores_waterschappen_totaal_wvk <- nwb_wegvak_analyse_cat %>%
  st_drop_geometry() %>%
  # selecteer op basis van wegbeheersoort
  filter(WEGBEHSRT == "W") %>%
  # groepeer naar webeheerder
  group_by(WEGBEHNAAM) %>%
  # bepaal scores
  summarise(`Wegbeheerder soort` = "Waterschap" ,
            Snelheidslimiet = "Totaal",
            `Score kenmerk gescheiden voorziening voor fietsers` = sum(wvk_voldoet) / n(),
            `Score kenmerk naar weglengte` = sum(ifelse(wvk_voldoet == TRUE, wvk_lengte, 0)) / sum(wvk_lengte),
            `Totale weglengte [km]` = round(sum(wvk_lengte) / 1000, 1)) %>%
  mutate(across(c(`Score kenmerk gescheiden voorziening voor fietsers`, `Score kenmerk naar weglengte`), 
                  ~ set_units(. * 100, "%"))) %>%
  mutate(across(c(`Score kenmerk gescheiden voorziening voor fietsers`, `Score kenmerk naar weglengte`), 
                  ~ round(., 1))) %>%
  rename(Wegbeheerder = WEGBEHNAAM) %>%
  relocate(`Wegbeheerder soort`) %>%
  ungroup()

# scores per limiet bepalen
scores_waterschappen_limiet_wvk <- nwb_wegvak_analyse_cat %>%
  st_drop_geometry() %>%
  # selecteer op basis van wegbeheersoort
  filter(WEGBEHSRT == "W") %>%
  # groepeer naar webeheerder
  group_by(WEGBEHNAAM, shd_maatgevend) %>%
  # bepaal scores
  summarise(`Wegbeheerder soort` = "Waterschap" ,
            `Score kenmerk gescheiden voorziening voor fietsers` = sum(wvk_voldoet) / n(),
            `Score kenmerk naar weglengte` = sum(ifelse(wvk_voldoet == TRUE, wvk_lengte, 0)) / sum(wvk_lengte),
            `Totale weglengte [km]` = round(sum(wvk_lengte) / 1000, 1)) %>%
  mutate(across(c(`Score kenmerk gescheiden voorziening voor fietsers`, `Score kenmerk naar weglengte`), 
                ~ set_units(. * 100, "%"))) %>%
  mutate(across(c(`Score kenmerk gescheiden voorziening voor fietsers`, `Score kenmerk naar weglengte`), 
                ~ round(., 1))) %>%
  rename(
    Wegbeheerder = WEGBEHNAAM,
    Snelheidslimiet = shd_maatgevend
    ) %>%
  relocate(`Wegbeheerder soort`) %>%
  ungroup()

# head(scores_waterschappen_limiet)

# combineer alle waterschap scores
scores_waterschappen <- bind_rows(scores_waterschappen_limiet_wvk, scores_waterschappen_totaal_wvk) %>%
  # Limiet als factor om arrange in de juiste volgorde te krijgen
  mutate(Snelheidslimiet = factor(Snelheidslimiet, 
                                  levels = c("50", "70", "80", "Totaal"))) %>% 
  arrange(Wegbeheerder, Snelheidslimiet)

Scores zijn bepaald per wegbeheerder. Dat betekent dat een weg onder beheer van een waterschap niet is meegenomen bij de score van een gemeente, ook al ligt de weg binnen de gebiedsgrenzen van een betreffende gemeente.

6.2 Resultaten SPI Veilige Infrastructuur - kenmerk gescheiden voorziening voor fietsers per wegbeheerder

In deze paragraaf worden de deelscores van de SPI Veilige Infrastructuur - kenmerk gescheiden voorziening voor fietsers getoond. De getoonde resultaten worden apart getoond in subparagrafen op landelijk niveau en voor waterschapswegbeheerders, provinciale wegbeheerders en gemeentelijke wegbeheerders.

6.2.1 Landelijk

Hieronder worden de scores voor heel Nederland getoond.

scroltabel_gt(scores_landelijk, title = "SPI Veilige Infrastructuur - kenmerk gescheiden voorziening voor fietsers, van alle wegbeheerders samen")
SPI Veilige Infrastructuur - kenmerk gescheiden voorziening voor fietsers, van alle wegbeheerders samen
Wegbeheerder soort Wegbeheerder Snelheidslimiet Score kenmerk gescheiden voorziening voor fietsers Score kenmerk naar weglengte Totale weglengte [km]
Totaal Totaal 50 66.9 [%] 54.5 [%] 19946.1
Totaal Totaal 70 96.6 [%] 97.9 [%] 1076.8
Totaal Totaal 80 81.9 [%] 71.3 [%] 12706.9
Totaal Totaal Totaal 70.2 [%] 62.2 [%] 33729.8

6.2.2 Waterschappen

Hieronder worden de scores van wegbeherende waterschappen getoond. Waterschappen die geen wegen onder beheer hebben van de beschouwde wegtypen zijn hierbij buiten beschouwing gelaten. De tabel heeft een scrolfunctie. De verschillende wegbeheerders en bijbehorende scores kunnen worden gevonden door gebruik te maken van deze scrolfunctie.

scroltabel_gt(scores_waterschappen, title = "SPI Veilige Infrastructuur - kenmerk gescheiden voorziening voor fietsers, van waterschaps-wegbeheerders")
SPI Veilige Infrastructuur - kenmerk gescheiden voorziening voor fietsers, van waterschaps-wegbeheerders
Wegbeheerder soort Wegbeheerder Snelheidslimiet Score kenmerk gescheiden voorziening voor fietsers Score kenmerk naar weglengte Totale weglengte [km]
Waterschap HHS Hollands Noorderkwartier 50 37.5 [%] 15.3 [%] 6.1
Waterschap HHS Hollands Noorderkwartier 80 70.4 [%] 65.3 [%] 6.6
Waterschap HHS Hollands Noorderkwartier Totaal 52.5 [%] 41.1 [%] 12.7
Waterschap HHS Schieland en de Krimpenerwaard 50 0.0 [%] 0.0 [%] 2.7
Waterschap HHS Schieland en de Krimpenerwaard 80 11.8 [%] 33.2 [%] 4.7
Waterschap HHS Schieland en de Krimpenerwaard Totaal 8.0 [%] 20.9 [%] 7.5
Waterschap Waterschap De Hollandse Delta 50 58.6 [%] 44.1 [%] 40.8
Waterschap Waterschap De Hollandse Delta 70 100.0 [%] 100.0 [%] 0.6
Waterschap Waterschap De Hollandse Delta 80 72.9 [%] 69.5 [%] 112.8
Waterschap Waterschap De Hollandse Delta Totaal 68.1 [%] 62.9 [%] 154.3
Waterschap Waterschap Rivierenland 50 45.0 [%] 18.0 [%] 6.0
Waterschap Waterschap Rivierenland 80 66.7 [%] 48.5 [%] 28.9
Waterschap Waterschap Rivierenland Totaal 61.1 [%] 43.3 [%] 34.9
Waterschap Waterschap Scheldestromen 50 35.7 [%] 38.0 [%] 22.6
Waterschap Waterschap Scheldestromen 80 76.8 [%] 79.2 [%] 164.9
Waterschap Waterschap Scheldestromen Totaal 66.8 [%] 74.2 [%] 187.5

6.2.3 Provincies

Hieronder worden de scores van provincies getoond. De getoonde cijfers hebben enkel betrekking op wegen onder beheer van de betreffende wegbeheerder. De tabel heeft een scrolfunctie. De verschillende wegbeheerders en bijbehorende scores kunnen worden gevonden door gebruik te maken van deze scrolfunctie.

scroltabel_gt(scores_provincies, title = "SPI Veilige Infrastructuur - kenmerk gescheiden voorziening voor fietsers, van provinciale wegbeheerders")
SPI Veilige Infrastructuur - kenmerk gescheiden voorziening voor fietsers, van provinciale wegbeheerders
Wegbeheerder soort Wegbeheerder Snelheidslimiet Score kenmerk gescheiden voorziening voor fietsers Score kenmerk naar weglengte Totale weglengte [km]
Provincie Drenthe 50 93.2 [%] 93.6 [%] 26.1
Provincie Drenthe 70 100.0 [%] 100.0 [%] 21.6
Provincie Drenthe 80 95.8 [%] 98.1 [%] 323.4
Provincie Drenthe Totaal 95.5 [%] 97.9 [%] 371.1
Provincie Flevoland 50 92.6 [%] 93.2 [%] 14.0
Provincie Flevoland 70 100.0 [%] 100.0 [%] 6.5
Provincie Flevoland 80 93.6 [%] 91.8 [%] 453.0
Provincie Flevoland Totaal 93.6 [%] 91.9 [%] 473.4
Provincie Friesland 50 72.6 [%] 71.1 [%] 22.2
Provincie Friesland 70 95.2 [%] 96.7 [%] 28.0
Provincie Friesland 80 91.5 [%] 94.6 [%] 335.0
Provincie Friesland Totaal 89.5 [%] 93.4 [%] 385.2
Provincie Gelderland 50 84.1 [%] 78.6 [%] 136.5
Provincie Gelderland 70 98.9 [%] 99.8 [%] 12.1
Provincie Gelderland 80 90.9 [%] 89.3 [%] 1096.5
Provincie Gelderland Totaal 89.6 [%] 88.3 [%] 1245.0
Provincie Groningen 50 87.0 [%] 82.1 [%] 62.4
Provincie Groningen 70 98.7 [%] 100.0 [%] 43.5
Provincie Groningen 80 96.3 [%] 97.0 [%] 270.4
Provincie Groningen Totaal 93.3 [%] 94.8 [%] 376.2
Provincie Limburg 50 84.6 [%] 81.9 [%] 81.6
Provincie Limburg 70 96.3 [%] 98.6 [%] 3.9
Provincie Limburg 80 97.8 [%] 98.0 [%] 449.9
Provincie Limburg Totaal 94.0 [%] 95.6 [%] 535.4
Provincie Noord-Brabant 50 94.6 [%] 92.3 [%] 44.3
Provincie Noord-Brabant 70 100.0 [%] 100.0 [%] 7.7
Provincie Noord-Brabant 80 97.7 [%] 98.7 [%] 620.4
Provincie Noord-Brabant Totaal 97.2 [%] 98.3 [%] 672.4
Provincie Noord-Holland 50 97.5 [%] 98.6 [%] 83.4
Provincie Noord-Holland 70 98.5 [%] 98.9 [%] 55.5
Provincie Noord-Holland 80 98.0 [%] 99.2 [%] 588.1
Provincie Noord-Holland Totaal 97.9 [%] 99.1 [%] 727.0
Provincie Overijssel 50 94.9 [%] 93.2 [%] 68.5
Provincie Overijssel 70 90.0 [%] 89.6 [%] 8.7
Provincie Overijssel 80 97.2 [%] 99.6 [%] 612.9
Provincie Overijssel Totaal 96.5 [%] 98.8 [%] 690.1
Provincie Utrecht 50 94.6 [%] 95.9 [%] 48.8
Provincie Utrecht 70 100.0 [%] 100.0 [%] 2.5
Provincie Utrecht 80 95.5 [%] 94.9 [%] 309.2
Provincie Utrecht Totaal 95.3 [%] 95.0 [%] 360.5
Provincie Zeeland 50 93.0 [%] 90.4 [%] 8.8
Provincie Zeeland 70 96.7 [%] 99.1 [%] 6.7
Provincie Zeeland 80 95.6 [%] 91.7 [%] 346.3
Provincie Zeeland Totaal 95.5 [%] 91.8 [%] 361.7
Provincie Zuid-Holland 50 95.1 [%] 91.6 [%] 97.6
Provincie Zuid-Holland 70 97.7 [%] 96.1 [%] 14.3
Provincie Zuid-Holland 80 97.5 [%] 99.4 [%] 572.4
Provincie Zuid-Holland Totaal 96.8 [%] 98.3 [%] 684.3

6.2.4 Gemeenten

Hieronder worden de scores van gemeenten getoond. De getoonde cijfers hebben enkel betrekking op wegen onder beheer van de betreffende wegbeheerder. De tabel heeft een scrolfunctie. De verschillende wegbeheerders en bijbehorende scores kunnen worden gevonden door gebruik te maken van deze scrolfunctie.

scroltabel_gt(scores_gemeenten, title = "SPI Veilige Infrastructuur - kenmerk gescheiden voorziening voor fietsers, van gemeentelijke wegbeheerders")
SPI Veilige Infrastructuur - kenmerk gescheiden voorziening voor fietsers, van gemeentelijke wegbeheerders
Wegbeheerder soort Wegbeheerder Snelheidslimiet Score kenmerk gescheiden voorziening voor fietsers Score kenmerk naar weglengte Totale weglengte [km]
Gemeente 's-Gravenhage 50 81.4 [%] 80.9 [%] 457.0
Gemeente 's-Gravenhage 70 97.2 [%] 95.6 [%] 14.4
Gemeente 's-Gravenhage 80 83.3 [%] 71.8 [%] 0.1
Gemeente 's-Gravenhage Totaal 81.5 [%] 81.4 [%] 471.5
Gemeente 's-Hertogenbosch 50 84.9 [%] 76.3 [%] 181.8
Gemeente 's-Hertogenbosch 70 100.0 [%] 100.0 [%] 3.4
Gemeente 's-Hertogenbosch 80 86.7 [%] 79.8 [%] 23.7
Gemeente 's-Hertogenbosch Totaal 85.0 [%] 77.1 [%] 208.9
Gemeente Aa en Hunze 50 41.1 [%] 26.8 [%] 38.1
Gemeente Aa en Hunze 70 40.0 [%] 1.7 [%] 0.8
Gemeente Aa en Hunze 80 19.6 [%] 14.8 [%] 92.5
Gemeente Aa en Hunze Totaal 33.3 [%] 18.2 [%] 131.4
Gemeente Aalsmeer 50 73.1 [%] 62.2 [%] 44.6
Gemeente Aalsmeer 80 100.0 [%] 100.0 [%] 0.7
Gemeente Aalsmeer Totaal 74.0 [%] 62.8 [%] 45.2
Gemeente Aalten 50 37.3 [%] 21.9 [%] 35.2
Gemeente Aalten 70 100.0 [%] 100.0 [%] 0.0
Gemeente Aalten 80 75.0 [%] 40.9 [%] 2.9
Gemeente Aalten Totaal 38.5 [%] 23.4 [%] 38.1
Gemeente Achtkarspelen 50 53.5 [%] 46.8 [%] 10.0
Gemeente Achtkarspelen 70 0.0 [%] 0.0 [%] 0.6
Gemeente Achtkarspelen 80 76.8 [%] 67.2 [%] 13.7
Gemeente Achtkarspelen Totaal 62.6 [%] 57.2 [%] 24.4
Gemeente Alblasserdam 50 69.0 [%] 63.8 [%] 24.0
Gemeente Alblasserdam 80 93.3 [%] 97.1 [%] 1.7
Gemeente Alblasserdam Totaal 71.2 [%] 66.0 [%] 25.8
Gemeente Albrandswaard 50 51.6 [%] 39.9 [%] 27.9
Gemeente Albrandswaard 80 96.3 [%] 99.3 [%] 1.5
Gemeente Albrandswaard Totaal 55.1 [%] 42.9 [%] 29.4
Gemeente Alkmaar 50 68.2 [%] 54.3 [%] 117.2
Gemeente Alkmaar 70 100.0 [%] 100.0 [%] 5.1
Gemeente Alkmaar 80 100.0 [%] 100.0 [%] 2.6
Gemeente Alkmaar Totaal 69.5 [%] 57.1 [%] 124.8
Gemeente Almelo 50 45.1 [%] 34.7 [%] 157.9
Gemeente Almelo 70 96.5 [%] 93.5 [%] 17.5
Gemeente Almelo 80 75.4 [%] 61.5 [%] 50.6
Gemeente Almelo Totaal 51.4 [%] 45.3 [%] 226.1
Gemeente Almere 50 90.2 [%] 85.9 [%] 212.2
Gemeente Almere 80 78.0 [%] 87.5 [%] 10.5
Gemeente Almere Totaal 89.9 [%] 86.0 [%] 222.6
Gemeente Alphen aan den Rijn 50 76.6 [%] 62.3 [%] 99.9
Gemeente Alphen aan den Rijn 70 100.0 [%] 100.0 [%] 8.9
Gemeente Alphen aan den Rijn 80 83.3 [%] 54.4 [%] 0.8
Gemeente Alphen aan den Rijn Totaal 77.7 [%] 65.3 [%] 109.5
Gemeente Alphen-Chaam 50 25.0 [%] 3.9 [%] 2.8
Gemeente Alphen-Chaam 80 78.6 [%] 98.2 [%] 2.3
Gemeente Alphen-Chaam Totaal 44.7 [%] 46.1 [%] 5.2
Gemeente Altena 50 49.5 [%] 39.4 [%] 40.8
Gemeente Altena 80 96.0 [%] 99.3 [%] 9.2
Gemeente Altena Totaal 58.2 [%] 50.4 [%] 50.0
Gemeente Ameland 50 0.0 [%] 0.0 [%] 0.6
Gemeente Ameland 80 100.0 [%] 100.0 [%] 10.9
Gemeente Ameland Totaal 73.1 [%] 94.6 [%] 11.5
Gemeente Amersfoort 50 77.3 [%] 67.7 [%] 168.5
Gemeente Amersfoort 70 100.0 [%] 100.0 [%] 16.4
Gemeente Amersfoort 80 87.7 [%] 78.4 [%] 9.9
Gemeente Amersfoort Totaal 78.4 [%] 71.0 [%] 194.9
Gemeente Amstelveen 50 80.5 [%] 79.8 [%] 88.7
Gemeente Amstelveen 80 89.7 [%] 97.4 [%] 3.6
Gemeente Amstelveen Totaal 80.7 [%] 80.5 [%] 92.3
Gemeente Amsterdam 50 89.8 [%] 85.1 [%] 344.8
Gemeente Amsterdam 70 98.4 [%] 99.9 [%] 42.3
Gemeente Amsterdam 80 90.6 [%] 95.6 [%] 4.6
Gemeente Amsterdam Totaal 90.3 [%] 86.9 [%] 391.7
Gemeente Apeldoorn 50 80.6 [%] 66.3 [%] 167.9
Gemeente Apeldoorn 80 81.2 [%] 73.9 [%] 28.1
Gemeente Apeldoorn Totaal 80.6 [%] 67.4 [%] 196.0
Gemeente Arnhem 50 81.2 [%] 72.8 [%] 187.2
Gemeente Arnhem 70 90.9 [%] 91.5 [%] 7.6
Gemeente Arnhem 80 91.3 [%] 90.8 [%] 6.7
Gemeente Arnhem Totaal 81.5 [%] 74.1 [%] 201.5
Gemeente Assen 50 68.4 [%] 55.4 [%] 103.5
Gemeente Assen 70 89.7 [%] 97.4 [%] 14.9
Gemeente Assen 80 98.7 [%] 99.9 [%] 8.7
Gemeente Assen Totaal 72.2 [%] 63.4 [%] 127.1
Gemeente Asten 50 53.0 [%] 36.8 [%] 19.2
Gemeente Asten 80 90.8 [%] 60.2 [%] 14.8
Gemeente Asten Totaal 63.3 [%] 47.0 [%] 34.0
Gemeente Baarle-Nassau 50 36.2 [%] 21.7 [%] 10.9
Gemeente Baarle-Nassau 80 100.0 [%] 100.0 [%] 0.0
Gemeente Baarle-Nassau Totaal 37.8 [%] 22.0 [%] 10.9
Gemeente Baarn 50 63.0 [%] 50.5 [%] 19.0
Gemeente Baarn 80 81.8 [%] 97.3 [%] 3.9
Gemeente Baarn Totaal 65.2 [%] 58.5 [%] 22.9
Gemeente Barendrecht 50 71.6 [%] 61.9 [%] 53.0
Gemeente Barendrecht 70 98.9 [%] 99.9 [%] 15.8
Gemeente Barendrecht 80 66.7 [%] 36.3 [%] 0.8
Gemeente Barendrecht Totaal 74.3 [%] 70.3 [%] 69.6
Gemeente Barneveld 50 59.8 [%] 43.0 [%] 96.8
Gemeente Barneveld 80 68.2 [%] 58.8 [%] 31.3
Gemeente Barneveld Totaal 61.0 [%] 46.9 [%] 128.1
Gemeente Beek 50 43.8 [%] 29.6 [%] 23.2
Gemeente Beek 80 65.5 [%] 46.5 [%] 7.6
Gemeente Beek Totaal 46.4 [%] 33.8 [%] 30.8
Gemeente Beekdaelen 50 38.6 [%] 23.3 [%] 35.8
Gemeente Beekdaelen 80 41.1 [%] 27.5 [%] 48.1
Gemeente Beekdaelen Totaal 39.6 [%] 25.7 [%] 83.9
Gemeente Beesel 50 26.7 [%] 17.5 [%] 13.2
Gemeente Beesel 80 21.9 [%] 11.6 [%] 50.9
Gemeente Beesel Totaal 23.7 [%] 12.8 [%] 64.1
Gemeente Berg en Dal 50 58.3 [%] 47.8 [%] 28.1
Gemeente Berg en Dal 80 56.2 [%] 34.3 [%] 10.0
Gemeente Berg en Dal Totaal 58.1 [%] 44.3 [%] 38.1
Gemeente Bergeijk 50 62.4 [%] 48.0 [%] 22.5
Gemeente Bergeijk 70 100.0 [%] 100.0 [%] 0.0
Gemeente Bergeijk 80 100.0 [%] 100.0 [%] 6.0
Gemeente Bergeijk Totaal 66.4 [%] 58.8 [%] 28.5
Gemeente Bergen (L) 50 21.3 [%] 9.4 [%] 14.0
Gemeente Bergen (L) 70 75.0 [%] 99.1 [%] 0.8
Gemeente Bergen (L) 80 49.1 [%] 29.1 [%] 47.4
Gemeente Bergen (L) Totaal 37.1 [%] 25.5 [%] 62.1
Gemeente Bergen (NH) 50 71.4 [%] 61.8 [%] 27.3
Gemeente Bergen (NH) 80 100.0 [%] 100.0 [%] 4.8
Gemeente Bergen (NH) Totaal 73.0 [%] 67.5 [%] 32.1
Gemeente Bergen op Zoom 50 76.4 [%] 64.0 [%] 75.4
Gemeente Bergen op Zoom 70 100.0 [%] 100.0 [%] 4.6
Gemeente Bergen op Zoom 80 94.7 [%] 99.7 [%] 7.9
Gemeente Bergen op Zoom Totaal 77.8 [%] 69.1 [%] 87.9
Gemeente Berkelland 50 45.5 [%] 30.1 [%] 38.5
Gemeente Berkelland 80 90.9 [%] 98.1 [%] 13.0
Gemeente Berkelland Totaal 52.6 [%] 47.3 [%] 51.6
Gemeente Bernheze 50 88.5 [%] 84.0 [%] 10.4
Gemeente Bernheze 80 100.0 [%] 100.0 [%] 4.2
Gemeente Bernheze Totaal 90.9 [%] 88.6 [%] 14.6
Gemeente Best 50 84.9 [%] 73.9 [%] 37.2
Gemeente Best 70 100.0 [%] 100.0 [%] 0.0
Gemeente Best 80 90.6 [%] 71.0 [%] 10.0
Gemeente Best Totaal 85.5 [%] 73.3 [%] 47.2
Gemeente Beuningen 50 76.4 [%] 64.6 [%] 24.2
Gemeente Beuningen 80 100.0 [%] 100.0 [%] 5.0
Gemeente Beuningen Totaal 80.1 [%] 70.6 [%] 29.2
Gemeente Beverwijk 50 69.5 [%] 64.6 [%] 57.1
Gemeente Beverwijk 80 100.0 [%] 100.0 [%] 3.9
Gemeente Beverwijk Totaal 70.5 [%] 66.9 [%] 61.0
Gemeente Bladel 50 57.7 [%] 45.4 [%] 35.5
Gemeente Bladel 80 100.0 [%] 100.0 [%] 0.3
Gemeente Bladel Totaal 58.3 [%] 46.0 [%] 35.9
Gemeente Blaricum 50 62.1 [%] 62.4 [%] 13.3
Gemeente Blaricum 80 100.0 [%] 100.0 [%] 0.2
Gemeente Blaricum Totaal 62.8 [%] 62.9 [%] 13.5
Gemeente Bloemendaal 50 76.6 [%] 66.4 [%] 24.9
Gemeente Bloemendaal Totaal 76.6 [%] 66.4 [%] 24.9
Gemeente Bodegraven-Reeuwijk 50 51.0 [%] 40.7 [%] 25.6
Gemeente Bodegraven-Reeuwijk 70 100.0 [%] 100.0 [%] 1.2
Gemeente Bodegraven-Reeuwijk 80 92.0 [%] 95.2 [%] 4.9
Gemeente Bodegraven-Reeuwijk Totaal 54.9 [%] 51.3 [%] 31.6
Gemeente Boekel 50 53.4 [%] 53.2 [%] 8.3
Gemeente Boekel 80 90.0 [%] 75.4 [%] 0.5
Gemeente Boekel Totaal 57.1 [%] 54.5 [%] 8.8
Gemeente Borger-Odoorn 50 50.3 [%] 48.3 [%] 73.4
Gemeente Borger-Odoorn 70 75.0 [%] 97.6 [%] 1.2
Gemeente Borger-Odoorn 80 84.9 [%] 85.7 [%] 25.8
Gemeente Borger-Odoorn Totaal 54.0 [%] 58.5 [%] 100.4
Gemeente Borne 50 47.7 [%] 30.7 [%] 25.2
Gemeente Borne 80 96.2 [%] 97.6 [%] 6.3
Gemeente Borne Totaal 54.8 [%] 44.0 [%] 31.4
Gemeente Borsele 50 32.7 [%] 28.9 [%] 16.7
Gemeente Borsele 80 73.3 [%] 37.0 [%] 1.5
Gemeente Borsele Totaal 36.1 [%] 29.6 [%] 18.1
Gemeente Boxtel 50 52.5 [%] 31.1 [%] 30.7
Gemeente Boxtel 80 98.4 [%] 92.0 [%] 6.4
Gemeente Boxtel Totaal 59.4 [%] 41.6 [%] 37.1
Gemeente Breda 50 71.3 [%] 60.4 [%] 247.7
Gemeente Breda 70 100.0 [%] 100.0 [%] 40.1
Gemeente Breda 80 51.2 [%] 59.4 [%] 11.4
Gemeente Breda Totaal 73.2 [%] 65.6 [%] 299.2
Gemeente Bronckhorst 50 32.8 [%] 19.8 [%] 26.4
Gemeente Bronckhorst 80 85.7 [%] 87.1 [%] 13.6
Gemeente Bronckhorst Totaal 42.1 [%] 42.7 [%] 40.0
Gemeente Brummen 50 42.6 [%] 16.1 [%] 6.6
Gemeente Brummen 80 40.0 [%] 7.7 [%] 8.3
Gemeente Brummen Totaal 41.7 [%] 11.4 [%] 14.8
Gemeente Brunssum 50 74.6 [%] 62.3 [%] 38.3
Gemeente Brunssum 80 84.6 [%] 81.6 [%] 3.5
Gemeente Brunssum Totaal 75.0 [%] 63.9 [%] 41.8
Gemeente Bunnik 50 69.1 [%] 64.1 [%] 10.5
Gemeente Bunnik 80 76.2 [%] 79.5 [%] 3.2
Gemeente Bunnik Totaal 70.1 [%] 67.7 [%] 13.8
Gemeente Bunschoten 50 82.6 [%] 79.4 [%] 10.1
Gemeente Bunschoten 80 83.3 [%] 97.9 [%] 1.5
Gemeente Bunschoten Totaal 82.6 [%] 81.9 [%] 11.7
Gemeente Buren 50 37.9 [%] 14.2 [%] 12.5
Gemeente Buren 80 80.0 [%] 63.3 [%] 0.9
Gemeente Buren Totaal 40.0 [%] 17.5 [%] 13.4
Gemeente Capelle aan den IJssel 50 87.8 [%] 88.3 [%] 63.2
Gemeente Capelle aan den IJssel 70 100.0 [%] 100.0 [%] 5.2
Gemeente Capelle aan den IJssel Totaal 88.2 [%] 89.2 [%] 68.3
Gemeente Castricum 50 86.9 [%] 77.7 [%] 19.6
Gemeente Castricum 80 95.0 [%] 33.4 [%] 1.9
Gemeente Castricum Totaal 87.4 [%] 73.9 [%] 21.5
Gemeente Coevorden 50 33.4 [%] 26.3 [%] 88.5
Gemeente Coevorden 70 100.0 [%] 100.0 [%] 0.1
Gemeente Coevorden 80 25.2 [%] 13.0 [%] 263.8
Gemeente Coevorden Totaal 30.0 [%] 16.4 [%] 352.4
Gemeente Cranendonck 50 37.4 [%] 25.6 [%] 33.6
Gemeente Cranendonck 80 92.2 [%] 91.4 [%] 12.4
Gemeente Cranendonck Totaal 47.5 [%] 43.3 [%] 46.1
Gemeente Culemborg 50 67.6 [%] 49.6 [%] 37.2
Gemeente Culemborg 80 100.0 [%] 100.0 [%] 0.8
Gemeente Culemborg Totaal 67.9 [%] 50.7 [%] 38.0
Gemeente Dalfsen 50 53.0 [%] 24.8 [%] 23.1
Gemeente Dalfsen 70 100.0 [%] 100.0 [%] 0.0
Gemeente Dalfsen 80 92.6 [%] 95.0 [%] 20.4
Gemeente Dalfsen Totaal 62.1 [%] 57.8 [%] 43.5
Gemeente Dantumadiel 50 17.4 [%] 11.4 [%] 22.3
Gemeente Dantumadiel 80 87.8 [%] 80.6 [%] 10.9
Gemeente Dantumadiel Totaal 32.2 [%] 34.1 [%] 33.1
Gemeente De Bilt 50 68.8 [%] 58.3 [%] 38.1
Gemeente De Bilt 80 75.7 [%] 69.9 [%] 7.2
Gemeente De Bilt Totaal 69.3 [%] 60.2 [%] 45.3
Gemeente De Fryske Marren 50 30.6 [%] 21.8 [%] 43.0
Gemeente De Fryske Marren 70 50.0 [%] 58.8 [%] 0.2
Gemeente De Fryske Marren 80 63.6 [%] 53.7 [%] 66.0
Gemeente De Fryske Marren Totaal 42.6 [%] 41.2 [%] 109.3
Gemeente De Ronde Venen 50 56.2 [%] 44.4 [%] 40.1
Gemeente De Ronde Venen 80 65.7 [%] 79.5 [%] 9.6
Gemeente De Ronde Venen Totaal 57.1 [%] 51.2 [%] 49.7
Gemeente De Wolden 50 24.1 [%] 19.2 [%] 33.3
Gemeente De Wolden 80 71.0 [%] 79.0 [%] 28.2
Gemeente De Wolden Totaal 35.4 [%] 46.6 [%] 61.4
Gemeente Delft 50 75.3 [%] 74.8 [%] 74.6
Gemeente Delft 70 100.0 [%] 100.0 [%] 4.7
Gemeente Delft 80 22.2 [%] 16.6 [%] 3.7
Gemeente Delft Totaal 74.7 [%] 73.7 [%] 82.9
Gemeente Den Helder 50 44.4 [%] 41.5 [%] 119.0
Gemeente Den Helder 70 100.0 [%] 100.0 [%] 3.1
Gemeente Den Helder 80 78.1 [%] 57.2 [%] 4.2
Gemeente Den Helder Totaal 45.3 [%] 43.5 [%] 126.3
Gemeente Deurne 50 64.1 [%] 43.2 [%] 48.6
Gemeente Deurne 80 95.0 [%] 87.1 [%] 31.5
Gemeente Deurne Totaal 70.4 [%] 60.5 [%] 80.2
Gemeente Deventer 50 72.7 [%] 62.2 [%] 124.7
Gemeente Deventer 80 60.6 [%] 78.3 [%] 5.8
Gemeente Deventer Totaal 72.1 [%] 62.9 [%] 130.5
Gemeente Diemen 50 72.5 [%] 70.7 [%] 25.9
Gemeente Diemen 70 97.5 [%] 99.0 [%] 14.5
Gemeente Diemen 80 100.0 [%] 100.0 [%] 0.5
Gemeente Diemen Totaal 77.2 [%] 81.1 [%] 40.8
Gemeente Dijk en Waard 50 75.3 [%] 63.7 [%] 104.1
Gemeente Dijk en Waard 70 100.0 [%] 100.0 [%] 1.2
Gemeente Dijk en Waard 80 98.2 [%] 99.7 [%] 6.0
Gemeente Dijk en Waard Totaal 76.4 [%] 66.1 [%] 111.2
Gemeente Dinkelland 50 34.0 [%] 22.4 [%] 29.1
Gemeente Dinkelland 70 96.7 [%] 99.9 [%] 7.2
Gemeente Dinkelland 80 53.8 [%] 42.9 [%] 11.3
Gemeente Dinkelland Totaal 41.5 [%] 38.9 [%] 47.6
Gemeente Doesburg 50 44.8 [%] 45.4 [%] 9.8
Gemeente Doesburg 80 100.0 [%] 100.0 [%] 0.0
Gemeente Doesburg Totaal 45.8 [%] 45.7 [%] 9.8
Gemeente Doetinchem 50 73.5 [%] 56.5 [%] 81.2
Gemeente Doetinchem 70 100.0 [%] 100.0 [%] 4.1
Gemeente Doetinchem 80 91.4 [%] 95.5 [%] 9.7
Gemeente Doetinchem Totaal 74.8 [%] 62.4 [%] 95.0
Gemeente Dongen 50 55.0 [%] 43.2 [%] 37.7
Gemeente Dongen 80 84.3 [%] 58.3 [%] 9.8
Gemeente Dongen Totaal 58.3 [%] 46.3 [%] 47.5
Gemeente Dordrecht 50 68.6 [%] 67.0 [%] 129.4
Gemeente Dordrecht 80 100.0 [%] 100.0 [%] 2.1
Gemeente Dordrecht Totaal 68.8 [%] 67.5 [%] 131.5
Gemeente Drechterland 50 19.4 [%] 8.8 [%] 36.6
Gemeente Drechterland 80 82.4 [%] 89.8 [%] 1.2
Gemeente Drechterland Totaal 26.1 [%] 11.5 [%] 37.8
Gemeente Drimmelen 50 67.8 [%] 60.9 [%] 12.4
Gemeente Drimmelen 80 94.9 [%] 96.8 [%] 7.2
Gemeente Drimmelen Totaal 75.4 [%] 74.1 [%] 19.6
Gemeente Dronten 50 59.9 [%] 43.5 [%] 64.0
Gemeente Dronten 80 49.0 [%] 22.1 [%] 234.9
Gemeente Dronten Totaal 56.3 [%] 26.7 [%] 299.0
Gemeente Druten 50 75.0 [%] 57.9 [%] 17.8
Gemeente Druten 80 93.5 [%] 99.8 [%] 5.4
Gemeente Druten Totaal 77.1 [%] 67.6 [%] 23.1
Gemeente Duiven 50 78.9 [%] 57.9 [%] 30.3
Gemeente Duiven 80 96.0 [%] 97.6 [%] 6.6
Gemeente Duiven Totaal 81.6 [%] 65.1 [%] 36.9
Gemeente Echt-Susteren 50 55.5 [%] 40.3 [%] 34.8
Gemeente Echt-Susteren 80 55.6 [%] 24.1 [%] 24.4
Gemeente Echt-Susteren Totaal 55.5 [%] 33.6 [%] 59.2
Gemeente Edam-Volendam 50 53.0 [%] 36.9 [%] 26.4
Gemeente Edam-Volendam Totaal 53.0 [%] 36.9 [%] 26.4
Gemeente Ede 50 72.0 [%] 60.1 [%] 130.0
Gemeente Ede 80 76.3 [%] 68.6 [%] 26.3
Gemeente Ede Totaal 72.3 [%] 61.5 [%] 156.3
Gemeente Eemnes 50 76.7 [%] 78.0 [%] 8.8
Gemeente Eemnes 80 100.0 [%] 100.0 [%] 1.1
Gemeente Eemnes Totaal 77.8 [%] 80.5 [%] 9.9
Gemeente Eemsdelta 50 63.1 [%] 44.7 [%] 68.0
Gemeente Eemsdelta 80 70.0 [%] 45.1 [%] 2.5
Gemeente Eemsdelta Totaal 63.3 [%] 44.7 [%] 70.5
Gemeente Eersel 50 63.3 [%] 44.3 [%] 18.0
Gemeente Eersel 80 87.5 [%] 98.7 [%] 0.9
Gemeente Eersel Totaal 64.2 [%] 46.9 [%] 18.9
Gemeente Eijsden-Margraten 50 40.2 [%] 28.8 [%] 22.9
Gemeente Eijsden-Margraten 80 86.2 [%] 98.7 [%] 3.7
Gemeente Eijsden-Margraten Totaal 45.8 [%] 38.5 [%] 26.6
Gemeente Eindhoven 50 93.2 [%] 88.5 [%] 212.8
Gemeente Eindhoven 70 100.0 [%] 100.0 [%] 46.2
Gemeente Eindhoven 80 88.1 [%] 79.0 [%] 21.5
Gemeente Eindhoven Totaal 93.7 [%] 89.7 [%] 280.5
Gemeente Elburg 50 45.8 [%] 35.9 [%] 12.3
Gemeente Elburg 80 40.0 [%] 9.9 [%] 0.4
Gemeente Elburg Totaal 45.6 [%] 35.1 [%] 12.7
Gemeente Emmen 50 59.4 [%] 46.0 [%] 256.3
Gemeente Emmen 70 100.0 [%] 100.0 [%] 0.9
Gemeente Emmen 80 90.3 [%] 83.7 [%] 62.9
Gemeente Emmen Totaal 62.4 [%] 53.5 [%] 320.2
Gemeente Enkhuizen 50 30.2 [%] 20.9 [%] 21.2
Gemeente Enkhuizen 80 50.0 [%] 73.2 [%] 0.1
Gemeente Enkhuizen Totaal 30.4 [%] 21.2 [%] 21.3
Gemeente Enschede 50 73.8 [%] 62.4 [%] 169.7
Gemeente Enschede 70 100.0 [%] 100.0 [%] 3.9
Gemeente Enschede 80 84.2 [%] 79.1 [%] 14.8
Gemeente Enschede Totaal 74.6 [%] 64.5 [%] 188.3
Gemeente Epe 50 62.8 [%] 46.8 [%] 21.1
Gemeente Epe 80 100.0 [%] 100.0 [%] 3.8
Gemeente Epe Totaal 67.6 [%] 54.8 [%] 24.8
Gemeente Ermelo 50 61.2 [%] 37.2 [%] 24.5
Gemeente Ermelo 70 0.0 [%] 0.0 [%] 0.5
Gemeente Ermelo 80 81.4 [%] 85.0 [%] 14.8
Gemeente Ermelo Totaal 63.2 [%] 54.4 [%] 39.8
Gemeente Etten-Leur 50 80.8 [%] 64.3 [%] 55.8
Gemeente Etten-Leur 80 76.9 [%] 87.3 [%] 1.3
Gemeente Etten-Leur Totaal 80.7 [%] 64.9 [%] 57.1
Gemeente Geertruidenberg 50 71.3 [%] 46.4 [%] 38.6
Gemeente Geertruidenberg 80 87.0 [%] 70.4 [%] 4.6
Gemeente Geertruidenberg Totaal 72.1 [%] 49.0 [%] 43.1
Gemeente Geldrop-Mierlo 50 89.8 [%] 86.8 [%] 32.2
Gemeente Geldrop-Mierlo 80 97.1 [%] 99.7 [%] 3.6
Gemeente Geldrop-Mierlo Totaal 90.3 [%] 88.1 [%] 35.8
Gemeente Gemert-Bakel 50 57.6 [%] 58.8 [%] 15.4
Gemeente Gemert-Bakel 80 88.5 [%] 81.1 [%] 40.0
Gemeente Gemert-Bakel Totaal 71.3 [%] 74.9 [%] 55.5
Gemeente Gennep 50 51.6 [%] 39.4 [%] 16.8
Gemeente Gennep 80 29.1 [%] 24.3 [%] 34.3
Gemeente Gennep Totaal 40.8 [%] 29.2 [%] 51.1
Gemeente Gilze en Rijen 50 55.0 [%] 30.1 [%] 30.8
Gemeente Gilze en Rijen 80 85.7 [%] 70.0 [%] 1.1
Gemeente Gilze en Rijen Totaal 56.2 [%] 31.4 [%] 31.8
Gemeente Goeree-Overflakkee 50 55.8 [%] 47.5 [%] 33.7
Gemeente Goeree-Overflakkee 70 100.0 [%] 100.0 [%] 0.0
Gemeente Goeree-Overflakkee 80 96.2 [%] 99.6 [%] 3.3
Gemeente Goeree-Overflakkee Totaal 58.6 [%] 52.1 [%] 37.0
Gemeente Goes 50 70.1 [%] 57.0 [%] 48.5
Gemeente Goes 70 100.0 [%] 100.0 [%] 0.1
Gemeente Goes 80 79.4 [%] 70.4 [%] 4.0
Gemeente Goes Totaal 70.7 [%] 58.1 [%] 52.5
Gemeente Goirle 50 66.7 [%] 56.9 [%] 20.0
Gemeente Goirle 80 100.0 [%] 100.0 [%] 9.2
Gemeente Goirle Totaal 71.2 [%] 70.5 [%] 29.3
Gemeente Gooise Meren 50 82.0 [%] 73.0 [%] 45.7
Gemeente Gooise Meren 80 82.5 [%] 79.2 [%] 16.2
Gemeente Gooise Meren Totaal 82.1 [%] 74.6 [%] 61.9
Gemeente Gorinchem 50 69.0 [%] 58.3 [%] 33.7
Gemeente Gorinchem 80 100.0 [%] 100.0 [%] 1.5
Gemeente Gorinchem Totaal 69.6 [%] 60.0 [%] 35.2
Gemeente Gouda 50 69.0 [%] 61.5 [%] 64.8
Gemeente Gouda 80 28.6 [%] 20.6 [%] 0.6
Gemeente Gouda Totaal 68.4 [%] 61.1 [%] 65.3
Gemeente Groningen 50 65.6 [%] 55.6 [%] 269.2
Gemeente Groningen 70 89.3 [%] 97.0 [%] 7.7
Gemeente Groningen 80 45.2 [%] 8.7 [%] 3.9
Gemeente Groningen Totaal 65.6 [%] 56.1 [%] 280.8
Gemeente Gulpen-Wittem 50 12.6 [%] 3.8 [%] 22.6
Gemeente Gulpen-Wittem 80 17.1 [%] 2.2 [%] 22.0
Gemeente Gulpen-Wittem Totaal 13.9 [%] 3.0 [%] 44.6
Gemeente Haaksbergen 50 54.5 [%] 35.8 [%] 38.3
Gemeente Haaksbergen 70 100.0 [%] 100.0 [%] 6.3
Gemeente Haaksbergen 80 87.8 [%] 86.1 [%] 10.7
Gemeente Haaksbergen Totaal 61.3 [%] 52.9 [%] 55.4
Gemeente Haarlem 50 74.8 [%] 70.2 [%] 129.7
Gemeente Haarlem 70 100.0 [%] 100.0 [%] 1.4
Gemeente Haarlem 80 100.0 [%] 100.0 [%] 0.0
Gemeente Haarlem Totaal 75.1 [%] 70.5 [%] 131.2
Gemeente Haarlemmermeer 50 64.3 [%] 50.2 [%] 254.7
Gemeente Haarlemmermeer 70 100.0 [%] 100.0 [%] 5.0
Gemeente Haarlemmermeer 80 90.5 [%] 91.7 [%] 31.9
Gemeente Haarlemmermeer Totaal 66.8 [%] 55.6 [%] 291.6
Gemeente Halderberge 50 54.8 [%] 38.4 [%] 33.5
Gemeente Halderberge 70 100.0 [%] 100.0 [%] 1.8
Gemeente Halderberge 80 59.2 [%] 29.8 [%] 11.7
Gemeente Halderberge Totaal 57.3 [%] 38.6 [%] 47.0
Gemeente Hardenberg 50 46.8 [%] 33.7 [%] 106.6
Gemeente Hardenberg 70 100.0 [%] 100.0 [%] 1.5
Gemeente Hardenberg 80 95.2 [%] 99.2 [%] 15.4
Gemeente Hardenberg Totaal 50.6 [%] 42.7 [%] 123.5
Gemeente Harderwijk 50 77.9 [%] 64.0 [%] 56.9
Gemeente Harderwijk 80 60.8 [%] 35.2 [%] 11.8
Gemeente Harderwijk Totaal 76.8 [%] 59.0 [%] 68.7
Gemeente Hardinxveld-Giessendam 50 73.9 [%] 66.3 [%] 16.7
Gemeente Hardinxveld-Giessendam 80 0.0 [%] 0.0 [%] 0.0
Gemeente Hardinxveld-Giessendam Totaal 73.5 [%] 66.3 [%] 16.7
Gemeente Harlingen 50 67.6 [%] 49.2 [%] 22.1
Gemeente Harlingen 80 70.0 [%] 73.1 [%] 4.6
Gemeente Harlingen Totaal 67.9 [%] 53.4 [%] 26.7
Gemeente Hattem 50 76.5 [%] 58.0 [%] 5.6
Gemeente Hattem 80 100.0 [%] 100.0 [%] 3.5
Gemeente Hattem Totaal 83.6 [%] 74.2 [%] 9.0
Gemeente Heemskerk 50 51.4 [%] 44.7 [%] 42.1
Gemeente Heemskerk 80 80.0 [%] 99.3 [%] 0.7
Gemeente Heemskerk Totaal 51.6 [%] 45.7 [%] 42.8
Gemeente Heemstede 50 83.0 [%] 83.4 [%] 29.3
Gemeente Heemstede 80 100.0 [%] 100.0 [%] 0.2
Gemeente Heemstede Totaal 83.0 [%] 83.6 [%] 29.5
Gemeente Heerde 50 50.3 [%] 32.2 [%] 14.7
Gemeente Heerde 80 85.4 [%] 83.2 [%] 7.6
Gemeente Heerde Totaal 57.7 [%] 49.6 [%] 22.3
Gemeente Heerenveen 50 51.6 [%] 38.2 [%] 104.2
Gemeente Heerenveen 80 90.2 [%] 96.3 [%] 14.1
Gemeente Heerenveen Totaal 53.2 [%] 45.1 [%] 118.4
Gemeente Heerlen 50 64.1 [%] 48.9 [%] 149.5
Gemeente Heerlen 70 91.9 [%] 98.9 [%] 13.8
Gemeente Heerlen 80 76.5 [%] 86.5 [%] 9.2
Gemeente Heerlen Totaal 65.5 [%] 55.0 [%] 172.5
Gemeente Heeze-Leende 50 58.0 [%] 45.3 [%] 18.6
Gemeente Heeze-Leende 70 0.0 [%] 0.0 [%] 0.1
Gemeente Heeze-Leende 80 73.3 [%] 80.1 [%] 8.4
Gemeente Heeze-Leende Totaal 58.8 [%] 56.0 [%] 27.1
Gemeente Heiloo 50 80.7 [%] 80.7 [%] 22.2
Gemeente Heiloo 80 100.0 [%] 100.0 [%] 1.4
Gemeente Heiloo Totaal 80.9 [%] 81.9 [%] 23.6
Gemeente Hellendoorn 50 50.6 [%] 37.2 [%] 44.9
Gemeente Hellendoorn 80 93.2 [%] 91.3 [%] 22.7
Gemeente Hellendoorn Totaal 58.8 [%] 55.3 [%] 67.6
Gemeente Helmond 50 67.8 [%] 56.7 [%] 185.6
Gemeente Helmond 70 100.0 [%] 100.0 [%] 9.1
Gemeente Helmond 80 88.5 [%] 72.0 [%] 20.7
Gemeente Helmond Totaal 69.4 [%] 60.0 [%] 215.3
Gemeente Hendrik-Ido-Ambacht 50 68.0 [%] 59.2 [%] 32.1
Gemeente Hendrik-Ido-Ambacht Totaal 68.0 [%] 59.2 [%] 32.1
Gemeente Hengelo (O) 50 67.5 [%] 54.3 [%] 136.6
Gemeente Hengelo (O) 80 93.9 [%] 97.2 [%] 5.0
Gemeente Hengelo (O) Totaal 68.2 [%] 55.8 [%] 141.6
Gemeente Het Hogeland 50 26.7 [%] 15.2 [%] 48.5
Gemeente Het Hogeland 70 0.0 [%] 0.0 [%] 0.0
Gemeente Het Hogeland 80 13.4 [%] 7.8 [%] 178.9
Gemeente Het Hogeland Totaal 20.4 [%] 9.4 [%] 227.4
Gemeente Heumen 50 65.0 [%] 41.1 [%] 9.7
Gemeente Heumen 80 66.7 [%] 54.6 [%] 4.4
Gemeente Heumen Totaal 65.2 [%] 45.3 [%] 14.0
Gemeente Heusden 50 51.2 [%] 36.4 [%] 41.8
Gemeente Heusden 70 100.0 [%] 100.0 [%] 3.6
Gemeente Heusden 80 76.6 [%] 80.6 [%] 8.0
Gemeente Heusden Totaal 56.8 [%] 47.3 [%] 53.4
Gemeente Hillegom 50 88.9 [%] 79.9 [%] 13.0
Gemeente Hillegom Totaal 88.9 [%] 79.9 [%] 13.0
Gemeente Hilvarenbeek 50 81.8 [%] 67.0 [%] 2.9
Gemeente Hilvarenbeek 70 100.0 [%] 100.0 [%] 0.1
Gemeente Hilvarenbeek 80 97.8 [%] 99.4 [%] 2.9
Gemeente Hilvarenbeek Totaal 90.1 [%] 83.4 [%] 5.9
Gemeente Hilversum 50 69.2 [%] 61.4 [%] 97.9
Gemeente Hilversum 80 61.8 [%] 39.3 [%] 4.6
Gemeente Hilversum Totaal 69.1 [%] 60.4 [%] 102.6
Gemeente Hoeksche Waard 50 36.3 [%] 26.6 [%] 117.2
Gemeente Hoeksche Waard 80 72.7 [%] 92.5 [%] 3.8
Gemeente Hoeksche Waard Totaal 36.9 [%] 28.7 [%] 121.0
Gemeente Hof van Twente 50 45.8 [%] 27.4 [%] 31.6
Gemeente Hof van Twente 80 83.1 [%] 70.2 [%] 10.8
Gemeente Hof van Twente Totaal 52.7 [%] 38.2 [%] 42.3
Gemeente Hollands Kroon 50 42.9 [%] 27.4 [%] 59.8
Gemeente Hollands Kroon 80 95.9 [%] 99.0 [%] 27.8
Gemeente Hollands Kroon Totaal 52.3 [%] 50.1 [%] 87.6
Gemeente Hoogeveen 50 80.0 [%] 63.3 [%] 91.8
Gemeente Hoogeveen 70 100.0 [%] 100.0 [%] 3.2
Gemeente Hoogeveen 80 100.0 [%] 100.0 [%] 1.2
Gemeente Hoogeveen Totaal 80.6 [%] 65.0 [%] 96.2
Gemeente Hoorn 50 56.2 [%] 50.4 [%] 88.7
Gemeente Hoorn 70 100.0 [%] 100.0 [%] 8.6
Gemeente Hoorn 80 97.1 [%] 97.9 [%] 2.1
Gemeente Hoorn Totaal 59.7 [%] 55.7 [%] 99.3
Gemeente Horst aan de Maas 50 36.3 [%] 20.7 [%] 50.0
Gemeente Horst aan de Maas 80 76.0 [%] 81.1 [%] 37.9
Gemeente Horst aan de Maas Totaal 46.1 [%] 46.7 [%] 87.9
Gemeente Houten 50 65.2 [%] 44.6 [%] 29.8
Gemeente Houten 70 88.4 [%] 97.3 [%] 28.2
Gemeente Houten 80 93.8 [%] 99.6 [%] 2.4
Gemeente Houten Totaal 75.0 [%] 71.4 [%] 60.3
Gemeente Huizen 50 84.1 [%] 75.8 [%] 37.7
Gemeente Huizen 80 55.6 [%] 80.4 [%] 0.8
Gemeente Huizen Totaal 83.8 [%] 75.9 [%] 38.5
Gemeente Hulst 50 31.8 [%] 23.2 [%] 48.4
Gemeente Hulst 80 50.0 [%] 23.9 [%] 7.8
Gemeente Hulst Totaal 34.8 [%] 23.3 [%] 56.2
Gemeente IJsselstein 50 45.0 [%] 41.0 [%] 33.5
Gemeente IJsselstein 70 100.0 [%] 100.0 [%] 1.1
Gemeente IJsselstein 80 50.0 [%] 42.6 [%] 2.1
Gemeente IJsselstein Totaal 45.4 [%] 42.9 [%] 36.8
Gemeente Kaag en Braassem 50 25.4 [%] 21.4 [%] 39.9
Gemeente Kaag en Braassem 80 84.8 [%] 86.5 [%] 6.9
Gemeente Kaag en Braassem Totaal 32.1 [%] 31.0 [%] 46.8
Gemeente Kampen 50 64.0 [%] 41.2 [%] 46.3
Gemeente Kampen 80 90.5 [%] 96.3 [%] 3.0
Gemeente Kampen Totaal 65.2 [%] 44.5 [%] 49.4
Gemeente Kapelle 50 23.5 [%] 13.7 [%] 4.1
Gemeente Kapelle 80 69.2 [%] 49.9 [%] 1.7
Gemeente Kapelle Totaal 36.2 [%] 24.6 [%] 5.8
Gemeente Katwijk 50 82.2 [%] 61.2 [%] 43.2
Gemeente Katwijk 70 100.0 [%] 100.0 [%] 0.0
Gemeente Katwijk 80 75.0 [%] 6.1 [%] 0.8
Gemeente Katwijk Totaal 82.2 [%] 60.2 [%] 44.1
Gemeente Kerkrade 50 64.2 [%] 51.1 [%] 68.7
Gemeente Kerkrade 70 100.0 [%] 100.0 [%] 2.9
Gemeente Kerkrade 80 87.2 [%] 89.7 [%] 6.0
Gemeente Kerkrade Totaal 66.3 [%] 55.9 [%] 77.6
Gemeente Koggenland 50 30.5 [%] 10.6 [%] 42.6
Gemeente Koggenland 70 100.0 [%] 100.0 [%] 0.6
Gemeente Koggenland 80 96.3 [%] 99.2 [%] 2.6
Gemeente Koggenland Totaal 40.1 [%] 16.7 [%] 45.7
Gemeente Krimpen aan den IJssel 50 49.4 [%] 44.5 [%] 26.2
Gemeente Krimpen aan den IJssel Totaal 49.4 [%] 44.5 [%] 26.2
Gemeente Krimpenerwaard 50 22.1 [%] 14.2 [%] 20.0
Gemeente Krimpenerwaard 80 66.7 [%] 27.3 [%] 0.2
Gemeente Krimpenerwaard Totaal 22.7 [%] 14.3 [%] 20.2
Gemeente Laarbeek 50 70.1 [%] 73.9 [%] 8.0
Gemeente Laarbeek 80 76.0 [%] 64.5 [%] 8.4
Gemeente Laarbeek Totaal 71.7 [%] 69.1 [%] 16.4
Gemeente Land van Cuijk 50 63.2 [%] 44.9 [%] 88.7
Gemeente Land van Cuijk 70 100.0 [%] 100.0 [%] 0.4
Gemeente Land van Cuijk 80 76.7 [%] 82.5 [%] 45.2
Gemeente Land van Cuijk Totaal 65.9 [%] 57.7 [%] 134.3
Gemeente Landgraaf 50 69.8 [%] 54.1 [%] 32.1
Gemeente Landgraaf 70 92.3 [%] 97.8 [%] 3.6
Gemeente Landgraaf 80 89.4 [%] 78.1 [%] 5.3
Gemeente Landgraaf Totaal 72.1 [%] 61.0 [%] 41.0
Gemeente Landsmeer 50 50.0 [%] 26.5 [%] 8.6
Gemeente Landsmeer 80 35.7 [%] 51.5 [%] 1.7
Gemeente Landsmeer Totaal 45.7 [%] 30.7 [%] 10.3
Gemeente Lansingerland 50 84.2 [%] 75.8 [%] 61.0
Gemeente Lansingerland 80 100.0 [%] 100.0 [%] 8.2
Gemeente Lansingerland Totaal 84.7 [%] 78.7 [%] 69.2
Gemeente Laren 50 78.1 [%] 58.9 [%] 6.1
Gemeente Laren 80 78.6 [%] 44.3 [%] 2.5
Gemeente Laren Totaal 78.2 [%] 54.6 [%] 8.6
Gemeente Leeuwarden 50 71.6 [%] 57.1 [%] 167.1
Gemeente Leeuwarden 70 100.0 [%] 100.0 [%] 10.8
Gemeente Leeuwarden 80 66.3 [%] 65.1 [%] 28.7
Gemeente Leeuwarden Totaal 71.9 [%] 60.4 [%] 206.6
Gemeente Leiden 50 83.1 [%] 80.6 [%] 91.6
Gemeente Leiden 80 83.3 [%] 98.6 [%] 2.0
Gemeente Leiden Totaal 83.1 [%] 81.0 [%] 93.6
Gemeente Leiderdorp 50 67.6 [%] 74.5 [%] 23.8
Gemeente Leiderdorp 80 80.0 [%] 93.7 [%] 0.2
Gemeente Leiderdorp Totaal 67.8 [%] 74.7 [%] 24.0
Gemeente Leidschendam-Voorburg 50 79.7 [%] 77.8 [%] 59.3
Gemeente Leidschendam-Voorburg 70 42.9 [%] 15.5 [%] 0.4
Gemeente Leidschendam-Voorburg 80 100.0 [%] 100.0 [%] 0.2
Gemeente Leidschendam-Voorburg Totaal 79.5 [%] 77.5 [%] 59.9
Gemeente Lelystad 50 69.6 [%] 58.4 [%] 130.1
Gemeente Lelystad 70 100.0 [%] 100.0 [%] 33.8
Gemeente Lelystad 80 50.0 [%] 35.1 [%] 136.8
Gemeente Lelystad Totaal 68.7 [%] 52.5 [%] 300.7
Gemeente Leudal 50 43.8 [%] 28.5 [%] 30.0
Gemeente Leudal 80 83.8 [%] 79.1 [%] 32.9
Gemeente Leudal Totaal 56.2 [%] 54.9 [%] 62.9
Gemeente Leusden 50 80.5 [%] 76.3 [%] 31.4
Gemeente Leusden 80 75.0 [%] 82.0 [%] 1.7
Gemeente Leusden Totaal 80.4 [%] 76.6 [%] 33.2
Gemeente Lingewaard 50 56.2 [%] 39.9 [%] 52.5
Gemeente Lingewaard 80 39.5 [%] 23.2 [%] 32.4
Gemeente Lingewaard Totaal 52.7 [%] 33.6 [%] 84.9
Gemeente Lisse 50 77.1 [%] 67.4 [%] 11.4
Gemeente Lisse Totaal 77.1 [%] 67.4 [%] 11.4
Gemeente Lochem 50 54.5 [%] 38.3 [%] 22.4
Gemeente Lochem 80 84.2 [%] 98.6 [%] 3.5
Gemeente Lochem Totaal 56.6 [%] 46.5 [%] 25.9
Gemeente Loon op Zand 50 52.1 [%] 46.5 [%] 22.0
Gemeente Loon op Zand 80 96.9 [%] 98.0 [%] 5.9
Gemeente Loon op Zand Totaal 60.3 [%] 57.3 [%] 27.9
Gemeente Lopik 50 5.2 [%] 1.0 [%] 10.8
Gemeente Lopik 80 20.0 [%] 0.9 [%] 1.7
Gemeente Lopik Totaal 6.1 [%] 1.0 [%] 12.5
Gemeente Losser 50 52.7 [%] 42.1 [%] 18.8
Gemeente Losser 80 72.2 [%] 66.7 [%] 2.4
Gemeente Losser Totaal 53.9 [%] 44.8 [%] 21.2
Gemeente Maasdriel 50 24.2 [%] 10.9 [%] 42.0
Gemeente Maasdriel 70 100.0 [%] 100.0 [%] 0.3
Gemeente Maasdriel 80 54.7 [%] 28.4 [%] 27.7
Gemeente Maasdriel Totaal 32.3 [%] 18.3 [%] 70.0
Gemeente Maasgouw 50 34.0 [%] 20.2 [%] 43.4
Gemeente Maasgouw 80 62.4 [%] 47.4 [%] 32.5
Gemeente Maasgouw Totaal 41.1 [%] 31.8 [%] 75.9
Gemeente Maashorst 50 71.3 [%] 59.1 [%] 56.9
Gemeente Maashorst 80 81.9 [%] 72.3 [%] 17.8
Gemeente Maashorst Totaal 72.8 [%] 62.2 [%] 74.7
Gemeente Maassluis 50 75.9 [%] 68.3 [%] 27.9
Gemeente Maassluis 80 37.5 [%] 59.2 [%] 1.2
Gemeente Maassluis Totaal 75.1 [%] 67.9 [%] 29.1
Gemeente Maastricht 50 72.2 [%] 65.7 [%] 152.9
Gemeente Maastricht 70 92.9 [%] 98.7 [%] 6.1
Gemeente Maastricht 80 82.6 [%] 91.4 [%] 4.3
Gemeente Maastricht Totaal 72.6 [%] 67.6 [%] 163.3
Gemeente Medemblik 50 44.0 [%] 34.7 [%] 88.9
Gemeente Medemblik 80 81.2 [%] 82.9 [%] 9.2
Gemeente Medemblik Totaal 47.5 [%] 39.2 [%] 98.1
Gemeente Meerssen 50 73.5 [%] 64.3 [%] 19.7
Gemeente Meerssen 80 81.0 [%] 61.4 [%] 2.7
Gemeente Meerssen Totaal 74.1 [%] 63.9 [%] 22.4
Gemeente Meierijstad 50 69.9 [%] 57.0 [%] 77.1
Gemeente Meierijstad 70 96.0 [%] 98.3 [%] 13.5
Gemeente Meierijstad 80 72.1 [%] 61.3 [%] 12.0
Gemeente Meierijstad Totaal 73.4 [%] 62.9 [%] 102.6
Gemeente Meppel 50 50.2 [%] 33.9 [%] 50.7
Gemeente Meppel 80 65.9 [%] 84.3 [%] 12.1
Gemeente Meppel Totaal 51.6 [%] 43.6 [%] 62.8
Gemeente Middelburg 50 62.3 [%] 53.9 [%] 57.7
Gemeente Middelburg 70 100.0 [%] 100.0 [%] 3.4
Gemeente Middelburg 80 92.9 [%] 83.0 [%] 1.9
Gemeente Middelburg Totaal 64.1 [%] 57.2 [%] 62.9
Gemeente Midden-Delfland 50 67.5 [%] 67.4 [%] 14.1
Gemeente Midden-Delfland 80 69.2 [%] 44.9 [%] 1.6
Gemeente Midden-Delfland Totaal 67.6 [%] 65.2 [%] 15.7
Gemeente Midden-Drenthe 50 59.1 [%] 38.6 [%] 45.6
Gemeente Midden-Drenthe 80 67.6 [%] 55.2 [%] 59.8
Gemeente Midden-Drenthe Totaal 61.2 [%] 48.0 [%] 105.4
Gemeente Midden-Groningen 50 49.2 [%] 31.9 [%] 110.7
Gemeente Midden-Groningen 70 0.0 [%] 0.0 [%] 0.2
Gemeente Midden-Groningen 80 63.3 [%] 46.2 [%] 25.0
Gemeente Midden-Groningen Totaal 50.5 [%] 34.5 [%] 135.9
Gemeente Moerdijk 50 47.5 [%] 26.6 [%] 35.9
Gemeente Moerdijk 80 96.0 [%] 99.3 [%] 21.6
Gemeente Moerdijk Totaal 64.9 [%] 53.9 [%] 57.5
Gemeente Molenlanden 50 23.3 [%] 21.0 [%] 21.4
Gemeente Molenlanden 80 75.0 [%] 43.9 [%] 0.4
Gemeente Molenlanden Totaal 24.5 [%] 21.3 [%] 21.8
Gemeente Montferland 50 42.0 [%] 19.7 [%] 20.0
Gemeente Montferland 80 94.4 [%] 88.0 [%] 12.8
Gemeente Montferland Totaal 60.4 [%] 46.4 [%] 32.8
Gemeente Montfoort 50 50.0 [%] 36.0 [%] 12.5
Gemeente Montfoort 80 60.0 [%] 5.9 [%] 0.6
Gemeente Montfoort Totaal 50.4 [%] 34.7 [%] 13.1
Gemeente Mook en Middelaar 50 30.9 [%] 17.8 [%] 18.2
Gemeente Mook en Middelaar 80 100.0 [%] 100.0 [%] 0.0
Gemeente Mook en Middelaar Totaal 31.7 [%] 17.9 [%] 18.2
Gemeente Neder-Betuwe 50 26.6 [%] 15.7 [%] 28.6
Gemeente Neder-Betuwe 80 94.9 [%] 80.4 [%] 15.0
Gemeente Neder-Betuwe Totaal 47.2 [%] 38.0 [%] 43.6
Gemeente Nederweert 50 24.0 [%] 20.8 [%] 14.9
Gemeente Nederweert 80 19.2 [%] 9.0 [%] 215.1
Gemeente Nederweert Totaal 20.0 [%] 9.8 [%] 230.0
Gemeente Nieuwegein 50 64.2 [%] 51.4 [%] 79.6
Gemeente Nieuwegein 70 98.8 [%] 99.5 [%] 11.6
Gemeente Nieuwegein 80 92.1 [%] 97.4 [%] 4.1
Gemeente Nieuwegein Totaal 67.8 [%] 59.2 [%] 95.3
Gemeente Nieuwkoop 50 17.7 [%] 8.4 [%] 29.7
Gemeente Nieuwkoop 80 66.7 [%] 69.9 [%] 3.8
Gemeente Nieuwkoop Totaal 20.2 [%] 15.3 [%] 33.5
Gemeente Nijkerk 50 64.8 [%] 47.6 [%] 53.5
Gemeente Nijkerk 80 87.5 [%] 98.6 [%] 2.6
Gemeente Nijkerk Totaal 65.4 [%] 50.0 [%] 56.1
Gemeente Nijmegen 50 74.7 [%] 69.9 [%] 229.0
Gemeente Nijmegen 70 100.0 [%] 100.0 [%] 5.3
Gemeente Nijmegen 80 81.6 [%] 72.5 [%] 14.0
Gemeente Nijmegen Totaal 75.1 [%] 70.7 [%] 248.3
Gemeente Nissewaard 50 70.6 [%] 55.8 [%] 76.1
Gemeente Nissewaard 70 100.0 [%] 100.0 [%] 0.1
Gemeente Nissewaard 80 94.4 [%] 99.2 [%] 4.0
Gemeente Nissewaard Totaal 71.6 [%] 58.0 [%] 80.2
Gemeente Noardeast-Fryslân 50 52.6 [%] 36.1 [%] 37.6
Gemeente Noardeast-Fryslân 80 22.2 [%] 15.9 [%] 264.2
Gemeente Noardeast-Fryslân Totaal 34.2 [%] 18.4 [%] 301.8
Gemeente Noord-Beveland 50 24.1 [%] 20.6 [%] 4.7
Gemeente Noord-Beveland 80 0.0 [%] 0.0 [%] 0.9
Gemeente Noord-Beveland Totaal 22.4 [%] 17.1 [%] 5.6
Gemeente Noordenveld 50 46.6 [%] 30.5 [%] 42.4
Gemeente Noordenveld 80 91.2 [%] 89.1 [%] 8.2
Gemeente Noordenveld Totaal 50.7 [%] 39.9 [%] 50.6
Gemeente Noordoostpolder 50 53.8 [%] 41.5 [%] 52.0
Gemeente Noordoostpolder 70 100.0 [%] 100.0 [%] 0.6
Gemeente Noordoostpolder 80 46.4 [%] 21.4 [%] 104.9
Gemeente Noordoostpolder Totaal 52.2 [%] 28.3 [%] 157.6
Gemeente Noordwijk 50 70.2 [%] 66.7 [%] 38.6
Gemeente Noordwijk 80 88.9 [%] 74.3 [%] 0.5
Gemeente Noordwijk Totaal 70.8 [%] 66.8 [%] 39.1
Gemeente Nuenen, Gerwen en Nederwetten 50 83.1 [%] 85.9 [%] 19.2
Gemeente Nuenen, Gerwen en Nederwetten 80 97.8 [%] 97.3 [%] 8.3
Gemeente Nuenen, Gerwen en Nederwetten Totaal 86.7 [%] 89.3 [%] 27.4
Gemeente Nunspeet 50 79.7 [%] 51.3 [%] 27.0
Gemeente Nunspeet 80 85.7 [%] 98.1 [%] 2.2
Gemeente Nunspeet Totaal 79.8 [%] 54.8 [%] 29.2
Gemeente Oegstgeest 50 81.0 [%] 76.7 [%] 14.7
Gemeente Oegstgeest 80 53.8 [%] 36.3 [%] 2.8
Gemeente Oegstgeest Totaal 79.6 [%] 70.1 [%] 17.5
Gemeente Oirschot 50 81.3 [%] 66.8 [%] 12.9
Gemeente Oirschot 80 88.1 [%] 74.7 [%] 11.3
Gemeente Oirschot Totaal 83.3 [%] 70.5 [%] 24.2
Gemeente Oisterwijk 50 73.3 [%] 53.0 [%] 33.5
Gemeente Oisterwijk 80 50.0 [%] 3.7 [%] 2.4
Gemeente Oisterwijk Totaal 72.9 [%] 49.7 [%] 35.9
Gemeente Oldambt 50 37.2 [%] 23.5 [%] 94.5
Gemeente Oldambt 80 30.3 [%] 12.5 [%] 90.1
Gemeente Oldambt Totaal 36.0 [%] 18.1 [%] 184.5
Gemeente Oldebroek 50 73.4 [%] 62.8 [%] 17.7
Gemeente Oldebroek 80 40.0 [%] 20.3 [%] 2.2
Gemeente Oldebroek Totaal 71.9 [%] 58.0 [%] 19.9
Gemeente Oldenzaal 50 55.7 [%] 34.4 [%] 59.7
Gemeente Oldenzaal 80 70.0 [%] 43.6 [%] 0.8
Gemeente Oldenzaal Totaal 55.9 [%] 34.5 [%] 60.5
Gemeente Olst-Wijhe 50 59.5 [%] 51.0 [%] 17.4
Gemeente Olst-Wijhe 80 66.7 [%] 19.0 [%] 0.9
Gemeente Olst-Wijhe Totaal 59.8 [%] 49.4 [%] 18.4
Gemeente Ommen 50 66.4 [%] 58.8 [%] 22.4
Gemeente Ommen 80 96.4 [%] 99.5 [%] 7.2
Gemeente Ommen Totaal 69.6 [%] 68.7 [%] 29.6
Gemeente Oost Gelre 50 63.2 [%] 44.9 [%] 34.0
Gemeente Oost Gelre 80 100.0 [%] 100.0 [%] 2.0
Gemeente Oost Gelre Totaal 64.8 [%] 47.9 [%] 36.0
Gemeente Oosterhout 50 70.1 [%] 55.8 [%] 98.0
Gemeente Oosterhout 70 100.0 [%] 100.0 [%] 7.3
Gemeente Oosterhout 80 68.0 [%] 46.4 [%] 20.8
Gemeente Oosterhout Totaal 70.9 [%] 56.8 [%] 126.1
Gemeente Ooststellingwerf 50 23.9 [%] 10.5 [%] 14.2
Gemeente Ooststellingwerf 70 50.0 [%] 72.4 [%] 0.7
Gemeente Ooststellingwerf 80 68.6 [%] 56.6 [%] 17.1
Gemeente Ooststellingwerf Totaal 34.9 [%] 36.6 [%] 32.0
Gemeente Oostzaan 50 46.8 [%] 28.4 [%] 9.7
Gemeente Oostzaan 70 100.0 [%] 100.0 [%] 0.1
Gemeente Oostzaan 80 87.5 [%] 77.9 [%] 0.8
Gemeente Oostzaan Totaal 53.6 [%] 32.4 [%] 10.5
Gemeente Opmeer 50 42.7 [%] 19.4 [%] 25.2
Gemeente Opmeer 80 20.0 [%] 1.1 [%] 0.7
Gemeente Opmeer Totaal 41.8 [%] 18.9 [%] 25.9
Gemeente Opsterland 50 40.0 [%] 37.9 [%] 11.6
Gemeente Opsterland 80 82.8 [%] 75.2 [%] 26.2
Gemeente Opsterland Totaal 58.6 [%] 63.7 [%] 37.8
Gemeente Oss 50 76.4 [%] 64.7 [%] 114.4
Gemeente Oss 70 98.3 [%] 99.9 [%] 11.7
Gemeente Oss 80 93.5 [%] 93.0 [%] 17.0
Gemeente Oss Totaal 78.4 [%] 70.9 [%] 143.2
Gemeente Oude IJsselstreek 50 51.3 [%] 34.5 [%] 37.0
Gemeente Oude IJsselstreek 80 89.2 [%] 75.5 [%] 5.6
Gemeente Oude IJsselstreek Totaal 54.9 [%] 39.9 [%] 42.7
Gemeente Ouder-Amstel 50 74.3 [%] 70.0 [%] 30.1
Gemeente Ouder-Amstel 70 100.0 [%] 100.0 [%] 0.8
Gemeente Ouder-Amstel 80 94.7 [%] 83.0 [%] 3.3
Gemeente Ouder-Amstel Totaal 75.7 [%] 71.9 [%] 34.2
Gemeente Oudewater 50 90.2 [%] 66.5 [%] 6.1
Gemeente Oudewater 80 75.0 [%] 98.9 [%] 2.2
Gemeente Oudewater Totaal 89.6 [%] 74.9 [%] 8.3
Gemeente Overbetuwe 50 71.3 [%] 55.1 [%] 61.8
Gemeente Overbetuwe 80 80.0 [%] 89.7 [%] 5.9
Gemeente Overbetuwe Totaal 71.7 [%] 58.1 [%] 67.7
Gemeente Papendrecht 50 89.0 [%] 85.6 [%] 34.5
Gemeente Papendrecht 80 100.0 [%] 100.0 [%] 0.8
Gemeente Papendrecht Totaal 89.1 [%] 86.0 [%] 35.4
Gemeente Peel en Maas 50 26.6 [%] 12.9 [%] 34.9
Gemeente Peel en Maas 80 81.0 [%] 82.8 [%] 8.1
Gemeente Peel en Maas Totaal 33.1 [%] 26.0 [%] 43.0
Gemeente Pekela 50 18.6 [%] 8.3 [%] 30.2
Gemeente Pekela 80 71.4 [%] 75.0 [%] 0.3
Gemeente Pekela Totaal 20.4 [%] 9.0 [%] 30.5
Gemeente Pijnacker-Nootdorp 50 82.6 [%] 74.3 [%] 34.1
Gemeente Pijnacker-Nootdorp 80 34.6 [%] 28.2 [%] 2.6
Gemeente Pijnacker-Nootdorp Totaal 79.9 [%] 71.0 [%] 36.7
Gemeente Purmerend 50 68.4 [%] 61.1 [%] 90.6
Gemeente Purmerend 80 93.3 [%] 98.9 [%] 2.2
Gemeente Purmerend Totaal 68.9 [%] 62.0 [%] 92.8
Gemeente Putten 50 76.3 [%] 65.3 [%] 17.5
Gemeente Putten 80 50.0 [%] 42.7 [%] 1.4
Gemeente Putten Totaal 75.6 [%] 63.6 [%] 18.9
Gemeente Raalte 50 56.1 [%] 45.2 [%] 26.1
Gemeente Raalte 80 62.6 [%] 45.2 [%] 11.9
Gemeente Raalte Totaal 58.0 [%] 45.2 [%] 38.0
Gemeente Reimerswaal 50 45.0 [%] 36.5 [%] 13.8
Gemeente Reimerswaal 80 78.6 [%] 70.3 [%] 3.2
Gemeente Reimerswaal Totaal 51.8 [%] 42.9 [%] 17.0
Gemeente Renkum 50 37.2 [%] 23.6 [%] 31.3
Gemeente Renkum 80 73.1 [%] 57.6 [%] 3.5
Gemeente Renkum Totaal 40.0 [%] 27.1 [%] 34.8
Gemeente Renswoude 50 13.7 [%] 2.2 [%] 4.6
Gemeente Renswoude 80 75.0 [%] 97.1 [%] 2.9
Gemeente Renswoude Totaal 25.4 [%] 39.1 [%] 7.6
Gemeente Reusel-De Mierden 50 91.9 [%] 90.2 [%] 5.0
Gemeente Reusel-De Mierden 80 100.0 [%] 100.0 [%] 0.1
Gemeente Reusel-De Mierden Totaal 92.0 [%] 90.4 [%] 5.1
Gemeente Rheden 50 24.3 [%] 16.0 [%] 51.8
Gemeente Rheden 80 60.0 [%] 33.5 [%] 1.9
Gemeente Rheden Totaal 25.0 [%] 16.7 [%] 53.7
Gemeente Rhenen 50 51.1 [%] 51.2 [%] 10.1
Gemeente Rhenen 80 94.1 [%] 99.1 [%] 2.4
Gemeente Rhenen Totaal 63.1 [%] 60.3 [%] 12.5
Gemeente Ridderkerk 50 60.2 [%] 43.7 [%] 55.7
Gemeente Ridderkerk 70 100.0 [%] 100.0 [%] 0.2
Gemeente Ridderkerk 80 40.0 [%] 17.4 [%] 1.1
Gemeente Ridderkerk Totaal 59.6 [%] 43.4 [%] 57.0
Gemeente Rijssen-Holten 50 53.9 [%] 37.1 [%] 57.0
Gemeente Rijssen-Holten 80 50.0 [%] 14.6 [%] 0.4
Gemeente Rijssen-Holten Totaal 53.9 [%] 37.0 [%] 57.4
Gemeente Rijswijk 50 76.1 [%] 71.5 [%] 83.7
Gemeente Rijswijk 80 7.1 [%] 3.8 [%] 1.2
Gemeente Rijswijk Totaal 75.3 [%] 70.5 [%] 84.9
Gemeente Roerdalen 50 41.7 [%] 17.9 [%] 10.7
Gemeente Roerdalen 80 65.0 [%] 54.6 [%] 8.8
Gemeente Roerdalen Totaal 50.0 [%] 34.4 [%] 19.5
Gemeente Roermond 50 77.1 [%] 60.4 [%] 74.9
Gemeente Roermond 70 100.0 [%] 100.0 [%] 1.7
Gemeente Roermond 80 73.4 [%] 44.8 [%] 10.0
Gemeente Roermond Totaal 77.2 [%] 59.4 [%] 86.6
Gemeente Roosendaal 50 63.3 [%] 52.1 [%] 133.9
Gemeente Roosendaal 80 74.3 [%] 67.8 [%] 14.7
Gemeente Roosendaal Totaal 63.8 [%] 53.6 [%] 148.6
Gemeente Rotterdam 50 77.1 [%] 71.9 [%] 691.2
Gemeente Rotterdam 70 100.0 [%] 100.0 [%] 9.4
Gemeente Rotterdam 80 74.8 [%] 69.3 [%] 157.8
Gemeente Rotterdam Totaal 76.9 [%] 71.7 [%] 858.3
Gemeente Rozendaal 50 12.5 [%] 1.0 [%] 0.6
Gemeente Rozendaal 80 100.0 [%] 100.0 [%] 0.7
Gemeente Rozendaal Totaal 30.0 [%] 52.9 [%] 1.3
Gemeente Rucphen 50 54.1 [%] 33.1 [%] 14.3
Gemeente Rucphen 80 83.3 [%] 43.3 [%] 2.1
Gemeente Rucphen Totaal 56.0 [%] 34.4 [%] 16.4
Gemeente Schagen 50 35.3 [%] 28.1 [%] 63.8
Gemeente Schagen 80 96.6 [%] 98.7 [%] 6.9
Gemeente Schagen Totaal 37.9 [%] 35.0 [%] 70.7
Gemeente Scherpenzeel 50 68.6 [%] 38.9 [%] 6.6
Gemeente Scherpenzeel 80 66.7 [%] 66.1 [%] 0.2
Gemeente Scherpenzeel Totaal 68.5 [%] 39.5 [%] 6.7
Gemeente Schiedam 50 77.8 [%] 67.5 [%] 77.7
Gemeente Schiedam Totaal 77.8 [%] 67.5 [%] 77.7
Gemeente Schouwen-Duiveland 50 26.9 [%] 28.1 [%] 56.5
Gemeente Schouwen-Duiveland 80 40.7 [%] 20.3 [%] 3.9
Gemeente Schouwen-Duiveland Totaal 27.5 [%] 27.6 [%] 60.4
Gemeente Simpelveld 50 40.1 [%] 25.4 [%] 13.6
Gemeente Simpelveld 80 25.6 [%] 10.7 [%] 33.5
Gemeente Simpelveld Totaal 33.6 [%] 15.0 [%] 47.2
Gemeente Sint-Michielsgestel 50 56.8 [%] 45.1 [%] 18.3
Gemeente Sint-Michielsgestel 80 25.0 [%] 6.5 [%] 1.4
Gemeente Sint-Michielsgestel Totaal 56.2 [%] 42.4 [%] 19.7
Gemeente Sittard-Geleen 50 69.1 [%] 56.5 [%] 109.7
Gemeente Sittard-Geleen 70 100.0 [%] 100.0 [%] 5.3
Gemeente Sittard-Geleen 80 31.6 [%] 11.0 [%] 50.6
Gemeente Sittard-Geleen Totaal 65.1 [%] 44.0 [%] 165.6
Gemeente Sliedrecht 50 91.6 [%] 90.7 [%] 20.3
Gemeente Sliedrecht 80 100.0 [%] 100.0 [%] 0.4
Gemeente Sliedrecht Totaal 91.8 [%] 90.8 [%] 20.7
Gemeente Sluis 50 56.4 [%] 46.6 [%] 24.8
Gemeente Sluis 70 100.0 [%] 100.0 [%] 0.0
Gemeente Sluis 80 51.2 [%] 35.8 [%] 4.9
Gemeente Sluis Totaal 55.8 [%] 44.9 [%] 29.7
Gemeente Smallingerland 50 57.3 [%] 36.3 [%] 63.8
Gemeente Smallingerland 80 73.9 [%] 82.4 [%] 5.3
Gemeente Smallingerland Totaal 58.0 [%] 39.9 [%] 69.2
Gemeente Soest 50 90.2 [%] 82.6 [%] 27.7
Gemeente Soest 80 36.4 [%] 22.2 [%] 10.4
Gemeente Soest Totaal 85.7 [%] 66.0 [%] 38.1
Gemeente Someren 50 36.7 [%] 24.3 [%] 24.6
Gemeente Someren 80 61.0 [%] 36.1 [%] 29.5
Gemeente Someren Totaal 45.7 [%] 30.7 [%] 54.1
Gemeente Son en Breugel 50 78.7 [%] 62.6 [%] 28.3
Gemeente Son en Breugel 80 83.3 [%] 97.9 [%] 2.7
Gemeente Son en Breugel Totaal 78.9 [%] 65.7 [%] 31.1
Gemeente Stadskanaal 50 72.0 [%] 63.8 [%] 52.1
Gemeente Stadskanaal 80 25.5 [%] 14.1 [%] 180.5
Gemeente Stadskanaal Totaal 50.2 [%] 25.3 [%] 232.6
Gemeente Staphorst 50 27.3 [%] 15.3 [%] 43.0
Gemeente Staphorst 80 100.0 [%] 100.0 [%] 2.4
Gemeente Staphorst Totaal 29.2 [%] 19.7 [%] 45.3
Gemeente Stede Broec 50 83.9 [%] 71.8 [%] 8.1
Gemeente Stede Broec 80 100.0 [%] 100.0 [%] 2.0
Gemeente Stede Broec Totaal 85.8 [%] 77.3 [%] 10.1
Gemeente Steenbergen 50 75.4 [%] 67.4 [%] 11.2
Gemeente Steenbergen 80 92.3 [%] 91.9 [%] 22.1
Gemeente Steenbergen Totaal 83.5 [%] 83.6 [%] 33.3
Gemeente Steenwijkerland 50 49.1 [%] 31.1 [%] 43.5
Gemeente Steenwijkerland 80 76.9 [%] 70.4 [%] 11.7
Gemeente Steenwijkerland Totaal 51.7 [%] 39.4 [%] 55.2
Gemeente Stein 50 64.7 [%] 44.8 [%] 22.1
Gemeente Stein 80 85.8 [%] 85.9 [%] 13.8
Gemeente Stein Totaal 72.5 [%] 60.6 [%] 35.8
Gemeente Stichtse Vecht 50 71.5 [%] 57.1 [%] 58.6
Gemeente Stichtse Vecht 80 96.3 [%] 98.1 [%] 8.4
Gemeente Stichtse Vecht Totaal 72.7 [%] 62.2 [%] 66.9
Gemeente Súdwest-Fryslân 50 37.8 [%] 24.7 [%] 90.2
Gemeente Súdwest-Fryslân 70 83.3 [%] 78.2 [%] 4.0
Gemeente Súdwest-Fryslân 80 87.6 [%] 90.7 [%] 56.1
Gemeente Súdwest-Fryslân Totaal 52.8 [%] 50.8 [%] 150.4
Gemeente Terneuzen 50 57.7 [%] 47.5 [%] 92.9
Gemeente Terneuzen 70 98.1 [%] 99.1 [%] 4.1
Gemeente Terneuzen 80 67.3 [%] 59.8 [%] 6.4
Gemeente Terneuzen Totaal 60.0 [%] 50.3 [%] 103.5
Gemeente Terschelling 50 50.5 [%] 53.8 [%] 10.7
Gemeente Terschelling 80 17.0 [%] 11.8 [%] 39.0
Gemeente Terschelling Totaal 31.2 [%] 20.8 [%] 49.7
Gemeente Texel 50 41.6 [%] 22.1 [%] 16.5
Gemeente Texel 80 76.8 [%] 40.5 [%] 13.3
Gemeente Texel Totaal 53.9 [%] 30.3 [%] 29.7
Gemeente Teylingen 50 71.1 [%] 54.6 [%] 13.9
Gemeente Teylingen 80 0.0 [%] 0.0 [%] 0.2
Gemeente Teylingen Totaal 69.7 [%] 53.9 [%] 14.1
Gemeente Tholen 50 42.1 [%] 29.3 [%] 24.5
Gemeente Tholen 80 88.0 [%] 58.5 [%] 0.8
Gemeente Tholen Totaal 46.9 [%] 30.2 [%] 25.3
Gemeente Tiel 50 71.8 [%] 56.5 [%] 51.4
Gemeente Tiel 70 100.0 [%] 100.0 [%] 0.1
Gemeente Tiel 80 94.2 [%] 97.7 [%] 6.0
Gemeente Tiel Totaal 74.8 [%] 60.9 [%] 57.5
Gemeente Tilburg 50 72.1 [%] 58.6 [%] 238.8
Gemeente Tilburg 70 97.8 [%] 97.0 [%] 10.7
Gemeente Tilburg 80 94.7 [%] 93.8 [%] 75.0
Gemeente Tilburg Totaal 75.0 [%] 68.0 [%] 324.5
Gemeente Tubbergen 50 41.9 [%] 21.6 [%] 15.3
Gemeente Tubbergen 80 98.1 [%] 93.1 [%] 12.8
Gemeente Tubbergen Totaal 57.9 [%] 54.3 [%] 28.1
Gemeente Twenterand 50 34.2 [%] 21.5 [%] 66.8
Gemeente Twenterand 70 66.7 [%] 55.8 [%] 0.4
Gemeente Twenterand 80 100.0 [%] 100.0 [%] 9.8
Gemeente Twenterand Totaal 38.0 [%] 31.6 [%] 77.0
Gemeente Tynaarlo 50 87.1 [%] 82.4 [%] 25.0
Gemeente Tynaarlo 70 100.0 [%] 100.0 [%] 0.0
Gemeente Tynaarlo 80 97.1 [%] 96.2 [%] 7.5
Gemeente Tynaarlo Totaal 88.1 [%] 85.6 [%] 32.6
Gemeente Tytsjerksteradiel 50 28.3 [%] 20.6 [%] 32.6
Gemeente Tytsjerksteradiel 80 54.9 [%] 42.5 [%] 61.1
Gemeente Tytsjerksteradiel Totaal 37.8 [%] 34.9 [%] 93.7
Gemeente Uitgeest 50 84.4 [%] 63.3 [%] 10.2
Gemeente Uitgeest 80 85.7 [%] 87.5 [%] 1.0
Gemeente Uitgeest Totaal 84.5 [%] 65.4 [%] 11.1
Gemeente Uithoorn 50 77.2 [%] 55.9 [%] 31.6
Gemeente Uithoorn 80 100.0 [%] 100.0 [%] 2.5
Gemeente Uithoorn Totaal 78.1 [%] 59.2 [%] 34.1
Gemeente Urk 50 50.0 [%] 30.8 [%] 25.4
Gemeente Urk 70 75.0 [%] 99.7 [%] 1.2
Gemeente Urk 80 50.0 [%] 6.7 [%] 1.6
Gemeente Urk Totaal 50.3 [%] 32.2 [%] 28.2
Gemeente Utrecht 50 75.4 [%] 67.5 [%] 370.4
Gemeente Utrecht 70 99.2 [%] 99.7 [%] 36.1
Gemeente Utrecht 80 90.9 [%] 95.4 [%] 4.5
Gemeente Utrecht Totaal 76.2 [%] 70.6 [%] 411.0
Gemeente Utrechtse Heuvelrug 50 39.1 [%] 33.8 [%] 41.2
Gemeente Utrechtse Heuvelrug 80 58.7 [%] 19.8 [%] 18.9
Gemeente Utrechtse Heuvelrug Totaal 41.1 [%] 29.4 [%] 60.2
Gemeente Vaals 50 18.2 [%] 24.0 [%] 1.8
Gemeente Vaals 80 100.0 [%] 100.0 [%] 0.0
Gemeente Vaals Totaal 35.7 [%] 25.8 [%] 1.9
Gemeente Valkenburg aan de Geul 50 25.9 [%] 13.9 [%] 33.2
Gemeente Valkenburg aan de Geul 70 100.0 [%] 100.0 [%] 0.4
Gemeente Valkenburg aan de Geul 80 48.8 [%] 21.8 [%] 7.6
Gemeente Valkenburg aan de Geul Totaal 29.2 [%] 16.2 [%] 41.2
Gemeente Valkenswaard 50 84.6 [%] 76.8 [%] 29.4
Gemeente Valkenswaard 80 100.0 [%] 100.0 [%] 8.9
Gemeente Valkenswaard Totaal 85.7 [%] 82.2 [%] 38.3
Gemeente Veendam 50 37.5 [%] 28.7 [%] 90.1
Gemeente Veendam 70 100.0 [%] 100.0 [%] 0.1
Gemeente Veendam 80 33.3 [%] 11.4 [%] 32.6
Gemeente Veendam Totaal 37.5 [%] 24.1 [%] 122.9
Gemeente Veenendaal 50 68.7 [%] 57.3 [%] 67.3
Gemeente Veenendaal 80 100.0 [%] 100.0 [%] 0.3
Gemeente Veenendaal Totaal 68.9 [%] 57.4 [%] 67.6
Gemeente Veere 50 61.5 [%] 58.3 [%] 15.6
Gemeente Veere 80 66.7 [%] 65.6 [%] 2.4
Gemeente Veere Totaal 62.2 [%] 59.2 [%] 18.0
Gemeente Veldhoven 50 82.7 [%] 74.2 [%] 64.0
Gemeente Veldhoven 70 94.6 [%] 98.9 [%] 17.8
Gemeente Veldhoven 80 35.6 [%] 15.1 [%] 22.2
Gemeente Veldhoven Totaal 80.2 [%] 65.8 [%] 104.0
Gemeente Velsen 50 69.3 [%] 56.8 [%] 103.9
Gemeente Velsen 70 100.0 [%] 100.0 [%] 1.7
Gemeente Velsen 80 83.3 [%] 99.1 [%] 1.1
Gemeente Velsen Totaal 69.5 [%] 57.9 [%] 106.8
Gemeente Venlo 50 60.0 [%] 45.8 [%] 211.9
Gemeente Venlo 70 92.9 [%] 99.8 [%] 1.8
Gemeente Venlo 80 79.7 [%] 70.5 [%] 21.1
Gemeente Venlo Totaal 61.3 [%] 48.4 [%] 234.8
Gemeente Venray 50 64.9 [%] 50.7 [%] 62.3
Gemeente Venray 80 88.6 [%] 88.8 [%] 8.6
Gemeente Venray Totaal 65.9 [%] 55.3 [%] 70.9
Gemeente Vijfheerenlanden 50 65.6 [%] 42.2 [%] 59.1
Gemeente Vijfheerenlanden 80 100.0 [%] 100.0 [%] 0.7
Gemeente Vijfheerenlanden Totaal 65.7 [%] 42.9 [%] 59.8
Gemeente Vlaardingen 50 73.8 [%] 64.7 [%] 73.8
Gemeente Vlaardingen 80 61.1 [%] 66.5 [%] 3.1
Gemeente Vlaardingen Totaal 73.6 [%] 64.7 [%] 76.9
Gemeente Vlissingen 50 70.7 [%] 65.3 [%] 35.4
Gemeente Vlissingen 70 100.0 [%] 100.0 [%] 7.5
Gemeente Vlissingen 80 85.7 [%] 37.0 [%] 0.5
Gemeente Vlissingen Totaal 73.8 [%] 71.0 [%] 43.3
Gemeente Voerendaal 50 36.0 [%] 28.1 [%] 11.4
Gemeente Voerendaal 70 100.0 [%] 100.0 [%] 0.9
Gemeente Voerendaal 80 82.9 [%] 79.2 [%] 5.9
Gemeente Voerendaal Totaal 46.9 [%] 48.1 [%] 18.2
Gemeente Voorne aan Zee 50 60.5 [%] 54.1 [%] 54.7
Gemeente Voorne aan Zee 80 95.6 [%] 98.8 [%] 6.1
Gemeente Voorne aan Zee Totaal 62.8 [%] 58.6 [%] 60.8
Gemeente Voorschoten 50 69.8 [%] 63.5 [%] 26.2
Gemeente Voorschoten 80 0.0 [%] 0.0 [%] 0.6
Gemeente Voorschoten Totaal 69.4 [%] 62.1 [%] 26.8
Gemeente Voorst 50 34.1 [%] 21.8 [%] 24.0
Gemeente Voorst 80 77.8 [%] 81.5 [%] 9.7
Gemeente Voorst Totaal 43.4 [%] 39.0 [%] 33.6
Gemeente Vught 50 81.5 [%] 73.8 [%] 17.7
Gemeente Vught 80 81.8 [%] 94.4 [%] 1.3
Gemeente Vught Totaal 81.5 [%] 75.2 [%] 19.0
Gemeente Waadhoeke 50 26.4 [%] 14.5 [%] 49.2
Gemeente Waadhoeke 70 100.0 [%] 100.0 [%] 5.2
Gemeente Waadhoeke 80 69.6 [%] 69.7 [%] 45.8
Gemeente Waadhoeke Totaal 43.6 [%] 44.2 [%] 100.2
Gemeente Waalre 50 87.6 [%] 81.8 [%] 13.7
Gemeente Waalre 80 100.0 [%] 100.0 [%] 0.1
Gemeente Waalre Totaal 87.9 [%] 82.0 [%] 13.9
Gemeente Waalwijk 50 66.2 [%] 47.2 [%] 91.6
Gemeente Waalwijk 80 81.8 [%] 55.8 [%] 6.4
Gemeente Waalwijk Totaal 66.8 [%] 47.8 [%] 98.0
Gemeente Waddinxveen 50 62.0 [%] 45.8 [%] 31.1
Gemeente Waddinxveen 80 87.8 [%] 98.8 [%] 4.5
Gemeente Waddinxveen Totaal 65.0 [%] 52.6 [%] 35.7
Gemeente Wageningen 50 64.6 [%] 52.1 [%] 47.8
Gemeente Wageningen 80 33.3 [%] 4.8 [%] 0.8
Gemeente Wageningen Totaal 64.3 [%] 51.3 [%] 48.6
Gemeente Wassenaar 50 74.4 [%] 74.6 [%] 27.0
Gemeente Wassenaar 70 100.0 [%] 100.0 [%] 1.1
Gemeente Wassenaar 80 54.1 [%] 42.4 [%] 7.8
Gemeente Wassenaar Totaal 72.7 [%] 68.4 [%] 35.9
Gemeente Waterland 50 55.4 [%] 44.7 [%] 7.8
Gemeente Waterland Totaal 55.4 [%] 44.7 [%] 7.8
Gemeente Weert 50 39.7 [%] 26.9 [%] 66.2
Gemeente Weert 70 99.4 [%] 99.9 [%] 17.4
Gemeente Weert 80 63.5 [%] 70.4 [%] 23.3
Gemeente Weert Totaal 52.2 [%] 48.3 [%] 106.8
Gemeente West Betuwe 50 52.4 [%] 30.4 [%] 59.0
Gemeente West Betuwe 70 100.0 [%] 100.0 [%] 2.1
Gemeente West Betuwe 80 75.5 [%] 86.8 [%] 8.2
Gemeente West Betuwe Totaal 54.8 [%] 39.2 [%] 69.3
Gemeente West Maas en Waal 50 59.7 [%] 41.2 [%] 7.4
Gemeente West Maas en Waal 80 100.0 [%] 100.0 [%] 0.1
Gemeente West Maas en Waal Totaal 60.8 [%] 42.0 [%] 7.5
Gemeente Westerkwartier 50 46.6 [%] 34.9 [%] 45.9
Gemeente Westerkwartier 70 0.0 [%] 0.0 [%] 2.2
Gemeente Westerkwartier 80 20.7 [%] 4.1 [%] 105.7
Gemeente Westerkwartier Totaal 37.7 [%] 13.2 [%] 153.9
Gemeente Westerveld 50 56.2 [%] 61.0 [%] 3.4
Gemeente Westerveld 70 66.7 [%] 76.6 [%] 0.0
Gemeente Westerveld 80 100.0 [%] 100.0 [%] 1.9
Gemeente Westerveld Totaal 69.4 [%] 74.9 [%] 5.4
Gemeente Westervoort 50 58.4 [%] 53.6 [%] 12.0
Gemeente Westervoort 80 100.0 [%] 100.0 [%] 0.7
Gemeente Westervoort Totaal 58.6 [%] 56.1 [%] 12.7
Gemeente Westerwolde 50 17.9 [%] 13.7 [%] 135.4
Gemeente Westerwolde 80 20.0 [%] 13.4 [%] 342.6
Gemeente Westerwolde Totaal 18.9 [%] 13.5 [%] 478.0
Gemeente Westland 50 57.4 [%] 45.6 [%] 95.8
Gemeente Westland 80 66.1 [%] 59.0 [%] 8.8
Gemeente Westland Totaal 57.8 [%] 46.7 [%] 104.6
Gemeente Weststellingwerf 50 33.1 [%] 32.2 [%] 30.0
Gemeente Weststellingwerf 70 40.0 [%] 28.0 [%] 2.4
Gemeente Weststellingwerf 80 75.8 [%] 79.3 [%] 21.6
Gemeente Weststellingwerf Totaal 41.3 [%] 50.8 [%] 54.0
Gemeente Wierden 50 47.4 [%] 25.6 [%] 23.3
Gemeente Wierden 80 97.4 [%] 92.4 [%] 6.4
Gemeente Wierden Totaal 54.1 [%] 39.9 [%] 29.7
Gemeente Wijchen 50 78.0 [%] 53.3 [%] 59.2
Gemeente Wijchen 80 32.8 [%] 16.2 [%] 20.4
Gemeente Wijchen Totaal 74.4 [%] 43.8 [%] 79.6
Gemeente Wijdemeren 50 40.4 [%] 38.9 [%] 54.2
Gemeente Wijdemeren 80 42.9 [%] 9.4 [%] 7.9
Gemeente Wijdemeren Totaal 40.5 [%] 35.2 [%] 62.1
Gemeente Wijk bij Duurstede 50 75.1 [%] 52.3 [%] 14.9
Gemeente Wijk bij Duurstede 70 100.0 [%] 100.0 [%] 1.5
Gemeente Wijk bij Duurstede 80 50.0 [%] 90.9 [%] 1.0
Gemeente Wijk bij Duurstede Totaal 75.4 [%] 58.5 [%] 17.3
Gemeente Winterswijk 50 48.1 [%] 30.9 [%] 27.7
Gemeente Winterswijk 80 0.0 [%] 0.0 [%] 0.5
Gemeente Winterswijk Totaal 47.6 [%] 30.3 [%] 28.2
Gemeente Woensdrecht 50 66.7 [%] 48.0 [%] 9.5
Gemeente Woensdrecht 80 92.6 [%] 86.1 [%] 7.6
Gemeente Woensdrecht Totaal 72.2 [%] 64.9 [%] 17.1
Gemeente Woerden 50 51.5 [%] 41.1 [%] 68.0
Gemeente Woerden 70 100.0 [%] 100.0 [%] 2.6
Gemeente Woerden 80 80.0 [%] 27.9 [%] 3.7
Gemeente Woerden Totaal 52.9 [%] 42.5 [%] 74.3
Gemeente Wormerland 50 53.5 [%] 36.6 [%] 14.4
Gemeente Wormerland 80 100.0 [%] 100.0 [%] 0.1
Gemeente Wormerland Totaal 53.8 [%] 37.3 [%] 14.6
Gemeente Woudenberg 50 67.1 [%] 51.6 [%] 5.1
Gemeente Woudenberg 80 37.5 [%] 14.4 [%] 2.0
Gemeente Woudenberg Totaal 61.6 [%] 41.2 [%] 7.0
Gemeente Zaanstad 50 60.0 [%] 50.0 [%] 142.3
Gemeente Zaanstad 70 98.4 [%] 100.0 [%] 16.6
Gemeente Zaanstad 80 100.0 [%] 100.0 [%] 5.2
Gemeente Zaanstad Totaal 61.9 [%] 56.6 [%] 164.0
Gemeente Zaltbommel 50 43.0 [%] 23.4 [%] 55.1
Gemeente Zaltbommel 80 49.4 [%] 25.5 [%] 50.3
Gemeente Zaltbommel Totaal 44.7 [%] 24.4 [%] 105.4
Gemeente Zandvoort 50 80.0 [%] 80.1 [%] 9.9
Gemeente Zandvoort Totaal 80.0 [%] 80.1 [%] 9.9
Gemeente Zeewolde 50 71.2 [%] 54.6 [%] 44.1
Gemeente Zeewolde 70 100.0 [%] 100.0 [%] 2.7
Gemeente Zeewolde 80 23.0 [%] 6.4 [%] 125.1
Gemeente Zeewolde Totaal 60.1 [%] 20.2 [%] 171.9
Gemeente Zeist 50 86.1 [%] 78.2 [%] 41.0
Gemeente Zeist 80 90.9 [%] 98.0 [%] 5.0
Gemeente Zeist Totaal 86.3 [%] 80.3 [%] 46.0
Gemeente Zevenaar 50 60.4 [%] 48.3 [%] 51.2
Gemeente Zevenaar 80 80.0 [%] 69.6 [%] 9.2
Gemeente Zevenaar Totaal 62.0 [%] 51.6 [%] 60.4
Gemeente Zoetermeer 50 74.6 [%] 67.2 [%] 142.0
Gemeente Zoetermeer 70 100.0 [%] 100.0 [%] 20.2
Gemeente Zoetermeer 80 100.0 [%] 100.0 [%] 5.3
Gemeente Zoetermeer Totaal 75.5 [%] 72.2 [%] 167.4
Gemeente Zoeterwoude 50 80.1 [%] 64.6 [%] 12.2
Gemeente Zoeterwoude 80 0.0 [%] 0.0 [%] 0.1
Gemeente Zoeterwoude Totaal 79.6 [%] 63.9 [%] 12.4
Gemeente Zuidplas 50 51.7 [%] 42.2 [%] 36.7
Gemeente Zuidplas 80 78.9 [%] 89.1 [%] 6.5
Gemeente Zuidplas Totaal 55.0 [%] 49.2 [%] 43.3
Gemeente Zundert 50 48.7 [%] 37.1 [%] 21.2
Gemeente Zundert 80 14.6 [%] 7.1 [%] 70.0
Gemeente Zundert Totaal 34.1 [%] 14.0 [%] 91.2
Gemeente Zutphen 50 69.4 [%] 53.7 [%] 44.8
Gemeente Zutphen 80 53.3 [%] 23.7 [%] 6.0
Gemeente Zutphen Totaal 68.6 [%] 50.2 [%] 50.8
Gemeente Zwartewaterland 50 36.9 [%] 31.5 [%] 23.8
Gemeente Zwartewaterland 80 83.8 [%] 50.9 [%] 4.8
Gemeente Zwartewaterland Totaal 45.7 [%] 34.8 [%] 28.7
Gemeente Zwijndrecht 50 73.8 [%] 62.6 [%] 54.1
Gemeente Zwijndrecht 80 100.0 [%] 100.0 [%] 0.1
Gemeente Zwijndrecht Totaal 74.1 [%] 62.7 [%] 54.3
Gemeente Zwolle 50 73.4 [%] 59.4 [%] 151.1
Gemeente Zwolle 70 95.7 [%] 97.9 [%] 42.3
Gemeente Zwolle 80 82.4 [%] 83.9 [%] 5.5
Gemeente Zwolle Totaal 75.9 [%] 68.2 [%] 199.0

6.3 Benchmarks provincies per limiet categorie

In deze paragraaf worden benchmarks getoond voor wegbeherende waterschappen, afgezet tegen het landelijk niveau. De benchmarks worden getoond voor het totale areaal en voor de wegen met een limiet van 50, 70 en 80 km/uur apart.

Klik met de muis op de onderstaande tabbladen om de benchmarks van de verschillende limieten of het totaal te tonen. Klik vervolgens op de knop rechts van de grafiek om de gewenste wegbeheerder te kiezen.

Let op, er worden pas scores getoond na het maken van een eerste keuze.

# functie wrapper voor het aanroepen van plot_ly
#' De functie roept plot_ly aan voor het maken van de grafiek
#' Breedte, plaatsing en margins zijn proefondervindelijk bepaald voor alle onderdelen
#' Een dropdown menu is toegevoegd om te kunnen schakelen tussen wegbeheerders
#' Een tweede dropdown om tevens te filteren op basis van limiet lijkt complex en wordt buiten de functie gelaten. 

# functie 
figuur.benchmark <- function(scores_wegbeheerder_limiet, limiet, groepskeuzen_wegbeheerder_limiet, landelijke_score_limiet) { 
  # roep plot_ly aan en initieer de grafie voor de dropdown keuze met vaste x en y waarde
  plot_ly(scores_wegbeheerder_limiet, x = "Categorieën", y = 0, type = 'bar', # data, x as waarde, y as waarde, type barplot
          # marker stelt de grafiekkleuren vast in een vector (hier 2 waarden)
          # width fixeert de breedte van de grafiek, 900 is in pixels en ongeveer markdown pagina breedte
          marker = grafiekkleuren, width = 600) %>% #list(color = c('blue', 'purple')) 
  layout(
    # titeel initiele grafiek met object limiet
    title = list(text = paste("Kenmerkscore gescheiden voorziening voor fietsers bij", "\n", 
                              "limiet", limiet, "voor te selecteren wegbeheerder vs.", "\n",
                              "landelijk. Selecteer de wegbeheerder uit de", "\n", 
                              "uitklapbare keuzelijst rechts."),
                 xanchor = 'center', yanchor =  'top'), # plaatsing van de titel
    #xanchor = 'center', x = 0.5 , yanchor =  'top', y = 1), # Dynamic title
    margin = list(l = 70, t = 70), # marges
    xaxis = list(title = ""), # x as titel
    yaxis = list(title = "SPI deelscore [%]", range = c(0, 100)), # y as titel
    showlegend = FALSE # geen legenda
  ) %>%
  # dropdown menu voor selectie visualisatie data
  layout(
    updatemenus = list(
      list(
        active = 0,
        # Position dropdown box to the right of the graph
        xanchor = "left", # position to edge 
        x = 1.05, # position to edge 
        yanchor = "middle", # Center dropdown box vertically
        y = 0.5,   # Center dropdown box vertically
        # lapply functie voor de werking van de button 
        buttons = lapply(1:length(groepskeuzen_wegbeheerder_limiet), function(i) {
          list(
            method = "update",
            args = list(
              list(x = list(c(groepskeuzen_wegbeheerder_limiet[i], "Landelijk")), 
                   y = list(c(scores_wegbeheerder_limiet$`Score kenmerk gescheiden voorziening voor fietsers`[i], landelijke_score_limiet))),  # Update x and y scores_wegbeheerder_limiet
              list(title = paste("Kenmerkscore gescheiden voorziening voor fietsers bij limiet", limiet, "\n",
                                 "voor", groepskeuzen_wegbeheerder_limiet[i], "vs. landelijk")) # Dynamic title update
            ),
            label = groepskeuzen_wegbeheerder_limiet[i]
          )
        })
      )
    )
  )
}
# Calculate the average score
landelijke_score_50 <- scores_landelijk$`Score kenmerk gescheiden voorziening voor fietsers`[1]
landelijke_score_70 <- scores_landelijk$`Score kenmerk gescheiden voorziening voor fietsers`[2]
landelijke_score_80 <- scores_landelijk$`Score kenmerk gescheiden voorziening voor fietsers`[3]
landelijke_score_totaal <- scores_landelijk$`Score kenmerk gescheiden voorziening voor fietsers`[4]

# data per provincie per limiet
scores_provincies_50 <- filter(scores_provincies, Snelheidslimiet == "50")
scores_provincies_70 <- filter(scores_provincies, Snelheidslimiet == "70")
scores_provincies_80 <- filter(scores_provincies, Snelheidslimiet == "80")
scores_provincies_totaal <- filter(scores_provincies, Snelheidslimiet == "Totaal")

# Create the dropdown menu options
groepskeuzen_provincies_50 <- scores_provincies_50$Wegbeheerder
groepskeuzen_provincies_70 <- scores_provincies_70$Wegbeheerder
groepskeuzen_provincies_80 <- scores_provincies_80$Wegbeheerder
groepskeuzen_provincies_totaal <- scores_provincies_totaal$Wegbeheerder

grafiekkleuren <- list(color = c(blue_vals[3], green_vals[3]))

Benchmark 50 km/u

# maak een benchmark grafiek voor provenciale wegbeheerders met limiet 50
fig50prov <- figuur.benchmark(scores_wegbeheerder_limiet = scores_provincies_50, 
                              limiet = 50,
                              groepskeuzen_wegbeheerder_limiet = groepskeuzen_provincies_50,
                              landelijke_score_limiet = landelijke_score_50)

# Display the plot
fig50prov

Benchmark 70 km/u

# maak een benchmark grafiek voor provenciale wegbeheerders met limiet 70
fig70prov <- figuur.benchmark(scores_wegbeheerder_limiet = scores_provincies_70, 
                              limiet = 70,
                              groepskeuzen_wegbeheerder_limiet = groepskeuzen_provincies_70,
                              landelijke_score_limiet = landelijke_score_70)

# Display the plot
fig70prov

Benchmark 80 km/u

# maak een benchmark grafiek voor provenciale wegbeheerders met limiet 80
fig80prov <- figuur.benchmark(scores_wegbeheerder_limiet = scores_provincies_80, 
                              limiet = 80,
                              groepskeuzen_wegbeheerder_limiet = groepskeuzen_provincies_80,
                              landelijke_score_limiet = landelijke_score_80)

# Display the plot
fig80prov

Benchmark Totaal

# maak een benchmark grafiek voor provenciale wegbeheerders van alle limieten
fig_totaal_prov <- figuur.benchmark(scores_wegbeheerder_limiet = scores_provincies_totaal, 
                              limiet = "totaal",
                              groepskeuzen_wegbeheerder_limiet = groepskeuzen_provincies_totaal,
                              landelijke_score_limiet = landelijke_score_totaal)
# Display the plot
fig_totaal_prov

6.4 Benchmarks gemeenten per limiet categorie

In deze paragraaf worden benchmarks getoond voor gemeentelijke wegbeheerders, afgezet tegen het landelijk niveau. De benchmarks worden getoond voor het totale areaal en voor de wegen met een limiet van 50, 70 en 80km/uur apart.

Klik met de muis op de onderstaande tabbladen om de benchmarks van de verschillende limieten of het totaal te tonen. Klik vervolgens op de knop rechts van de grafiek om de gewenste wegbeheerder te kiezen.

Let op, er worden pas scores getoond na het maken van een eerste keuze.

# Calculate the average score
landelijke_score_50 <- scores_landelijk$`Score kenmerk gescheiden voorziening voor fietsers`[1]
landelijke_score_70 <- scores_landelijk$`Score kenmerk gescheiden voorziening voor fietsers`[2]
landelijke_score_80 <- scores_landelijk$`Score kenmerk gescheiden voorziening voor fietsers`[3]
landelijke_score_totaal <- scores_landelijk$`Score kenmerk gescheiden voorziening voor fietsers`[4]

# data per gemeente per limiet
scores_gemeenten_50 <- filter(scores_gemeenten, Snelheidslimiet == "50")
scores_gemeenten_70 <- filter(scores_gemeenten, Snelheidslimiet == "70")
scores_gemeenten_80 <- filter(scores_gemeenten, Snelheidslimiet == "80")
scores_gemeenten_totaal <- filter(scores_gemeenten, Snelheidslimiet == "Totaal")

# Create the dropdown menu options
groepskeuzen_gemeenten_50 <- scores_gemeenten_50$Wegbeheerder
groepskeuzen_gemeenten_70 <- scores_gemeenten_70$Wegbeheerder
groepskeuzen_gemeenten_80 <- scores_gemeenten_80$Wegbeheerder
groepskeuzen_gemeenten_totaal <- scores_gemeenten_totaal$Wegbeheerder

grafiekkleuren <- list(color = c(blue_vals[3], green_vals[3]))

Benchmark 50 km/u

# maak een benchmark grafiek voor gemeentelijke wegbeheerders met wegen met limiet 50
fig50gem <- figuur.benchmark(scores_wegbeheerder_limiet = scores_gemeenten_50, 
                              limiet = 50,
                              groepskeuzen_wegbeheerder_limiet = groepskeuzen_gemeenten_50,
                              landelijke_score_limiet = landelijke_score_50)
# Display the plot
fig50gem

Benchmark 70 km/u

# maak een benchmark grafiek voor gemeentelijke wegbeheerders met wegen met limiet 70
fig70gem <- figuur.benchmark(scores_wegbeheerder_limiet = scores_gemeenten_70, 
                              limiet = 70,
                              groepskeuzen_wegbeheerder_limiet = groepskeuzen_gemeenten_70,
                              landelijke_score_limiet = landelijke_score_70)
# Display the plot
fig70gem

Benchmark 80 km/u

# maak een benchmark grafiek voor gemeentelijke wegbeheerders met wegen met limiet 80
fig80gem <- figuur.benchmark(scores_wegbeheerder_limiet = scores_gemeenten_80, 
                              limiet = 80,
                              groepskeuzen_wegbeheerder_limiet = groepskeuzen_gemeenten_80,
                              landelijke_score_limiet = landelijke_score_80)
# Display the plot
fig80gem

Benchmark Totaal

# maak een benchmark grafiek voor gemeentelijke wegbeheerders
fig_totaal_gem <- figuur.benchmark(scores_wegbeheerder_limiet = scores_gemeenten_totaal, 
                              limiet = "totaal",
                              groepskeuzen_wegbeheerder_limiet = groepskeuzen_gemeenten_totaal,
                              landelijke_score_limiet = landelijke_score_totaal)

# Display the plot
fig_totaal_gem

6.5 Benchmarks waterschappen per limiet categorie

In deze paragraaf worden benchmarks getoond voor wegbeherende waterschappen, afgezet tegen het landelijk niveau. De benchmarks worden getoond voor het totale areaal en voor de wegen met een limiet van 50km/uur, 70 km/uur en 80 km/uur apart.

De verschillende benchmarks bevinden zich onder tabbladen die met de muis aangeklikt kunnen worden. Met een knop rechts van de grafiek kan de gewenste wegbeheerder worden gekozen.

# Calculate the average score
landelijke_score_50 <- scores_landelijk$`Score kenmerk gescheiden voorziening voor fietsers`[1]
landelijke_score_70 <- scores_landelijk$`Score kenmerk gescheiden voorziening voor fietsers`[2]
landelijke_score_80 <- scores_landelijk$`Score kenmerk gescheiden voorziening voor fietsers`[3]
landelijke_score_totaal <- scores_landelijk$`Score kenmerk gescheiden voorziening voor fietsers`[4]

# data per waterschap per limiet
scores_waterschappen_50 <- filter(scores_waterschappen, Snelheidslimiet == "50")
scores_waterschappen_70 <- filter(scores_waterschappen, Snelheidslimiet == "70")
scores_waterschappen_80 <- filter(scores_waterschappen, Snelheidslimiet == "80")
scores_waterschappen_totaal <- filter(scores_waterschappen, Snelheidslimiet == "Totaal")

# Create the dropdown menu options
groepskeuzen_waterschappen_50 <- scores_waterschappen_50$Wegbeheerder
groepskeuzen_waterschappen_70 <- scores_waterschappen_70$Wegbeheerder
groepskeuzen_waterschappen_80 <- scores_waterschappen_80$Wegbeheerder
groepskeuzen_waterschappen_totaal <- scores_waterschappen_totaal$Wegbeheerder

grafiekkleuren <- list(color = c(blue_vals[3], green_vals[3]))

Benchmark 50 km/u

# maak een benchmark grafiek voor waterschaps-wegbeheerders met wegen met limiet 50
fig50wat <- figuur.benchmark(scores_wegbeheerder_limiet = scores_waterschappen_50, 
                              limiet = 50,
                              groepskeuzen_wegbeheerder_limiet = groepskeuzen_waterschappen_50,
                              landelijke_score_limiet = landelijke_score_50)

# Display the plot
fig50wat

Benchmark 70 km/u

# maak een benchmark grafiek voor waterschaps-wegbeheerders met wegen met limiet 70
fig70wat <- figuur.benchmark(scores_wegbeheerder_limiet = scores_waterschappen_70, 
                              limiet = 70,
                              groepskeuzen_wegbeheerder_limiet = groepskeuzen_waterschappen_70,
                              landelijke_score_limiet = landelijke_score_70)

# Display the plot
fig70wat

Benchmark 80 km/u

# maak een benchmark grafiek voor waterschaps-wegbeheerders met wegen met limiet 80
fig80wat <- figuur.benchmark(scores_wegbeheerder_limiet = scores_waterschappen_80, 
                              limiet = 80,
                              groepskeuzen_wegbeheerder_limiet = groepskeuzen_waterschappen_80,
                              landelijke_score_limiet = landelijke_score_80)

# Display the plot
fig80wat

Benchmark Totaal

# maak een benchmark grafiek voor waterschaps-wegbeheerders met wegen met limiet 60
fig_totaal_wat <- figuur.benchmark(scores_wegbeheerder_limiet = scores_waterschappen_totaal, 
                              limiet = "totaal",
                              groepskeuzen_wegbeheerder_limiet = groepskeuzen_waterschappen_totaal,
                              landelijke_score_limiet = landelijke_score_totaal)
# Display the plot
fig_totaal_wat

6.6 Aandachtspunten bij de SPI Veilige Infrastructuur - kenmerk gescheiden voorziening voor fietsers

Hieronder noemen we een aantal aandachtspunten bij de resultaten en de bepaling van de SPI Veilige Infrastructuur - kenmerk gescheiden voorziening voor fietsers:

  • Wegen met een snelheidslimiet van 100 km/uur zijn buiten beschouwing gelaten omdat is aangenomen dat het in de praktijk al niet meer voorkomt dat op deze wegen fietsers mengen met zwaar verkeer
  • Van wegen met een limiet van 60 km/uur is aangenomen dat dit erftoegangswegen buiten de bebouwde kom betreft. Hiervan is aangenomen dat deze veilig zijn voor de fiets. Een beoordeling van de hoeveelheid verkeer en de daaruit volgende wenselijkheid van een gescheiden fietsvoorziening zoals de richtlijn voorschrijft is in deze analyse niet meegenomen. Ook is geen rekening gehouden met bubeko GOW’s met een lokaal lagere limietstelling. Deze informatie is niet landelijk beschikbaar.
  • Om te bepalen of langs een wegvak een fietspad of parallelweg aanwezig is, zijn transects (dwarslijnen) aangemaakt waarmee gekeken wordt of een van deze twee typen infrastructuur naast de hoofdrijbaan aanwezig is. De methode kent een aantal beperkingen
    • Een threshold is gekozen voor welk deel van de transects een fietspad of parallelweg aanwezig dient te zijn om een wegvak positief te beoordelen. De keuze van de threshold is pragmatisch en gedeeltelijk van invloed op de resultaten
    • Er is gekozen voor een threshold van 50%. Dit kan relatief gunstig uitpakken voor langere wegvakken waarvan minder dan de helft in werkelijkheid niet voldoet.
    • Bij de bepaling van de aanwezigheid van parallelwegen is enkel gekeken naar wegvakken met dezelfde straatnaam of een BST_CODE PAR of VWG. Deze keuze leidt tot vals negatieven waar het gaat om het beoordelen van de aanwezigheid van parallelwegen, maar voorkomt vals negatieven. In de oprdacht ontbrak de tijd voor een verdere optimalisatie en analyse van de effecten van het loslaten van de eis van gelijke straatnamen.
  • De kwaliteit van de WKD verkeerstypen is in 2024 sterk verbeterd. De WKD geeft opzichzelf daarmee al een goed beeld van de menging van fietsers en motorvoertuigen. De gis analyses zijn aanvullend, om daar waar de aanwezigheid van een fietspad of parallelweg is gemist, deze mee te nemen in de beoordeling van dit SPI kenmerk. De resultaten van de gis analyse kunnen conflicteren met de WKD. In gevallen kan dit leiden tot een onterecht positieve beoordeling van een wegvak.
  • De resultaten geven op wegbeheerder niveau een goed beeld. Op wegvakniveau kan het voorkomen dat de resultaten afwijken van de werkelijkheid.
  • Fouten op wegvak niveau kunnen het resultaat zijn van fouten in de registratie van het NWB, zoals een verkeerde snelheidslimiet. Aan wegbeheerders is het verzoek om bij het constateren van fouten ten gevolge van fouten in de brondata waar mogelijk de brondata te verbeteren.

7 Data export wegvakken

De in het vorige hoofdstuk behandelde scores per wegbeheerder zijn bepaald op basis van scores op wegvakniveau. Van elk wegvak is bepaald of deze voldoet aan het kenmerk SPI Veilige Infrastructuur - kenmerk gescheiden voorziening voor fietsers, plus een aantal aanvullende kenmerken. Per wegvak zijn de volgende kenmerken vastgelegd:

# sf df om te exporteren
nwb_wvk_fietsrijbaan_export <- nwb_wegvak_analyse_cat %>% 
  mutate(wvk_voldoet = ifelse(wvk_voldoet == TRUE, "Voldoet", "Voldoet niet"))

# Attributen tabel in tekstformat
nwb_wvk_fietsrijbaan_export_attributentabel <- data.frame(
  Attribuut = c(
    "WVK_ID", "STT_NAAM", "GME_NAAM", "WPSNAAM",
    "shd_lengte", "wvk_lengte","MAXSHD", "shd_maatgevend",
    "gesloten_fiets", "fietspad_aanwezig", "paralle_v.s_aanwezig",
    "WEGBEHSRT", "WEGBEHNAAM", "geometry", "wvk_voldoet"
    ),
  Omschrijving = c(
    "Het unieke nummer voor een Wegvak.",
    "Straatnaam", 
    "Naam van de gemeente waarin de straat ligt", 
    "Naam van de plaats waarin het wegvak ligt.", 
    "Lengte van het deel van het wegvak waarvoor de snelheidslimiet geldt.",
    "Lengte van het wegvak.",
    "Snelheidslimiet op basis van WKD.",
    "De maatgevende snelheidslimiet die geldt op het grootste deel van het wegvak.",
    "Geslotenverklaring aanwezig voor fietsers.",
    "Vrijliggend fietspad aanwezig.",
    "Parallelweg met veilige snelheidslimiet van 30 km/uur aanwezig.",
    "Het type wegbeheerder met G: Gemeente, W: Waterschap, P: Provincie, R: Rijk en T: Particulier.",
    "Naam van de wegbeheerder.", 
    "Het type geometri; in dit geval lijn.",
    "Geeft aan of het wegvak voldoet aan de SPI."
    )
)



# maak een scrol tabel van de attributen tabel
scroltabel_gt(nwb_wvk_fietsrijbaan_export_attributentabel)
Attribuut Omschrijving
WVK_ID Het unieke nummer voor een Wegvak.
STT_NAAM Straatnaam
GME_NAAM Naam van de gemeente waarin de straat ligt
WPSNAAM Naam van de plaats waarin het wegvak ligt.
shd_lengte Lengte van het deel van het wegvak waarvoor de snelheidslimiet geldt.
wvk_lengte Lengte van het wegvak.
MAXSHD Snelheidslimiet op basis van WKD.
shd_maatgevend De maatgevende snelheidslimiet die geldt op het grootste deel van het wegvak.
gesloten_fiets Geslotenverklaring aanwezig voor fietsers.
fietspad_aanwezig Vrijliggend fietspad aanwezig.
paralle_v.s_aanwezig Parallelweg met veilige snelheidslimiet van 30 km/uur aanwezig.
WEGBEHSRT Het type wegbeheerder met G: Gemeente, W: Waterschap, P: Provincie, R: Rijk en T: Particulier.
WEGBEHNAAM Naam van de wegbeheerder.
geometry Het type geometri; in dit geval lijn.
wvk_voldoet Geeft aan of het wegvak voldoet aan de SPI.

Op basis hiervan is eenvoudig te visualiseren welke wegvakken van een wegbeheerder al dan niet voldoen aan dit kenmerk. Onderstaand geven we hiervan een voorbeeld voor wegen met limiet 50 in beheer van de gemeente IJsselstein.

fietsrijbaan_IJsselstein <- nwb_wvk_fietsrijbaan_export %>%
  filter(WEGBEHSRT == "G" & WEGBEHNAAM == "IJsselstein" & shd_maatgevend == "50")
mapview(fietsrijbaan_IJsselstein, 
        zcol = "wvk_voldoet", 
        legend = TRUE,
        layer.name = "Wegvak voldoet aan SPI")

Wegvakken in de kaart zijn aan te klikken. Daarmee wordt de attributentabel van het wegvak geladen en kunnen andere scores en kenmerken van het wegvak worden bekeken.

Deze data is geëxporteerd naar een tekstbestand (csv, scheidingsteken ‘;’, decimaalscheidingsteken ‘,’) en GIS-bestand (geopackage, ofwel .gpkg). De export bevat alle voor deze analyse geselecteerde wegvakken in Nederland. Beide datasets zijn via een aparte downloadoptie openbaar beschikbaar. Het tekstbestand is geschikt voor het openen in bijvoorbeeld Excel. Het geopackage kan gebruikt worden in een GIS viewer, bijvoorbeeld QGIS. Let op dat het decimaal scheidingsteken een ‘,’ betreft conform de Nederlandse standaard. De data in het geopackage is ‘.’ decimaalgescheiden (conform internationale standaarden).

# export naar csv, verwijder daarvoor geometry
write.table(st_drop_geometry(nwb_wvk_fietsrijbaan_export), here("Output", "SPI_kenmerkscore_fietsrijbaan.csv"),
          row.names = FALSE, sep = ";", dec = ",", quote = TRUE)

# export naar geopackage
st_write(nwb_wvk_fietsrijbaan_export, here("Output", "SPI_kenmerkscore_fietsrijbaan.gpkg"), Append = FALSE, delete_dsn = TRUE)

# export van transects naar geopackage
st_write(transects, here("Output", "transects.gpkg"), Append = FALSE, delete_dsn = TRUE)

# let op, het script overschrijft bestaande datasets met dezelfde naam. Maak een kopie van de dataset als je deze bewerkt en wilt bewaren