From e3abb29a27fb7bf89ff6d7865805a389e0a4337c Mon Sep 17 00:00:00 2001 From: Commandre Benjamin <benjamin.commandre@irstea.fr> Date: Thu, 6 Jun 2019 10:49:25 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20doc=20pour=20le=20fichier=20de=20config?= =?UTF-8?q?,=20possibilit=C3=A9=20de=20t=C3=A9l=C3=A9charger=20les=20archi?= =?UTF-8?q?ves?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Archive.py | 41 +++++++++++++++++++++--------------- app/Processing.py | 20 +++++++++--------- config.ini | 53 ++++++++++++++++++++++++++++++++++++++--------- main.py | 41 ++++++++++++++++++++++-------------- 4 files changed, 103 insertions(+), 52 deletions(-) diff --git a/app/Archive.py b/app/Archive.py index 64727ce..731aecc 100644 --- a/app/Archive.py +++ b/app/Archive.py @@ -24,18 +24,18 @@ class Archive(): :param capteur: Nom du satellite utilisé (ex: Landsat, Sentinel2, ...). :type capteur: Chaîne de caractères - :param niveau: Niveau de traitement voulu. + :param niveau: Niveau de traitement voulu. :type niveau: Chaîne de caractères - + :param emprise: Chemin vers le shapefile représentant la zone d'étude. :type emprise: Chaîne de caractères :param sortie: Chemin du dossier de sortie. :type sortie: Chaîne de caractères - + :param annee_debut: Année à partir de laquelle on cherche les images. :type annee_debut: Entier - + :param annee_fin: Année jusqu'à laquelle on cherche les images. :type annee_fin: Entier """ @@ -47,7 +47,7 @@ class Archive(): self._capteur = capteur self.niveau = niveau - + if bandes == "RGB" : self.extent_img = Satellites.SATELLITE[self._capteur][niveau][:-1] else : @@ -55,7 +55,7 @@ class Archive(): if self.niveau == "LEVEL2A" : self.nuage = Satellites.SATELLITE[self._capteur]["NUAGE"] - else : + else : self.nuage = None self.liste_annees = [] @@ -193,7 +193,7 @@ class Archive(): LL_max = self.utm_to_latlng(31, extent_[1], extent_[3], northernHemisphere=True) area_coord_corner = str(LL_min[0]) + ',' + str(LL_min[1]) + ',' + str(LL_max[0]) + ',' + str(LL_max[1]) - + return area_coord_corner def listing(self): @@ -261,7 +261,7 @@ class Archive(): self.logger.info("{0} image(s) correspondent aux critères.".format(len(self.liste_archive))) - def download_auto(self, identifiant, mdp, proxy=""): + def download_auto(self, identifiant, mdp, proxy="", extraction=True): """ Méthode pour télécharger les archives sur le site Theia. @@ -380,13 +380,20 @@ class Archive(): self.logger.debug("url : {}".format(url)) # Requête pour récupérer l'archive reponse = requests.get(url, headers=head, proxies=proxyDict) - # Ajout de l'archive à la liste - liste_content.append(reponse.content) - del reponse - # Traitement des images (fusion, découpage selon la zone d'étude ...) - self.traitement_images(cle, liste_content) - del liste_content + if extraction : + # Ajout de l'archive à la liste + liste_content.append(reponse.content) + del reponse + else : + dossier = "{0}/{1}/Images".format(self.dossier_sortie, cle[:4]) + with open("{0}/{1}".format(dossier,img[1].split("/")[-1]), "wb") as fichier: + fichier.write(reponse.content) + + if extraction : + # Traitement des images (fusion, découpage selon la zone d'étude ...) + self.traitement_images(cle, liste_content) + del liste_content # Mis à jour du fichier de sauvegarde # Lecture du fichier de sauvegarde @@ -434,7 +441,7 @@ class Archive(): ennuagement = (float(nombre_pixel_non_nuage)/float(nombre_pixel_non_null)) if nombre_pixel_non_null != 0 else 0.0 self.logger.debug("Ennuagement : {}%".format(100 - round(ennuagement*100, 2))) - + # Computer cloud's percentage with dist (sum of cloud) by sum of the image's extent # return mosaic_nuage, 1.0 - (float(dist)/(np.sum(mask_spec)) if np.sum(mask_spec) != 0 else 0) return 1.0 - ennuagement @@ -575,7 +582,7 @@ class Archive(): del liste_content - if len(tuiles_image) > 0 : + if len(tuiles_image) > 0 : if len(tuiles_nuage) == 0 or self.calcul_ennuagement(tuiles_nuage) <= self.seuil_nuage: @@ -590,4 +597,4 @@ class Archive(): del tuiles_nuage - del tuiles_image \ No newline at end of file + del tuiles_image diff --git a/app/Processing.py b/app/Processing.py index 5974dd9..de521f0 100644 --- a/app/Processing.py +++ b/app/Processing.py @@ -4,7 +4,7 @@ import os import configparser import datetime -import glob +import glob from osgeo import gdal import otbApplication as otb @@ -12,13 +12,13 @@ import otbApplication as otb from app import Archive def str2bool(v): - return v.lower() in ("true") + return v.lower() in ("true") class Processing(object): - + def __init__(self): pass - + def i_download(self): """ Méthode pour télécharger les images sur le site Theia Land. @@ -30,12 +30,12 @@ class Processing(object): self.check_download = Archive.Archive(self.capteur, self.bandes, self.niveau, self.emprise, self.zone_etude,\ self.resultats, self.annee_debut, int(self.annee_fin), self.seuil_nuage) self.check_download.listing() - self.check_download.download_auto(self.id, self.mdp, self.proxy) + self.check_download.download_auto(self.id, self.mdp, self.proxy, extraction=self.extraction) self.liste_dossier = dict() for annee in os.listdir(self.resultats): - with open("{}/{}/dates.txt".format(self.resultats, annee), "w") as fichier : + with open("{}/{}/dates.txt".format(self.resultats, annee), "w") as fichier : for image in sorted(glob.glob("{}/{}/Images/*".format(self.resultats, annee))) : fichier.write("{}\n".format(os.path.basename(image)[:-4])) @@ -62,7 +62,7 @@ class Processing(object): """ options_vrt = gdal.ParseCommandLine('-resolution highest -separate') - + otb_NDVI = otb.Registry.CreateApplication("RadiometricIndices") otb_NDVI.SetParameterInt("channels.blue", 1) otb_NDVI.SetParameterInt("channels.green", 2) @@ -71,7 +71,7 @@ class Processing(object): otb_NDVI.SetParameterStringList("list", ["Vegetation:NDVI"]) sauvegarde = configparser.ConfigParser() - + for annee in self.liste_dossier : sauvegarde.read("{}/{}/sauvegarde.ini".format(self.resultats, annee)) @@ -97,9 +97,9 @@ class Processing(object): with open("{}/{}/sauvegarde.ini".format(self.resultats, annee), 'w') as configfile: sauvegarde.write(configfile) - def i_images_processing(self): + def i_images_processing(self): """ Calul le ndvi, fusionnne en une seule image puis lance le module OTBPhenology """ self.calcul_ndvi() - self.otbPhenologie() \ No newline at end of file + self.otbPhenologie() diff --git a/config.ini b/config.ini index 48b1a8a..32b6f8d 100644 --- a/config.ini +++ b/config.ini @@ -1,17 +1,50 @@ [donnees] -chemin_emprise = -annee_debut = -annee_fin = +# chemin/vers/shapefile/emprise +chemin_emprise = + +# chemin/vers/shapefile/zone_etude +# Si vide, zone d'étude = emprise +chemin_zone_etude = + +# Année à partir de laquelle les images ont été prises +annee_debut = + +# Année limite d'acquisition des images +# Si vide, l'année de fin correspond à l'année actuelle +annee_fin = + +# Pourcentage maximal d'ennuagement +seuil_nuage = 5.0 [sortie] -chemin = +# chemin/dossier/resultats +chemin = + +# Vrai si extraction des images des archives, faux si téléchagement de celles-ci +extraction = True [theia] -identifiant = -mdp = -proxy = +# Identifiant Theia-land +identifiant = + +# Mot de passe Theia-land +mdp = + +# Proxy de connection si nécessaire +proxy = [satellite] -capteur = -processingLevel= -bandes = \ No newline at end of file +# Type du satellite source +# Possibilités :- SENTINEL2 +# - LANDSAT8 +capteur = SENTINEL2 + +# Niveau de traitement des images satellites +# Possibilités :- LEVEL2A (Acquisition standard) +# - LEVEL3A (Synthèse mensuelle) +processingLevel= LEVEL2A + +# Bandes d'intêrets +# Possibilités :- RGB (Bandes Rouge, Verte, Bleue) +# - RGBI (Bandes Rouge, Verte, Bleue + Proche Infra-rouge) +bandes = RGB diff --git a/main.py b/main.py index c563df6..07b3c50 100644 --- a/main.py +++ b/main.py @@ -5,11 +5,14 @@ import sys, time from osgeo import ogr -import configparser +import configparser from app.Processing import Processing import app.Constantes as Constantes import app.Outils as Outils +def str2bool(v): + return v.lower() in (["false"]) + class Telechargement(Processing): def __init__(self, parent=None): @@ -17,10 +20,10 @@ class Telechargement(Processing): Processing.__init__(self) self.logger = Outils.Log("log", "Téléchargement") - + self.get_variable() - - def get_variable(self): + + def get_variable(self): """ Récupération des variables dans le fichier de configuration """ @@ -30,47 +33,55 @@ class Telechargement(Processing): # Dossier contenant les résultats self.resultats = "{}".format(configfile["sortie"]["chemin"]) - + # Capteur utilisé self.capteur = "{}".format(configfile["satellite"]["capteur"]) self.niveau = "{}".format(configfile["satellite"]["processingLevel"]) self.bandes = "{}".format(configfile["satellite"]["bandes"]) - + + try: + if str2bool("{}".format(configfile["sortie"]["extraction"])): + self.extraction = False + else : + self.extraction = True + except : + self.extraction = True + # Date de début et de fin de la recherche try: self.annee_debut = int("{}".format(configfile["donnees"]["annee_debut"])) except Exception as e: raise "L'année de départ est requise." - + self.annee_fin = "{}".format(configfile["donnees"]["annee_fin"]) self.seuil_nuage = float("{}".format(configfile["donnees"]["seuil_nuage"]))/100.0 if "{}".format(configfile["donnees"]["seuil_nuage"]) else 0.0 - + # Emprise et zone de l'étude self.emprise = "{}".format(configfile["donnees"]["chemin_emprise"]) self.zone_etude = "{}".format(configfile["donnees"]["chemin_zone_etude"]) if not self.zone_etude : self.zone_etude = self.emprise - + # Identifiant, mot de passe et proxy pour le téléchargement des images Théia self.id = "{}".format(configfile["theia"]["identifiant"]) self.mdp = "{}".format(configfile["theia"]["mdp"]) self.proxy = "{}".format(configfile["theia"]["proxy"]) - + def run(self): """ Fonction pour lancer le programme - """ + """ # Début du processus debut = time.time() - + # Recherche de nouvelles images non traitées et téléchargement de celles-ci le cas échéant self.i_download() - - # Traitement des images + + # Traitement des images self.i_images_processing() - + # Fin du processus fin = time.time() -- GitLab