Codurile postale | R-bloggeri

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(Acest articol a fost publicat pentru prima dată pe r.iresmi.netși cu amabilitate a contribuit la R-bloggeri). (Puteți raporta problema legată de conținutul acestei pagini aici)


Doriți să vă distribuiți conținutul pe R-bloggeri? dați clic aici dacă aveți un blog, sau aici dacă nu aveți.

O fotografie cu o cutie poștală franceză galbenă

Cutie poștală galbenă – CC-BY-SA de Elliott Brown

Ziua 30 din 30DayMapChallenge: « Harta finală » (anterior).

Aceste date, deși nu reprezintă o limită administrativă „reală”, sunt adesea folosite în multe aplicații diferite, a se vedea, de exemplu, BNV-D.

Nu există un strat gratuit, actualizat, de limite de poligoane pentru codurile poștale franceze.

  • Baza de date oficială este doar un tabel care oferă un cod poștal pentru fiecare cod de comună, opțional cu coordonatele punctului. Avem câteva coduri poștale partajate de mai multe comune, iar unele comune au mai multe coduri poștale (la aceeași locație).
  • Folosind baza națională de adrese (BAN) putem calcula corpurile convexe: Contours calculés des zones codes postaux. Metoda interesanta dar veche (2021) si cu multe gauri/suprapuneri
  • Fond de carte des codes postaux este drăguț (deși metropolă numai) dar vechi (2013).
library(readr)
library(dplyr)
library(tidyr)
library(stringr)
library(purrr)
library(ggplot2)
library(glue)
library(janitor)
library(sf)
# Postal codes as point by commune
cp_points <- read_csv("https://datanova.laposte.fr/data-fair/api/v1/datasets/laposte-hexasmal/metadata-attachments/base-officielle-codes-postaux.csv",
                      name_repair = make_clean_names) |> 
  separate(geopoint, into = c("lat", "lon"), sep = ",", convert = TRUE) |> 
  drop_na(lon, lat) |> 
  st_as_sf(coords = c("lon", "lat"), crs = "EPSG:4326") |> 
  filter(str_sub(code_commune_insee, 1, 3) < "987") |> 
  mutate(proj = case_when(str_sub(code_commune_insee, 1, 3) %in% c("971", "972", "977", "978") ~ "EPSG:5490",
                          str_sub(code_commune_insee, 1, 3) == "973" ~ "EPSG:2972",
                          str_sub(code_commune_insee, 1, 3) == "974" ~ "EPSG:2975",
                          str_sub(code_commune_insee, 1, 3) == "976" ~ "EPSG:4471",
                          .default = "EPSG:2154"))

# France limits, to clip voronoi polygons
fr <- read_sf("https://static.data.gouv.fr/resources/admin-express-cog-simplifiee-2024-metropole-drom-saint-martin-saint-barthelemy/20240930-094021/adminexpress-cog-simpl-000-2024.gpkg",
              layer = "departement") |> 
  mutate(terr = if_else(insee_reg > "06", "fx", insee_reg)) |> 
  group_by(terr) |> 
  summarise()

# Communes limits and population to give the name of the postal code as the 
# biggest commune (by pop)
com <- read_sf("https://static.data.gouv.fr/resources/admin-express-cog-simplifiee-2024-metropole-drom-saint-martin-saint-barthelemy/20240930-094021/adminexpress-cog-simpl-000-2024.gpkg",
               layer = "commune")

Vom crea poligoane voronoï din puncte de coduri poștale grupate.

st_rename_geom <- function(x, name) {
  names(x)(names(x) == attr(x, "sf_column")) <- name
  st_geometry(x) <- name
  return(x)
}

# We need to use a projection for each territory to avoid geometry errors
voronoi <- function(df, k) {
  df_proj <- df |> 
    st_transform(pull(k, proj)) 
  
  df_proj |> 
    st_union() |> 
    st_voronoi() |> 
    st_cast() |> 
    st_intersection(st_transform(fr, pull(k, proj))) |> 
    st_sf() |> 
    st_rename_geom("geom") |> 
    st_join(df_proj) |> 
    group_by(code_postal) |> 
    summarise() |> 
    st_transform("EPSG:4326")
}

# get the names of the main town of each postal code
noms <- cp_points |> 
  st_join(com |> 
            select(insee_com, nom, population)) |> 
  group_by(code_postal) |> 
  slice_max(population, n = 1, with_ties = FALSE) |> 
  select(code_postal, nom) |> 
  st_drop_geometry()

# create the voronoï for each territory
cp_poly <- cp_points |> 
  group_by(proj) |> 
  group_modify(voronoi) |> 
  ungroup() |> 
  select(-proj) |> 
  st_sf() |> 
  left_join(noms, join_by(code_postal))

Un extras doar pe metropolă:

cp_poly |> 
  filter(str_sub(code_postal, 1, 2) < "97") |> 
  st_transform("EPSG:2154") |> 
  ggplot() +
  geom_sf(fill = "#eeeeee",
          color = "#bbbbbb", 
          linewidth = .1) +
  labs(title = "Codes postaux",
       subtitle = "France métropolitaine - 2024",
       caption = glue("https://r.iresmi.net/ - {Sys.Date()}
                      data: La Poste")) +
  theme_void() +
  theme(plot.caption = element_text(size = 6, color = "darkgrey"))
Harta codurilor poștale francezeHarta codurilor poștale franceze

Figura 1: Franța – coduri poștale 2024

cp_poly |> 
  st_write("codes_postaux_fr_2024.gpkg",
           delete_layer = TRUE,
           quiet = TRUE,
           layer_options = c("IDENTIFIER=Codes postaux France 2024",
                             glue("DESCRIPTION=Métropole + DROM WGS84.
                                  d'après données La Poste + IGN Adminexpress
                                  https://r.iresmi.net/ - {Sys.Date()}")))

Obțineți fișierul: polygones des codes postaux français 2024 (geopachetul WGS84) (3 MB).

  • Metropole + DROM (fără Polinezia, Noua Caledonie,…)
  • Unele părți de poligoane (434) acoperă alte poligoane din comunele în care sunt prezente mai multe coduri poștale.
  • Sunt prezente 4 NA (multipoligoane fără coduri poștale) care acoperă teritorii din afara poligoanelor voronoï.
  • Nu există cod poștal pentru St-Barth/St-Martin?

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.