Commit 4d3850d4 authored by Benjam's avatar Benjam Committed by Benjamin Cuillier
Browse files

module de telechagement rpg + calcul de la sau par commune et culture depuis rpg

parent c35fd0c5
import argparse
from crater.crater_logger import log
import crater.politique_fonciere.calculateur as calculateur_politique_fonciere
import crater.population_agricole.calculateur as calculateur_population_agricole
from crater.crater_logger import log
from crater.outils import comparer_valeurs, reinitialiser_dossier
from crater.surface_agricole_utile import collecteur_rpg, calculateur_surface_agricole_utile
from crater.parcel import collecteur_besoins_api_parcel
from crater.parcel.collecteur_besoins_api_parcel import ID_ASSIETTE_ACTUELLE, ID_ASSIETTE_MOINS_25_POURCENT, \
ID_ASSIETTE_MOINS_50_POURCENT
from crater.territoires.calculateur import calculer_territoires, charger_referentiel_territoires
import crater.politique_fonciere.calculateur as calculateur_politique_fonciere
import crater.population_agricole.calculateur as calculateur_population_agricole
from crater.pratiques_agricoles.calculateur_pratiques_agricoles import calculer_pratiques_agricoles
from crater.production_besoins.calculateur_production_besoins import calculer_axe_production_besoins
from crater.reglages import (
FICHIER_LOG,
CHEMIN_SOURCE_COMMUNES_ET_ARRONDISSEMENTS, CHEMIN_SOURCE_MOUVEMENTS_COMMUNES,
CHEMIN_SOURCE_COMMUNES_ET_ARRONDISSEMENTS, CHEMIN_SOURCE_COMMUNES_SIG, CHEMIN_SOURCE_MOUVEMENTS_COMMUNES,
CHEMIN_SOURCE_EPCIS, CHEMIN_SOURCE_DEPARTEMENTS, CHEMIN_SOURCE_REGIONS, CHEMIN_SOURCE_CODES_POSTAUX,
CHEMIN_SOURCE_POPULATION_TOTALE, CHEMIN_SOURCE_POPULATION_TOTALE_HISTORIQUE,
CHEMIN_SOURCE_POPULATION_AGRICOLE,
CHEMIN_SOURCE_ARTIFICIALISATION,
CHEMIN_SOURCE_HVN,
DOSSIER_SOURCE_IGN,
URL_SOURCE_RPG,
NOMS_FICHIERS_RPG,
CHEMIN_OUTPUT_DATA,
DOSSIER_SOURCES, DOSSIER_TERRITOIRES, CHEMIN_PRECALCUL_SAU,
DOSSIER_SOURCES, DOSSIER_TERRITOIRES, DOSSIER_SURFACE_AGRICOLE_UTILE,
DOSSIER_POPULATION_AGRICOLE, DOSSIER_POLITIQUE_FONCIERE, DOSSIER_PRATIQUES_AGRICOLES, CHEMIN_SOURCE_SAU_BIO,
CHEMIN_CRATER_DATA_SOURCES,
DOSSIER_PARCEL, DOSSIER_CRATER, DOSSIER_PRODUCTION_BESOINS
DOSSIER_PARCEL, DOSSIER_CRATER, DOSSIER_PRODUCTION_BESOINS, DOSSIER_RPG
)
from crater.territoires.calculateur import calculer_territoires, charger_referentiel_territoires
def calculer_population_agricole(
......@@ -180,6 +186,28 @@ def verification_donnee(territoires, source, colonne, verifier_totaux=False):
return r
def lancer_calcul_surface_agricole_utile():
referentiel_territoires = charger_referentiel_territoires(
CHEMIN_OUTPUT_DATA / DOSSIER_TERRITOIRES
)
reinitialiser_dossier(CHEMIN_OUTPUT_DATA / DOSSIER_SURFACE_AGRICOLE_UTILE)
communes_sig = calculateur_surface_agricole_utile.charger_communes_sig(
CHEMIN_SOURCE_COMMUNES_SIG,
referentiel_territoires
)
calculateur_surface_agricole_utile.calculer_surface_agricole_utile_par_commune_et_culture(
2017,
referentiel_territoires['regions'],
communes_sig,
CHEMIN_CRATER_DATA_SOURCES / DOSSIER_RPG,
NOMS_FICHIERS_RPG,
CHEMIN_OUTPUT_DATA / DOSSIER_SURFACE_AGRICOLE_UTILE,
2
)
def generer_fichiers_resultats_crater():
open(CHEMIN_OUTPUT_DATA / FICHIER_LOG, "w").close()
referentiel_territoires, sources_territoires = calculer_territoires(
......@@ -191,7 +219,7 @@ def generer_fichiers_resultats_crater():
CHEMIN_SOURCE_CODES_POSTAUX,
CHEMIN_SOURCE_POPULATION_TOTALE,
CHEMIN_SOURCE_POPULATION_TOTALE_HISTORIQUE,
CHEMIN_PRECALCUL_SAU,
CHEMIN_OUTPUT_DATA / DOSSIER_SURFACE_AGRICOLE_UTILE / 'sau_par_commune_et_culture',
CHEMIN_CRATER_DATA_SOURCES / DOSSIER_PARCEL / 'correspondance_territoires_parcel_crater.csv',
CHEMIN_OUTPUT_DATA / DOSSIER_TERRITOIRES
)
......@@ -222,8 +250,8 @@ def generer_fichiers_resultats_crater():
CHEMIN_CRATER_DATA_SOURCES / DOSSIER_CRATER / 'cultures_et_groupes_cultures.csv',
CHEMIN_CRATER_DATA_SOURCES / DOSSIER_PARCEL / 'produits_hors_elevage_vers_codes_cultures.csv',
CHEMIN_CRATER_DATA_SOURCES / DOSSIER_PARCEL / 'produits_elevage_vers_codes_cultures.csv',
CHEMIN_CRATER_DATA_SOURCES / 'rpg' / '2017' / 'sau_rpg_communes_2017.csv',
CHEMIN_CRATER_DATA_SOURCES / 'rpg' / 'codes_rpg_vers_codes_cultures.csv',
CHEMIN_OUTPUT_DATA / DOSSIER_SURFACE_AGRICOLE_UTILE / 'sau_par_commune_et_culture',
CHEMIN_CRATER_DATA_SOURCES / DOSSIER_CRATER / 'codes_rpg_vers_codes_cultures.csv',
CHEMIN_OUTPUT_DATA / DOSSIER_PRODUCTION_BESOINS
)
......@@ -248,12 +276,28 @@ def lancer_generation_territoires():
CHEMIN_SOURCE_CODES_POSTAUX,
CHEMIN_SOURCE_POPULATION_TOTALE,
CHEMIN_SOURCE_POPULATION_TOTALE_HISTORIQUE,
CHEMIN_PRECALCUL_SAU,
CHEMIN_OUTPUT_DATA / DOSSIER_SURFACE_AGRICOLE_UTILE / 'sau_par_commune_et_culture',
CHEMIN_CRATER_DATA_SOURCES / DOSSIER_PARCEL / 'correspondance_territoires_parcel_crater.csv',
CHEMIN_OUTPUT_DATA / DOSSIER_TERRITOIRES
)
def lancer_calcul_population_agricole():
referentiel_territoires = charger_referentiel_territoires(
CHEMIN_OUTPUT_DATA / DOSSIER_TERRITOIRES
)
reinitialiser_dossier(CHEMIN_OUTPUT_DATA / DOSSIER_PRODUCTION_BESOINS)
calculer_population_agricole(
referentiel_territoires,
CHEMIN_SOURCE_POPULATION_AGRICOLE,
CHEMIN_OUTPUT_DATA,
DOSSIER_SOURCES,
DOSSIER_POPULATION_AGRICOLE
)
def lancer_calcul_politique_fonciere():
referentiel_territoires = charger_referentiel_territoires(
CHEMIN_OUTPUT_DATA / DOSSIER_TERRITOIRES
......@@ -298,8 +342,8 @@ def lancer_calcul_production_besoins():
CHEMIN_CRATER_DATA_SOURCES / DOSSIER_CRATER / 'cultures_et_groupes_cultures.csv',
CHEMIN_CRATER_DATA_SOURCES / DOSSIER_PARCEL / 'produits_hors_elevage_vers_codes_cultures.csv',
CHEMIN_CRATER_DATA_SOURCES / DOSSIER_PARCEL / 'produits_elevage_vers_codes_cultures.csv',
CHEMIN_CRATER_DATA_SOURCES / 'rpg' / '2017' / 'sau_rpg_communes_2017.csv',
CHEMIN_CRATER_DATA_SOURCES / 'rpg' / 'codes_rpg_vers_codes_cultures.csv',
CHEMIN_OUTPUT_DATA / DOSSIER_SURFACE_AGRICOLE_UTILE / 'sau_par_commune_et_culture',
CHEMIN_CRATER_DATA_SOURCES / DOSSIER_CRATER / 'codes_rpg_vers_codes_cultures.csv',
CHEMIN_OUTPUT_DATA / DOSSIER_PRODUCTION_BESOINS
)
......@@ -332,8 +376,11 @@ if __name__ == '__main__':
+ "\tparcel-besoins-assiette-actuelle\tgénérer le fichier des besoins en SAU à partir de l'api PARCEL, pour l'assiette actuelle\n"
+ "\tparcel-besoins-assiette-25p\t\tgénérer le fichier des besoins en SAU à partir de l'api PARCEL, pour une assiette avec -25 pourcent de produit de l'élevage\n"
+ "\tparcel-besoins-assiette-50p\t\tgénérer le fichier des besoins en SAU à partir de l'api PARCEL, pour une assiette avec -50 poucent de produit de l'élevage\n"
+ "\trpg\t\ttélécharger les fichiers régionales du RPG\n"
+ "\tcrater\t\t\t\t\tgénérer l'ensemble des fichiers résultat crater-data, à partir des fichiers sources et des fichiers générés lors des autres étapes\n"
+ "\tsurface-agricole-utile\t\t\tgénérer les fichiers résultat crater-data des surfaces agricoles utiles\n"
+ "\tterritoires\t\t\tgénérer les fichiers résultat crater-data, pour les territoires\n"
+ "\tpopulation-agricole\t\t\tgénérer les fichiers résultat crater-data, pour l'axe population agricole\n"
+ "\tpolitique-fonciere\t\t\tgénérer les fichiers résultat crater-data, pour l'axe politique foncière\n"
+ "\tpratiques-agricoles\t\t\tgénérer les fichiers résultat crater-data, pour l'axe pratiques agricoles\n"
+ "\tproduction-besoins\t\t\tgénérer les fichiers résultat crater-data, pour l'axe production-besoins\n"
......@@ -343,11 +390,14 @@ if __name__ == '__main__':
choices=['parcel-besoins-assiette-actuelle',
'parcel-besoins-assiette-25p',
'parcel-besoins-assiette-50p',
'rpg',
'surface-agricole-utile',
'crater',
'territoires',
'pratiques-agricoles',
'politique-fonciere',
'production-besoins'
'production-besoins',
'population-agricole'
])
args = parser.parse_args()
......@@ -378,6 +428,17 @@ if __name__ == '__main__':
CHEMIN_CRATER_DATA_SOURCES / DOSSIER_PARCEL / 'parcel_produits_et_categories_202008.csv',
CHEMIN_OUTPUT_DATA / DOSSIER_PARCEL / 'reponse_api_parcel_besoins_sau_par_produits_assiette_moins_50p.csv'
)
elif(args.ETAPE == 'rpg'):
log.info("Téléchargmeent des fichiers source RPG")
collecteur_rpg.telecharger_rpg_toutes_les_regions(
URL_SOURCE_RPG,
NOMS_FICHIERS_RPG,
2017,
CHEMIN_CRATER_DATA_SOURCES / DOSSIER_RPG
)
elif (args.ETAPE == 'surface-agricole-utile'):
log.info("Génération des fichiers résultats CRATER des surfaces agricoles utiles")
lancer_calcul_surface_agricole_utile()
elif (args.ETAPE == 'crater'):
log.info("Génération des fichiers résultats CRATER")
generer_fichiers_resultats_crater()
......@@ -393,5 +454,8 @@ if __name__ == '__main__':
elif (args.ETAPE == 'politique-fonciere'):
log.info("Génération des fichiers résultats CRATER pour l'axe politique foncière")
lancer_calcul_politique_fonciere()
elif (args.ETAPE == 'population-agricole'):
print("Génération des fichiers résultats CRATER pour l'axe population agricole")
lancer_calcul_population_agricole()
else:
parser.print_help()
import logging
import sys
from functools import wraps
import time
import datetime
FORMATTER = logging.Formatter("%(asctime)s — %(name)s — %(levelname)s — %(message)s")
NOM_FICHIER_LOG_DEFAULT = "crater_data.log"
......@@ -26,3 +30,18 @@ def creer_logger(nom_logger=None, nom_fichier_log=NOM_FICHIER_LOG_DEFAULT):
log = creer_logger('crater_data')
def chronometre(func):
@wraps(func)
def decorer(*args, **kwargs):
debut = time.time()
resultat = func(*args, **kwargs)
temps = datetime.timedelta(seconds=time.time() - debut)
log.info(f'Temps passé dans {func.__name__} = {temps} ')
return resultat
return decorer
......@@ -15,7 +15,7 @@ def calculer(
referentiel_territoires,
sources_politique_fonciere
):
log.info("\n##### CALCUL POLITIQUE FONCIERE #####")
log.info("##### CALCUL POLITIQUE FONCIERE #####")
donnees_politique_fonciere = calculer_donnees_politique_fonciere(referentiel_territoires,
sources_politique_fonciere)
......@@ -84,7 +84,7 @@ def exporter(
politique_fonciere,
chemin_dossier_output
):
log.info("\n##### EXPORT POLITIQUE FONCIERE #####")
log.info("##### EXPORT POLITIQUE FONCIERE #####")
reinitialiser_dossier(chemin_dossier_output)
outils_territoires.imprimer_et_exporter(
......@@ -117,7 +117,7 @@ def exporter(
def charger_sources(
chemin_fichier_artificialisation
):
log.info("\n##### CHARGEMEMENT DES DONNEES SOURCES POLITIQUE FONCIERE #####")
log.info("##### CHARGEMEMENT DES DONNEES SOURCES POLITIQUE FONCIERE #####")
artificialisation = chargeur_artificialisation.charger(chemin_fichier_artificialisation)
artificialisation.id_commune = traduire_code_insee_vers_id_commune_crater(artificialisation.id_commune)
......@@ -131,7 +131,7 @@ def exporter_sources(
sources,
chemin_dossier_output
):
log.info("\n##### EXPORT DES DONNEES SOURCES POLITIQUE FONCIERE #####")
log.info("##### EXPORT DES DONNEES SOURCES POLITIQUE FONCIERE #####")
log.info(" => vers %s", chemin_dossier_output)
reinitialiser_dossier(chemin_dossier_output)
......
......@@ -13,7 +13,7 @@ from crater.territoires.outils import traduire_code_insee_vers_id_commune_crater
def calculer(referentiel_territoires, sources_population_agricole):
log.info("\n##### CALCUL POPULATION AGRICOLE #####")
log.info("##### CALCUL POPULATION AGRICOLE #####")
donnees_population_agricole: DictTerritoires = calculer_donnees_population_agricole(referentiel_territoires,
sources_population_agricole[
......@@ -41,7 +41,7 @@ def exporter(
population_agricole,
chemin_dossier_output
):
log.info("\n##### EXPORT POPULATION AGRICOLE #####")
log.info("##### EXPORT POPULATION AGRICOLE #####")
reinitialiser_dossier(chemin_dossier_output)
outils_territoires.imprimer_et_exporter(
......@@ -74,7 +74,7 @@ def exporter(
def charger_sources(
chemin_fichier_actifs_agricoles_permanents
):
log.info("\n##### CHARGEMEMENT DES DONNEES SOURCES POPULATION AGRICOLE #####")
log.info("##### CHARGEMEMENT DES DONNEES SOURCES POPULATION AGRICOLE #####")
actifs_agricoles_permanents = pd.merge(
chargeur_population_agricole.charger(
......@@ -105,7 +105,7 @@ def exporter_sources(
sources,
chemin_dossier_output
):
log.info("\n##### EXPORT DES DONNEES SOURCES POPULATION AGRICOLE #####")
log.info("##### EXPORT DES DONNEES SOURCES POPULATION AGRICOLE #####")
log.info(" => vers %s", chemin_dossier_output)
reinitialiser_dossier(chemin_dossier_output)
......
......@@ -15,7 +15,7 @@ def calculer_pratiques_agricoles(
chemin_fichier_surfaces_bio: Path,
chemin_dossier_output: Path
) -> Territoires:
log.info("\n##### CALCUL PRATIQUES AGRICOLES #####")
log.info("##### CALCUL PRATIQUES AGRICOLES #####")
donnees_pratiques_agricoles = outils_territoires.assembler_dict_territoires_en_df_territoires(
outils_territoires.copier_en_gardant_colonnes(
......@@ -49,7 +49,7 @@ def _exporter(
donnees_pratiques_agricoles: Territoires,
chemin_dossier_output: Path
):
log.info("\n##### EXPORT PRATIQUES AGRICOLES #####")
log.info("##### EXPORT PRATIQUES AGRICOLES #####")
reinitialiser_dossier(chemin_dossier_output)
donnees_pratiques_agricoles.drop(
......
......@@ -15,7 +15,7 @@ def calculer_axe_production_besoins(
fichier_cultures_et_groupes_cultures: Path,
fichier_produits_hors_elevage_vers_cultures: Path,
fichier_produit_elevage_vers_cultures: Path,
fichier_sau_production: Path,
fichiers_sau_production: Path,
fichier_cultures_rpg_vers_groupes_cultures: Path,
chemin_dossier_resultats: Path) -> None:
log.info("##### CALCUL AXE PRODUCTION BESOINS #####")
......@@ -26,7 +26,7 @@ def calculer_axe_production_besoins(
fichier_produit_elevage_vers_cultures,
chemin_dossier_resultats)
production_par_culture = calculer_production(territoires, fichier_sau_production,
production_par_culture = calculer_production(territoires, fichiers_sau_production,
fichier_cultures_et_groupes_cultures,
fichier_cultures_rpg_vers_groupes_cultures,
chemin_dossier_resultats)
......
......@@ -7,10 +7,13 @@ from crater.outils import produit_cartesien
from crater.production_besoins.chargeur_sources_production_besoins import _charger, \
_charger_definition_cultures_et_groupes_cultures_production
from crater.production_besoins.export_production_besoins import _exporter_sau_par_culture
import crater.surface_agricole_utile.chargeur_sau_par_commune_et_culture as chargeur_sau_par_commune_et_culture
from crater.territoires.outils import assembler_dict_territoires_en_df_territoires
#TODO est-ce qu'on vérifie à un moment que tous les codes RPG ont une translation CRATer, pour ne pasoublie des surfaces
# agricoles? ie que le fichier codes_rpg_vers_codes_cultures.csv est complet
def calculer_production(territoires, fichier_sau_production, fichier_cultures_et_groupes_cultures,
def calculer_production(territoires, fichiers_sau_production, fichier_cultures_et_groupes_cultures,
fichier_correspondance_cultures_rpg_vers_groupes_cultures,
chemin_dossier_resultats):
log.info("##### CALCUL PRODUCTION #####")
......@@ -19,7 +22,7 @@ def calculer_production(territoires, fichier_sau_production, fichier_cultures_et
df_production_par_cultures = _initialiser_df_production_par_cultures(
fichier_cultures_et_groupes_cultures,
territoires)
df_production_par_cultures = _ajouter_colonnes_production(df_production_par_cultures, fichier_sau_production,
df_production_par_cultures = _ajouter_colonnes_production(df_production_par_cultures, fichiers_sau_production,
fichier_correspondance_cultures_rpg_vers_groupes_cultures)
df_production_par_cultures = _aggreger_production_sur_echelles_territoriales(df_production_par_cultures)
df_production_par_cultures = _ajouter_colonnes_cultures_et_groupes_cultures(df_production_par_cultures,
......@@ -103,10 +106,10 @@ def _aggreger_production_sur_echelle_territoriale(df_production, nom_colonnes_ag
def _ajouter_colonnes_production(df_production,
fichier_sau_production,
fichiers_sau_production,
fichier_correspondance_cultures_rpg_vers_groupes_cultures):
df_production_communes_par_cultures = _calculer_production_communes_par_culture(
fichier_correspondance_cultures_rpg_vers_groupes_cultures, fichier_sau_production)
fichier_correspondance_cultures_rpg_vers_groupes_cultures, fichiers_sau_production)
df_production = pandas.merge(df_production, df_production_communes_par_cultures, how='left',
left_on=['id_territoire', 'code_culture'], right_on=['id_commune', 'code_culture'],
suffixes=(False, False))
......@@ -117,8 +120,8 @@ def _ajouter_colonnes_production(df_production,
def _calculer_production_communes_par_culture(fichier_correspondance_cultures_rpg_vers_groupes_cultures,
fichier_sau_production_par_culture_rpg):
donnees_production_par_cultures = _charger(fichier_sau_production_par_culture_rpg)
fichiers_sau_production_par_culture_rpg):
donnees_production_par_cultures = chargeur_sau_par_commune_et_culture.charger(fichiers_sau_production_par_culture_rpg)
codes_rpg_vers_code_cultures = _charger(fichier_correspondance_cultures_rpg_vers_groupes_cultures)
donnees_production_par_cultures = donnees_production_par_cultures.merge(codes_rpg_vers_code_cultures, how='left',
on='code_culture_rpg')
......
......@@ -6,6 +6,10 @@ CHEMIN_SOURCE_COMMUNES_ET_ARRONDISSEMENTS = Path(
CHEMIN_CRATER_DATA_SOURCES /
"insee/geographie/communes/2020/table-appartenance-geo-communes-20.xlsx"
)
CHEMIN_SOURCE_COMMUNES_SIG = Path(
CHEMIN_CRATER_DATA_SOURCES /
"open_street_map/communes_sig/2020/communes-20200101-shp/communes-20200101.shp"
)
CHEMIN_SOURCE_EPCIS = Path(
CHEMIN_CRATER_DATA_SOURCES /
"insee/geographie/epcis/2020/Intercommunalite - Metropole au 01-01-2020.xlsx"
......@@ -50,6 +54,7 @@ CHEMIN_SOURCE_SAU_BIO = Path(
CHEMIN_CRATER_DATA_SOURCES /
"agence_bio/2011-2019/Donnees_EPCI_AgenceBio_2019.xlsx"
)
DOSSIER_SOURCE_IGN = Path("ign")
DOSSIER_PARCEL = Path("parcel")
DOSSIER_CRATER = Path("crater")
......@@ -58,7 +63,8 @@ CHEMIN_OUTPUT_DATA = Path("../crater-data-resultats")
DOSSIER_SOURCES = Path("sources")
DOSSIER_TERRITOIRES = Path("territoires")
DOSSIER_SAU = Path("sau")
DOSSIER_RPG = Path("ign")
DOSSIER_SURFACE_AGRICOLE_UTILE = Path("surface_agricole_utile")
DOSSIER_POPULATION_AGRICOLE = Path("population_agricole")
DOSSIER_POLITIQUE_FONCIERE = Path("politique_fonciere")
DOSSIER_PRATIQUES_AGRICOLES = Path("pratiques_agricoles")
......@@ -66,8 +72,74 @@ DOSSIER_PRODUCTION_BESOINS = Path("production_besoins")
FICHIER_LOG = Path("log.txt")
CHEMIN_PRECALCUL_SAU = Path(
CHEMIN_CRATER_DATA_SOURCES /
'rpg' / '2017' /
'sau_rpg_communes_2017.csv'
)
URL_SOURCE_RPG = "ftp://RPG_ext:quoojaicaiqu6ahD@ftp3.ign.fr/"
NOMS_FICHIERS_RPG = {
2019: {
# DOMTOM
'R-1': "RPG_2-0__SHP_UTM20W84GUAD_D971-2019_2019-01-15.7z",
'R-2': "RPG_2-0__SHP_UTM20W84MART_D972-2019_2019-01-15.7z",
'R-3': "RPG_2-0__SHP_UTM22RGFG95_D973-2019_2019-01-15.7z",
'R-4': "RPG_2-0__SHP_RGR92UTM40S_D974-2019_2019-01-15.7z",
'R-6': "RPG_2-0__SHP_RGM04UTM38S_D976-2019_2019-01-15.7z",
# METROPOLE
'R-11': "RPG_2-0__SHP_LAMB93_R11-2019_2019-01-15.7z",
'R-24': "RPG_2-0__SHP_LAMB93_R24-2019_2019-01-15.7z",
'R-27': "RPG_2-0__SHP_LAMB93_R27-2019_2019-01-15.7z",
'R-28': "RPG_2-0__SHP_LAMB93_R28-2019_2019-01-15.7z",
'R-32': "RPG_2-0__SHP_LAMB93_R32-2019_2019-01-15.7z",
'R-44': "RPG_2-0__SHP_LAMB93_R44-2019_2019-01-15.7z",
'R-52': "RPG_2-0__SHP_LAMB93_R52-2019_2019-01-15.7z",
'R-53': "RPG_2-0__SHP_LAMB93_R53-2019_2019-01-15.7z",
'R-75': "RPG_2-0__SHP_LAMB93_R75-2019_2019-01-15.7z",
'R-76': "RPG_2-0__SHP_LAMB93_R76-2019_2019-01-15.7z",
'R-84': "RPG_2-0__SHP_LAMB93_R84-2019_2019-01-15.7z",
'R-93': "RPG_2-0__SHP_LAMB93_R93-2019_2019-01-15.7z",
'R-94': "RPG_2-0__SHP_LAMB93_R94-2019_2019-01-15.7z",
},
2018: {
# DOMTOM
'R-1': "RPG_2-0__SHP_UTM20W84GUAD_D971-2018_2018-01-15.7z.001",
'R-2': "RPG_2-0__SHP_UTM20W84MART_D972-2018_2018-01-15.7z.001",
'R-3': "RPG_2-0__SHP_UTM22RGFG95_D973-2018_2018-01-15.7z.001",
'R-4': "RPG_2-0__SHP_RGR92UTM40S_D974-2018_2018-01-15.7z.001",
'R-6': "RPG_2-0__SHP_RGM04UTM38S_D976-2018_2018-01-15.7z.001",
# METROPOLE
'R-11': "RPG_2-0__SHP_LAMB93_R11-2018_2018-01-15.7z.001",
'R-24': "RPG_2-0__SHP_LAMB93_R24-2018_2018-01-15.7z.001",
'R-27': "RPG_2-0__SHP_LAMB93_R27-2018_2018-01-15.7z.001",
'R-28': "RPG_2-0__SHP_LAMB93_R28-2018_2018-01-15.7z.001",
'R-32': "RPG_2-0__SHP_LAMB93_R32-2018_2018-01-15.7z.001",
'R-44': "RPG_2-0__SHP_LAMB93_R44-2018_2018-01-15.7z.001",
'R-52': "RPG_2-0__SHP_LAMB93_R52-2018_2018-01-15.7z.001",
'R-53': "RPG_2-0__SHP_LAMB93_R53-2018_2018-01-15.7z.001",
'R-75': "RPG_2-0__SHP_LAMB93_R75-2018_2018-01-15.7z.001",
'R-76': "RPG_2-0__SHP_LAMB93_R76-2018_2018-01-15.7z.001",
'R-84': "RPG_2-0__SHP_LAMB93_R84-2018_2018-01-15.7z.001",
'R-93': "RPG_2-0__SHP_LAMB93_R93-2018_2018-01-15.7z.001",
'R-94': "RPG_2-0__SHP_LAMB93_R94-2018_2018-01-15.7z.001",
},
2017: {
# DOMTOM
'R-1': "RPG_2-0__SHP_UTM20W84GUAD_R01-2017_2017-01-01.7z.001",
'R-2': "RPG_2-0__SHP_UTM20W84MART_R02-2017_2017-01-01.7z.001",
'R-3': "RPG_2-0__SHP_UTM22RGFG95_R03-2017_2017-01-01.7z.001",
'R-4': "RPG_2-0__SHP_RGR92UTM40S_R04-2017_2017-01-01.7z.001",
'R-6': "RPG_2-0__SHP_RGM04UTM38S_R06-2017_2017-01-01.7z.001",
# METROPOLE
'R-11': "RPG_2-0__SHP_LAMB93_R11-2017_2017-01-01.7z.001",
'R-24': "RPG_2-0__SHP_LAMB93_R24-2017_2017-01-01.7z.001",
'R-27': "RPG_2-0__SHP_LAMB93_R27-2017_2017-01-01.7z.001",
'R-28': "RPG_2-0__SHP_LAMB93_R28-2017_2017-01-01.7z.001",
'R-32': "RPG_2-0__SHP_LAMB93_R32-2017_2017-01-01.7z.001",
'R-44': "RPG_2-0__SHP_LAMB93_R44-2017_2017-01-01.7z.001",
'R-52': "RPG_2-0__SHP_LAMB93_R52-2017_2017-01-01.7z.001",
'R-53': "RPG_2-0__SHP_LAMB93_R53-2017_2017-01-01.7z.001",
'R-75': "RPG_2-0__SHP_LAMB93_R75-2017_2017-01-01.7z.001",
'R-76': "RPG_2-0__SHP_LAMB93_R76-2017_2017-01-01.7z.001",
'R-84': "RPG_2-0__SHP_LAMB93_R84-2017_2017-01-01.7z.001",
'R-93': "RPG_2-0__SHP_LAMB93_R93-2017_2017-01-01.7z.001",
'R-94': "RPG_2-0__SHP_LAMB93_R94-2017_2017-01-01.7z.001",
}
}
CRS_PROJET = "EPSG:2154"
\ No newline at end of file
from pathlib import Path
import crater.territoires.outils as outils_territoires
from crater.crater_logger import log
def exporter(
sau,
chemin_dossier_output
):
log.info("\n##### EXPORT SAU #####")
fichier_output = Path(chemin_dossier_output / "sau_totale.csv")
if fichier_output.exists():
fichier_output.unlink()
sau_totale = sau.groupby(['id_commune']).sum().reset_index()
outils_territoires.exporter_fichier_unique(
sau_totale,
fichier_output
)
from pathlib import Path
import pandas as pd
from pandas import DataFrame
from crater.crater_logger import log
from crater.territoires.outils import traduire_code_insee_vers_id_commune_crater
def charger(chemin_fichier: Path) -> DataFrame:
log.info(" => Chargement sau depuis %s", chemin_fichier)
return pd.read_csv(
chemin_fichier,
sep=";",
encoding='utf-8',
# dtype={'id_commune': 'str',
# 'sau_ha': 'float64'}
)
# return pd.read_csv(
# chemin_fichier,
# sep=";",
# encoding='utf-8',
# dtype={'insee': 'str'}
# ).rename(
# columns={
# 'insee': 'id_commune',
# 'CODE_CULTU': 'code_culture',
# 'superficie_ha': 'sau_ha'
# },
# ).round(
# {'sau_ha': 3}
# )
def traduire_code_insee_vers_id_crater(communes: DataFrame) -> DataFrame:
communes.id_commune = traduire_code_insee_vers_id_commune_crater(communes.id_commune)
return communes
from functools import partial
from multiprocessing import Pool
from pathlib import Path
from typing import List
import pandas as pd
import geopandas as gpd
import crater.surface_agricole_utile.chargeur_rpg as chargeur_rpg
import crater.surface_agricole_utile.chargeur_communes as chargeur_communes
from crater.crater_logger import log, chronometre
from crater.outils import DictTerritoires, reinitialiser_dossier
import crater.territoires.outils as outils_territoires
def calculer_surface_agricole_utile_par_commune_et_culture(
annee_rpg: int,
regions: pd.DataFrame,
communes_sig: gpd.GeoDataFrame,
dossier_rpg: Path,
noms_fichiers_rpg: List[str],
chemin_dossier_output: Path,
nombre_traitements_paralleles: int = 1
) -> None:
log.info("##### CALCUL SURFACES AGRICOLES PAR COMMUNE ET CULTURE #####")
# NB: les fichiers RPG par région ne sont pas exclusifs (une parcelle à la frontière de 2 régions, peut se trouver
# dans les fichiers des 2 régions
reinitialiser_dossier(chemin_dossier_output / 'sau_par_commune_et_culture')
if nombre_traitements_paralleles == 1:
for id_region in regions['id_region']:
_calculer_surface_agricole_utile_par_region(
annee_rpg,
communes_sig,
dossier_rpg,
noms_fichiers_rpg,
chemin_dossier_output,
id_region
)
else:
partial_calculer_surface_agricole_utile_par_region = partial(
_calculer_surface_agricole_utile_par_region,
annee_rpg,
communes_sig,
dossier_rpg,
noms_fichiers_rpg,
chemin_dossier_output
)
with Pool(processes=nombre_traitements_paralleles) as pool:
pool.map(partial_calculer_surface_agricole_utile_par_region, regions['id_region'])
def _calculer_surface_agricole_utile_par_region(
annee_rpg: int,
communes_sig: gpd.GeoDataFrame,
dossier_rpg: Path,
noms_fichiers_rpg: List[str],
chemin_dossier_output: Path,
id_region: str
):
rpg = chargeur_rpg.charger_rpg_shp(
dossier_rpg / str(annee_rpg) / noms_fichiers_rpg[annee_rpg][id_region]
)
log.info('Intersection RPG - Communes de la région ' + str(id_region))
intersection = _intersecter_rpg_communes(
communes_sig.query('id_region == @id_region'),
rpg
)
_exporter_surface_agricole_utile_region_par_commune_et_culture(
id_region,
intersection,
chemin_dossier_output
)