Configuration

Chargement des librairies

library(collectr)
library(datalibaba)
library(httr)
library(sf)

Chargement des variables

À faire impérativement : configurer ou vérifier les paramètres du fichier config.yml avant chargement.

Les paramètres suivants sont ensuite récupérés :

  • nom de la base de données
  • nom du schéma de stockage
  • nom du champ sur lequel poser la clé primaire
  • nom du rôle de connection à la base
# Charger le fichier YAML
config <- yaml::read_yaml("../config.yml")

# Récupérer les variables liées à la base de données
database <- config$database
schema_name <- config$schema_name
primary_key <- config$primary_key
role <- config$role

Téléchargement du lot de données

# Base WFS
base_url <- "https://data.geopf.fr/wfs/ows"

# Filtre CQL par département complété des 3 PPR interdépartementaux connus
# PPRI du bassin aval de la Vilaine : 35DDTM19970002
# PPRI du bassin de la Seiche et de l'Ise : 35DDTM20010065
# PPRI Orne-Sarthe : 61DDT20100003
cql_filter <- "suptype='pm1' AND (id_gaspar LIKE '44%' 
OR id_gaspar LIKE '49%' OR id_gaspar LIKE '53%' 
OR id_gaspar LIKE '72%' OR id_gaspar LIKE '85%'
OR id_gaspar = '35DDTM19970002' 
OR id_gaspar = '35DDTM20010065' 
OR id_gaspar = '61DDT20100003')"

# Construction de l'URL complète (encodage automatique)
url <- modify_url(
  base_url,
  query = list(
    service = "WFS",
    version = "2.0.0",
    request = "GetFeature",
    typeName = "generateur_sup_s",
    outputFormat = "application/json",
    CQL_FILTER = cql_filter
  )
)

# Téléchargement du GeoJSON
tmpfile <- tempfile(fileext = ".geojson")
GET(url, write_disk(tmpfile, overwrite = TRUE))

Consolidation du lot de données

# Lecture en sf
wfs_data <- sf::st_read(tmpfile, quiet = TRUE)

# Reprojection en EPSG 2154
wfs_data_2154 <- sf::st_transform(wfs_data, 2154)
# Remplacements ciblés
wfs_data_2154 <- wfs_data_2154 |>
  dplyr::mutate(
    typegen = dplyr::recode(
      typegen,
      "P��rim��tre r��glement�� du PPR" = "Périmètre réglementé du PPR"
    ),
    modegenere = dplyr::recode(
      modegenere,
      "G��om��trie fictive" = "Géométrie fictive"
    )
  )
# Consolidation de la structure du dataframe
n_sup_pm1_s_r52 <- wfs_data_2154 |>
  dplyr::select(id,
                gid,
                gpu_doc_id,
                gpu_status,
                gpu_timestamp,
                suptype,
                partition,    
                fichier, 
                id_generateur = idgen,
                id_sup = idsup,
                nom_generateur = nomgen,
                type_generateur = typegen,
                mode_generateur = modegenere,
                source_generateur = srcgeogen,   
                date_source_generateur = datesrcgen,
                ref_bd_externe = refbdext,
                id_bd_externe = idbdext,
                adresse,
                type,
                id_gaspar,
                code_alea,
                croisement,
                type_gest,
                type_voie,
                url_grisq,
                url_grisk,
                nom_sup_litt = nomsuplitt,
                nom_reglement = nomreg,
                url_reglement = urlreg,
                the_geom = geometry)

Publication en base

Archivage de la version précédente de la table

collectr::archive_table(host = Sys.getenv("server"),
                        database = database,
                        table = "n_sup_pm1_s_r52",
                        schema = schema_name,
                        new_schema = "zz_archives",
                        role = role)

Publication de la nouvelle version de la table

# Publication des données en base
datalibaba::poster_data(data = n_sup_pm1_s_r52,
                        table = "n_sup_pm1_s_r52",
                        schema = "amenagement_urbanisme",
                        db = database,
                        pk = "id",
                        overwrite = TRUE,
                        user = role)

Correction des géométries invalides

# Connection à la base PostgreSQL
connexion <- datalibaba::connect_to_db(db = database, user = role)

# Correction des géométries
update_the_geom <- "UPDATE amenagement_urbanisme.n_sup_pm1_s_r52
SET the_geom = ST_MakeValid(ST_Buffer(the_geom,0))
WHERE NOT ST_IsValid(the_geom);"

# Exécution de la requête
DBI::dbExecute(connexion, update_the_geom)

# Fermeture de la connection à la base de données
DBI::dbDisconnect(connexion)

Ajout des commentaires

À exécuter une fois uniquement pour créer la structure du dictionnaire de données à partir de celle du dataframe :

# Création du dictionnaire de données
collectr::create_dictionary(n_sup_pm1_s_r52, "sup_pm1")

Saisir ensuite dans dictionaries/dico_ppr.R les libellés correspondants aux noms des champs si l’information est connue.

# Date du jour
# Formater la date au format dd/mm/aaaa
date_now <- format(lubridate::now(), "%d/%m/%Y")

# Connection à la base PostgreSQL
connexion <- datalibaba::connect_to_db(db = database, user = role)

# Commentaire de la table
table_comment <- sprintf("COMMENT ON TABLE amenagement_urbanisme.n_sup_pm1_s_r52
  IS 'Servitudes d''Utilité Publique de type PM1 (Plans de Prévention des Risques) en Pays de la Loire (Source : GéoPortail de l''Urbanisme, mise à jour du %s)';", date_now)

# Exécution de la requête
DBI::dbExecute(connexion, table_comment)

source("../dictionaries/dico_sup_pm1.R")

# Ajouter les commentaires sur les champs
datalibaba::post_dico_attr(dico = dico_sup_pm1, 
                           table = "n_sup_pm1_s_r52", 
                           schema = "amenagement_urbanisme", 
                           db = database,
                           user = role)

# Fermeture de la connection à la base de données
DBI::dbDisconnect(connexion)