Parcs de stationnement en ouvrage

Données - Ville de Paris

Code
source(here::here("_rinit.R"))
source(here::here("data", "paris", "_paris.R"))   # wkb2sfc(), paris_basemap(), arrondissements_sf()
invisible(Sys.setlocale("LC_TIME", "fr_FR.UTF-8"))
# cd ~/iCloud/website/data/paris; /usr/local/bin/R -e 'quarto::quarto_render("stationnement-en-ouvrage.qmd")'

knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE,
                      fig.width = 8, fig.height = 5, dpi = 150)

park_path <- here::here("data", "paris", "stationnement-en-ouvrage.parquet")
parking <- arrow::read_parquet(park_path) |>
  dplyr::mutate(ar = suppressWarnings(as.integer(arrdt)))

n_tot     <- nrow(parking)
n_places  <- sum(parking$nb_places, na.rm = TRUE)
arr_sf    <- arrondissements_sf()

theme_carte <- theme_void(base_size = 12) +
  theme(plot.title = element_text(face = "bold"),
        plot.subtitle = element_text(colour = "grey35"),
        plot.margin = margin(5, 12, 5, 5))
theme_barres <- theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"),
        plot.subtitle = element_text(colour = "grey35"),
        panel.grid.major.y = element_blank())

125 parcs de stationnement en ouvrage (parkings couverts, hors stationnement sur voirie), pour 61 147 places au total. Tous payants ; 84 sont ouverts à tous, 41 réservés aux abonnés.

Code
parking |>
  dplyr::arrange(dplyr::desc(nb_places)) |>
  dplyr::transmute(Nom = nom, Adresse = adresse, Arrondissement = ar,
                   Places = nb_places, `Tarif 1h` = tarif_1h) |>
  head(8) |>
  gt::gt() |>
  gt::sub_missing(missing_text = "—") |>
  gt::fmt_currency(columns = `Tarif 1h`, currency = "EUR", decimals = 2) |>
  gt::tab_header(title = "8 plus grands parkings") |>
  gt::tab_options(table.width = "100%")
8 plus grands parkings
Nom Adresse Arrondissement Places Tarif 1h
FOCH 4 ter avenue foch, 75016, Paris 16 2065 €5.40
HAUSSMANN BERRI 163 ter boulevard haussmann, 75008, Paris 8 1649 €5.00
PORTE DE CHAMPERRET 6 ter avenue de la porte de champerret, 75017, Paris 17 1463 €4.50
MEDITERRANEE 40 rue de chalon, 75012, Paris 12 1409 €5.50
PORTE MAILLOT 16 place de la porte maillot, 75017, Paris 17 1293 €4.90
PORTE DE SAINT CLOUD 10 avenue de la porte de saint cloud, 75016, Paris 16 1206 €4.70
GEORGE V 113 avenue des champs elysees, 75008, Paris 8 1117 €5.50
PORTE D AUTEUIL 6 ter avenue du general sarrail, 75016, Paris 16 1116 €4.70

Carte

Code
pal <- leaflet::colorFactor(c("#2f6f4f", "#c0392b"), domain = c("tous", "abonnés"), na.color = "#888")

leaflet::leaflet(parking, options = leaflet::leafletOptions(minZoom = 11)) |>
  paris_basemap() |>
  leaflet::addPolygons(data = arr_sf, fill = FALSE, color = "#999", weight = 1) |>
  leaflet::addCircleMarkers(
    lng = ~xlong, lat = ~ylat,
    radius = ~pmax(4, pmin(14, sqrt(nb_places) / 2)), stroke = FALSE,
    fillOpacity = 0.8, fillColor = ~pal(type_usagers),
    label = ~sprintf("%s — %d places", nom, nb_places),
    popup = ~sprintf("<b>%s</b><br>%s<br>%d places (%d PMR, %d vélo)<br>Tarif 1h : %s",
                     nom, adresse, nb_places, dplyr::coalesce(nb_pmr, 0L), dplyr::coalesce(nb_velo, 0L),
                     ifelse(is.na(tarif_1h), "n.c.", paste0(tarif_1h, " €")))
  ) |>
  leaflet::addLegend("bottomright", pal = pal, values = ~type_usagers, title = "Accès", opacity = 0.9,
                     na.label = "n.c.")

Rayon des cercles ∝ √(nombre de places).

Par arrondissement

Code
cnt <- parking |> dplyr::filter(!is.na(ar)) |> dplyr::group_by(ar) |>
  dplyr::summarise(places = sum(nb_places, na.rm = TRUE), .groups = "drop")

arr_sf |>
  dplyr::left_join(cnt, by = c("c_ar" = "ar")) |>
  ggplot() +
  geom_sf(aes(fill = places), colour = "white", linewidth = 0.2) +
  scale_fill_viridis_c(option = "rocket", direction = -1, na.value = "grey92", name = "Places") +
  labs(title = "Places de stationnement en ouvrage par arrondissement") +
  theme_carte

Tarifs et équipements

Code
parking |>
  dplyr::filter(!is.na(tarif_1h)) |>
  ggplot(aes(tarif_1h)) +
  geom_histogram(binwidth = 0.2, fill = "#3b6f8a") +
  scale_x_continuous(labels = scales::label_number(suffix = " €")) +
  labs(title = "Tarif de la 1ʳᵉ heure",
       subtitle = paste0("Médian : ", median(parking$tarif_1h, na.rm = TRUE), " €"),
       x = NULL, y = "Parkings") +
  theme_barres

Code
cat(sprintf(
  "\n**%d parkings** (%s) proposent des places PMR (%s places au total), et **%d** (%s) des places vélo sécurisées (%s places au total). Aucun ne signale de borne de recharge pour véhicule électrique dans ce jeu de données.\n",
  sum(parking$nb_pmr > 0, na.rm = TRUE),
  scales::percent(mean(parking$nb_pmr > 0, na.rm = TRUE), 1),
  format(sum(parking$nb_pmr, na.rm = TRUE), big.mark = " "),
  sum(parking$nb_velo > 0, na.rm = TRUE),
  scales::percent(mean(parking$nb_velo > 0, na.rm = TRUE), 1),
  format(sum(parking$nb_velo, na.rm = TRUE), big.mark = " ")))

94 parkings (75%) proposent des places PMR (983 places au total), et 79 (63%) des places vélo sécurisées (4 735 places au total). Aucun ne signale de borne de recharge pour véhicule électrique dans ce jeu de données.

Source & données

Code
tibble::tibble(
  ` ` = c("Jeu de données", "Producteur", "Licence", "Fichier", "Mise à jour", "Observations"),
  `  ` = c(
    "[Stationnement en ouvrage](https://opendata.paris.fr/explore/dataset/stationnement-en-ouvrage/information/)",
    "Ville de Paris",
    "Open Database License (ODbL)",
    sprintf("`data/paris/stationnement-en-ouvrage.parquet` (%s ko) + `arrondissements.parquet`",
            round(file.size(park_path) / 1024)),
    format(as.Date(file.mtime(park_path)), "%d %B %Y"),
    sprintf("%d parkings, %s places", n_tot, format(n_places, big.mark = " "))
  )
) |>
  gt::gt() |> gt::fmt_markdown(columns = `  `) |>
  gt::tab_options(table.width = "100%", column_labels.hidden = TRUE)
Jeu de données Stationnement en ouvrage
Producteur Ville de Paris
Licence Open Database License (ODbL)
Fichier data/paris/stationnement-en-ouvrage.parquet (68 ko) + arrondissements.parquet
Mise à jour 05 septembre 2026
Observations 125 parkings, 61 147 places