library(collectr)
library(datalibaba)
library(httr)
library(sf)
À 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 :
# 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
# 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))
# 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)
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 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)
# 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)
À 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)