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