Contexte

Objectif

L’objectif de ce script est d’alimenter le champ consommation_enaf dans les tables par département et par millésime d’OCS GE.

Pour ce faire, on utilise une matrice régionale issue des travaux menés par la DREAL, les DDT(M) et les Agences d’urbanisme de la région Pays de la Loire

Chargement des librairies

library(datalibaba)
library(DBI)
library(sf)
library(yaml)

Configuration

On récupère les paramètres suivants via le fichier config.yml :

  • millésimes par département des livrables OCS GE
  • base de données de travail
  • schéma de stockage de l’OCS GE
  • schéma de travail
  • préfixe du nom de la table à créer
  • rôle de connexion
# Charger le fichier YAML
config <- yaml::read_yaml("../config.yml")

# Récupérer la liste annee_dept et le schéma de travail
annee_dept <- config$annee_dept
database <- config$database
ocs_ge_schema <- config$ocs_ge_schema
work_schema <- config$work_schema
prefix_table <- config$prefix_table
role <- config$role

Mise à jour des champs

Les champs suivants sont alimentés :

  • artificialisation
  • consommation_enaf
  • surface

Alimentation du champ artificialisation

Ce champ est alimenté à partir du champ du même nom issu des Données d’artificialisation issues de l’OCS GE.

Il est ensuite utilisé pour : - consolider un cas particulier dans l’alimentation du champ consommation_enaf, - alimenter le champ type_espace.

# Boucle pour insérer les valeurs dans le champ artificialisation
for (annee in names(annee_dept)) {
  depts <- annee_dept[[annee]]

  for (dept in depts) {
    table_name <- paste0(work_schema, ".", prefix_table, annee, "_s_", dept)
    artif_name <- paste0(ocs_ge_schema, ".n_artif_", annee, "_s_d", dept)
    
    # Création de la requête SQL d'UPDATE pour type_espace
    update_artificialisation <- sprintf(
      "UPDATE %s
       SET artificialisation = %s.artificialisation
       FROM %s
       WHERE %s.id = %s.id;",
      table_name, artif_name, artif_name, table_name, artif_name
    )
    connexion <- datalibaba::connect_to_db(db = database, user = role)     
    DBI::dbExecute(connexion, update_artificialisation)
    DBI::dbDisconnect(connexion)
    message(sprintf("Champs artificialisation mis à jour dans la table : %s", 
                    table_name))
  }
}

Alimentation du champ consommation_enaf

Implémentation de la matrice Consommation d’ENAF

Implémentation de la matrice DREAL/DDTM/Agences d’urbanisme de la région Pays de la Loire

Le champ consommation_enaf est de type booléen (TRUE/FALSE) où :

  • TRUE correspond à un espace urbanisé
  • FALSE correspond à un espace NAF (Naturel, Agricole, Forestier).
# Boucle pour créer les tables pour chaque combinaison année/département
for (annee in names(annee_dept)) {
  depts <- annee_dept[[annee]]
  for (dept in depts) {
    # Nom de la table dynamique
    table_name <- paste0(work_schema, ".", prefix_table, annee, "_s_", dept)

    # Requête de mise à jour de la production
    update_surf_query <- sprintf("UPDATE %s 
      SET surface = ROUND(ST_Area(the_geom)::numeric,2);", table_name)
    # Requête de mise à jour du champ consommation_enaf = true
    update_consommation_enaf_true <- sprintf("UPDATE %s
      SET consommation_enaf = TRUE
      WHERE 
      (code_us = 'US1.5' AND code_cs IN ('CS1.1.1', 'CS1.1.2', 'CS1.1.1.1',     'CS1.1.1.2', 'CS1.1.2.1', 'CS1.1.2.2'))
      OR (code_us = 'US2' AND code_cs IN ('CS1.1.1', 'CS1.1.2', 'CS1.1.1.1', 'CS1.1.1.2', 'CS1.1.2.1', 'CS1.1.2.2', 'CS1.2.1', 'CS1.2.2', 'CS2.1.1', 'CS2.1.1.1', 'CS2.1.1.2', 'CS2.1.1.3', 'CS2.1.2', 'CS2.1.3', 'CS2.2.1', 'CS2.2.1.1', 'CS2.2.1.2', 'CS2.2.1.4', 'CS2.2.1.5', 'CS2.2.2'))
      OR (code_us = 'US235' AND code_cs IN ('CS1.1.1', 'CS1.1.1.1', 'CS1.1.1.2', 'CS1.1.2', 'CS1.1.2.1', 'CS2.1.1.1', 'CS2.1.2', 'CS2.2.1'))
      OR (code_us = 'US3' AND code_cs IN ('CS1.1.1', 'CS1.1.2', 'CS1.1.1.1', 'CS1.1.1.2', 'CS1.1.2.1', 'CS1.1.2.2', 'CS1.2.1', 'CS2.1.1', 'CS2.1.1.1', 'CS2.1.1.2', 'CS2.1.1.3', 'CS2.1.2', 'CS2.1.3', 'CS2.2.1', 'CS2.2.1.1', 'CS2.2.1.2', 'CS2.2.1.4', 'CS2.2.1.5', 'CS2.2.2'))
      OR (code_us = 'US5' AND code_cs IN ('CS1.1.1', 'CS1.1.2', 'CS1.1.1.1', 'CS1.1.1.2', 'CS1.1.2.1', 'CS1.1.2.2', 'CS1.2.1', 'CS1.2.2', 'CS2.1.1', 'CS2.1.1.1', 'CS2.1.1.2', 'CS2.1.1.3', 'CS2.1.2', 'CS2.1.3', 'CS2.2.1', 'CS2.2.1.1', 'CS2.2.1.2', 'CS2.2.1.4', 'CS2.2.1.5', 'CS2.2.2'))
      OR (code_us = 'US4.1.1' AND code_cs IN ('CS1.1.1', 'CS1.1.2', 'CS1.1.1.1', 'CS1.1.1.2', 'CS1.1.2.1', 'CS1.1.2.2', 'CS1.2.1', 'CS1.2.2', 'CS2.1.1', 'CS2.1.1.1', 'CS2.1.1.2', 'CS2.1.1.3', 'CS2.1.2', 'CS2.1.3', 'CS2.2.1', 'CS2.2.1.1', 'CS2.2.1.2', 'CS2.2.1.4', 'CS2.2.1.5', 'CS2.2.2'))
      OR (code_us = 'US4.1.2' AND code_cs IN ('CS1.1.1', 'CS1.1.2', 'CS1.1.1.1', 'CS1.1.1.2', 'CS1.1.2.1', 'CS1.1.2.2', 'CS1.2.1', 'CS1.2.2', 'CS2.1.1', 'CS2.1.1.1', 'CS2.1.1.2', 'CS2.1.1.3', 'CS2.1.2', 'CS2.1.3', 'CS2.2.1', 'CS2.2.1.1', 'CS2.2.1.2', 'CS2.2.1.4', 'CS2.2.1.5', 'CS2.2.2'))
      OR (code_us = 'US4.1.3' AND code_cs IN ('CS1.1.1', 'CS1.1.2', 'CS1.1.1.1', 'CS1.1.1.2', 'CS1.1.2.1', 'CS1.1.2.2', 'CS1.2.1', 'CS1.2.2', 'CS2.1.1', 'CS2.1.1.1', 'CS2.1.1.2', 'CS2.1.1.3', 'CS2.1.2', 'CS2.1.3', 'CS2.2.1', 'CS2.2.1.1', 'CS2.2.1.2', 'CS2.2.1.4', 'CS2.2.1.5', 'CS2.2.2'))
      OR (code_us = 'US4.1.4' AND code_cs IN ('CS1.1.1', 'CS1.1.2', 'CS1.1.1.1', 'CS1.1.1.2', 'CS1.1.2.1', 'CS1.1.2.2', 'CS1.2.1'))
      OR (code_us = 'US4.1.5' AND code_cs IN ('CS1.1.1', 'CS1.1.2', 'CS1.1.1.1', 'CS1.1.1.2', 'CS1.1.2.1', 'CS1.1.2.2', 'CS1.2.1', 'CS1.2.2', 'CS2.1.1', 'CS2.1.1.1', 'CS2.1.1.2', 'CS2.1.1.3', 'CS2.1.2', 'CS2.1.3', 'CS2.2.1', 'CS2.2.1.1', 'CS2.2.1.2', 'CS2.2.1.4', 'CS2.2.1.5', 'CS2.2.2'))
      OR (code_us = 'US4.2' AND code_cs IN ('CS1.1.1', 'CS1.1.2', 'CS1.1.1.1', 'CS1.1.1.2', 'CS1.1.2.1', 'CS1.1.2.2', 'CS1.2.1', 'CS1.2.2', 'CS2.1.1', 'CS2.1.1.1', 'CS2.1.1.2', 'CS2.1.1.3', 'CS2.1.2', 'CS2.1.3', 'CS2.2.1', 'CS2.2.1.1', 'CS2.2.1.2', 'CS2.2.1.4', 'CS2.2.1.5', 'CS2.2.2'))
      OR (code_us = 'US4.3' AND code_cs IN ('CS1.1.1', 'CS1.1.2', 'CS1.1.1.1', 'CS1.1.1.2', 'CS1.1.2.1', 'CS1.1.2.2', 'CS1.2.1', 'CS1.2.2', 'CS2.1.1', 'CS2.1.1.1', 'CS2.1.1.2', 'CS2.1.1.3', 'CS2.1.2', 'CS2.1.3', 'CS2.2.1', 'CS2.2.1.1', 'CS2.2.1.2', 'CS2.2.1.4', 'CS2.2.1.5', 'CS2.2.2'))
      OR (code_us = 'US6.1' AND code_cs IN ('CS1.1.1', 'CS1.1.2', 'CS1.1.1.1', 'CS1.1.1.2', 'CS1.1.2.1', 'CS1.1.2.2', 'CS1.2.1', 'CS2.1.1', 'CS2.1.1.1', 'CS2.1.1.2', 'CS2.1.1.3', 'CS2.1.2', 'CS2.1.3', 'CS2.2.1', 'CS2.2.1.1', 'CS2.2.1.2', 'CS2.2.1.4', 'CS2.2.1.5', 'CS2.2.2'))
      OR (code_us = 'US6.2' AND code_cs IN ('CS1.1.1', 'CS1.1.2', 'CS1.1.1.1', 'CS1.1.1.2', 'CS1.1.2.1', 'CS1.1.2.2', 'CS1.2.1', 'CS2.1.1', 'CS2.1.1.1', 'CS2.1.1.2', 'CS2.1.1.3', 'CS2.1.2', 'CS2.1.3', 'CS2.2.1', 'CS2.2.1.1', 'CS2.2.1.2', 'CS2.2.1.4', 'CS2.2.1.5', 'CS2.2.2'))
      OR (code_us = 'US6.3' AND code_cs IN ('CS1.1.1', 'CS1.1.2', 'CS1.1.1.1', 'CS1.1.1.2', 'CS1.1.2.1', 'CS1.1.2.2'))
      OR (code_us = 'US6.6' AND code_cs IN ('CS1.1.1', 'CS1.1.2', 'CS1.1.1.1', 'CS1.1.1.2', 'CS1.1.2.1', 'CS1.1.2.2'));", table_name)

    # Requête de mise à jour du champ consommation_enaf = false    
    update_consommation_enaf_false <- sprintf("UPDATE %s
      SET consommation_enaf = FALSE
      WHERE (code_us IN ('US1.1', 'US1.2', 'US1.3', 'US1.4'))
      OR (code_us = 'US1.5' AND code_cs IN ('CS1.2.1', 'CS1.2.2', 'CS1.2.3', 'CS2.1.1', 'CS2.1.1.1', 'CS2.1.1.2', 'CS2.1.1.3', 'CS2.1.2', 'CS2.1.3', 'CS2.2.1', 'CS2.2.1.1', 'CS2.2.1.2', 'CS2.2.1.4', 'CS2.2.1.5', 'CS2.2.2'))
      OR (code_us = 'US2' AND code_cs = 'CS1.2.3')
      OR (code_us = 'US3' AND code_cs IN ('CS1.2.3', 'CS1.2.2'))
      OR (code_us = 'US5' AND code_cs = 'CS1.2.3')
      OR (code_us = 'US235' AND code_cs = 'CS1.2.2' AND artificialisation = 'non artif')
      OR (code_us = 'US4.1.1' AND code_cs = 'CS1.2.3')
      OR (code_us = 'US4.1.2' AND code_cs = 'CS1.2.3')
      OR (code_us = 'US4.1.3' AND code_cs = 'CS1.2.3')
      OR (code_us = 'US4.1.4' AND code_cs IN ('CS1.2.2', 'CS1.2.3', 'CS2.1.1', 'CS2.1.1.1', 'CS2.1.1.2', 'CS2.1.1.3', 'CS2.1.2', 'CS2.1.3', 'CS2.2.1', 'CS2.2.1.1', 'CS2.2.1.2', 'CS2.2.1.4', 'CS2.2.1.5', 'CS2.2.2'))
      OR (code_us = 'US4.1.5' AND code_cs = 'CS1.2.3')
      OR (code_us = 'US4.2' AND code_cs = 'CS1.2.3')
      OR (code_us = 'US4.3' AND code_cs = 'CS1.2.3')
      OR (code_us = 'US6.1' AND code_cs IN ('CS1.2.2', 'CS1.2.3'))
      OR (code_us = 'US6.2' AND code_cs IN ('CS1.2.2', 'CS1.2.3'))
      OR (code_us = 'US6.3' AND code_cs IN ('CS1.2.1', 'CS1.2.2', 'CS1.2.3', 'CS2.1.1', 'CS2.1.1.1', 'CS2.1.1.2', 'CS2.1.1.3', 'CS2.1.2', 'CS2.1.3', 'CS2.2.1', 'CS2.2.1.1', 'CS2.2.1.2', 'CS2.2.1.4', 'CS2.2.1.5', 'CS2.2.2'))
      OR (code_us = 'US6.6' AND code_cs IN ('CS1.2.1', 'CS1.2.2', 'CS1.2.3', 'CS2.1.1', 'CS2.1.1.1', 'CS2.1.1.2', 'CS2.1.1.3', 'CS2.1.2', 'CS2.1.3', 'CS2.2.1', 'CS2.2.1.1', 'CS2.2.1.2', 'CS2.2.1.4', 'CS2.2.1.5', 'CS2.2.2'));", 
      table_name)
    
    # Connexion à la base de données
    connexion <- datalibaba::connect_to_db(db = database,
                                           user = role)     
    # Exécution des requêtes d'UPDATE
    DBI::dbExecute(connexion, update_surf_query)
    DBI::dbExecute(connexion, update_consommation_enaf_true)
    DBI::dbExecute(connexion, update_consommation_enaf_false)

    # Déconnexion de la base de données
    DBI::dbDisconnect(connexion)
    
    # Message d'information
    message(sprintf("Champ consommation_enaf mis à jour dans la table : %s", 
                    table_name))
  }
}

Traitement des parcs et jardins

# Boucle pour créer les tables pour chaque combinaison année/département
for (annee in names(annee_dept)) {
  depts <- annee_dept[[annee]]
  
  # Sélection du nom de la table des parcs et jardins selon l'année
  table_parcs_jardins <- switch(
    annee,
    "2019" = paste0(ocs_ge_schema, ".n_parcs_jardins_2019_2020_s_r52"),
    "2020" = paste0(ocs_ge_schema, ".n_parcs_jardins_2019_2020_s_r52"),
    "2022" = paste0(ocs_ge_schema, ".n_parcs_jardins_2022_s_r52")
  )
  
  for (dept in depts) {
    # Nom de la table dynamique à traiter
    table_name <- paste0(work_schema, ".", prefix_table, annee, "_s_", dept)
    
    # Requête UPDATE adaptée avec la table des parcs et jardins du bon millésime
    update_consommation_enaf_jardins <- sprintf(
      "UPDATE %s
      SET consommation_enaf = FALSE
      FROM %s 
      WHERE (code_us = 'US3' AND code_cs IN ('CS2.1.1.1', 'CS2.1.1.2', 'CS2.1.1.3', 'CS2.1.2', 'CS2.1.3', 'CS2.2.1', 'CS2.2.1.1', 'CS2.2.1.2', 'CS2.2.1.4', 'CS2.2.1.5', 'CS2.2.2'))
      AND ST_Intersects(%s.the_geom, %s.the_geom);",
      table_name, table_parcs_jardins, table_name, table_parcs_jardins)
    
    # Connexion à la base de données
    connexion <- datalibaba::connect_to_db(db = database, user = role)     
    # Exécution de la requête d'UPDATE
    DBI::dbExecute(connexion, update_consommation_enaf_jardins)
    
    # Déconnexion
    DBI::dbDisconnect(connexion)
    
    # Message d'information
    message(sprintf("Champ consommation_enaf mis à jour dans la table : %s", 
                    table_name))
  }
}

Traitement du photovoltaïque (non testé)

# Boucle pour créer les tables pour chaque combinaison année/département
for (annee in names(annee_dept)) {
  depts <- annee_dept[[annee]]
  for (dept in depts) {
    # Nom de la table dynamique
    table_name <- paste0(work_schema, ".", prefix_table, annee, "_s_", dept)
    
    # Requête UPDATE adaptée avec la table solaire photovoltaïque
    update_consommation_enaf_solaire <- sprintf(
      "UPDATE %s SET consommation_enaf = FALSE
      FROM %s.r_solaire_pv_s_r52
      WHERE ST_Intersects(%s.the_geom,r_solaire_pv_s_r52.the_geom);", 
      ocs_ge_schema, table_name)
    
    # Connexion à la base de données
    connexion <- datalibaba::connect_to_db(db = database, user = role)     
    # Exécution de la requête d'UPDATE
    DBI::dbExecute(connexion, update_consommation_enaf_solaire)
    
    # Déconnexion
    DBI::dbDisconnect(connexion)
    
    # Message d'information
    message(sprintf("Champ consommation_enaf mis à jour dans la table : %s", 
                    table_name))
  }