Commit e3abb29a authored by Commandre Benjamin's avatar Commandre Benjamin
Browse files

Ajout doc pour le fichier de config, possibilité de télécharger les archives

parent aba26126
...@@ -24,18 +24,18 @@ class Archive(): ...@@ -24,18 +24,18 @@ class Archive():
:param capteur: Nom du satellite utilisé (ex: Landsat, Sentinel2, ...). :param capteur: Nom du satellite utilisé (ex: Landsat, Sentinel2, ...).
:type capteur: Chaîne de caractères :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 :type niveau: Chaîne de caractères
:param emprise: Chemin vers le shapefile représentant la zone d'étude. :param emprise: Chemin vers le shapefile représentant la zone d'étude.
:type emprise: Chaîne de caractères :type emprise: Chaîne de caractères
:param sortie: Chemin du dossier de sortie. :param sortie: Chemin du dossier de sortie.
:type sortie: Chaîne de caractères :type sortie: Chaîne de caractères
:param annee_debut: Année à partir de laquelle on cherche les images. :param annee_debut: Année à partir de laquelle on cherche les images.
:type annee_debut: Entier :type annee_debut: Entier
:param annee_fin: Année jusqu'à laquelle on cherche les images. :param annee_fin: Année jusqu'à laquelle on cherche les images.
:type annee_fin: Entier :type annee_fin: Entier
""" """
...@@ -47,7 +47,7 @@ class Archive(): ...@@ -47,7 +47,7 @@ class Archive():
self._capteur = capteur self._capteur = capteur
self.niveau = niveau self.niveau = niveau
if bandes == "RGB" : if bandes == "RGB" :
self.extent_img = Satellites.SATELLITE[self._capteur][niveau][:-1] self.extent_img = Satellites.SATELLITE[self._capteur][niveau][:-1]
else : else :
...@@ -55,7 +55,7 @@ class Archive(): ...@@ -55,7 +55,7 @@ class Archive():
if self.niveau == "LEVEL2A" : if self.niveau == "LEVEL2A" :
self.nuage = Satellites.SATELLITE[self._capteur]["NUAGE"] self.nuage = Satellites.SATELLITE[self._capteur]["NUAGE"]
else : else :
self.nuage = None self.nuage = None
self.liste_annees = [] self.liste_annees = []
...@@ -193,7 +193,7 @@ class Archive(): ...@@ -193,7 +193,7 @@ class Archive():
LL_max = self.utm_to_latlng(31, extent_[1], extent_[3], northernHemisphere=True) 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]) area_coord_corner = str(LL_min[0]) + ',' + str(LL_min[1]) + ',' + str(LL_max[0]) + ',' + str(LL_max[1])
return area_coord_corner return area_coord_corner
def listing(self): def listing(self):
...@@ -261,7 +261,7 @@ class Archive(): ...@@ -261,7 +261,7 @@ class Archive():
self.logger.info("{0} image(s) correspondent aux critères.".format(len(self.liste_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. Méthode pour télécharger les archives sur le site Theia.
...@@ -380,13 +380,20 @@ class Archive(): ...@@ -380,13 +380,20 @@ class Archive():
self.logger.debug("url : {}".format(url)) self.logger.debug("url : {}".format(url))
# Requête pour récupérer l'archive # Requête pour récupérer l'archive
reponse = requests.get(url, headers=head, proxies=proxyDict) 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 ...) if extraction :
self.traitement_images(cle, liste_content) # Ajout de l'archive à la liste
del liste_content 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 # Mis à jour du fichier de sauvegarde
# Lecture du fichier de sauvegarde # Lecture du fichier de sauvegarde
...@@ -434,7 +441,7 @@ class Archive(): ...@@ -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 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))) 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 # 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 mosaic_nuage, 1.0 - (float(dist)/(np.sum(mask_spec)) if np.sum(mask_spec) != 0 else 0)
return 1.0 - ennuagement return 1.0 - ennuagement
...@@ -575,7 +582,7 @@ class Archive(): ...@@ -575,7 +582,7 @@ class Archive():
del liste_content 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: if len(tuiles_nuage) == 0 or self.calcul_ennuagement(tuiles_nuage) <= self.seuil_nuage:
...@@ -590,4 +597,4 @@ class Archive(): ...@@ -590,4 +597,4 @@ class Archive():
del tuiles_nuage del tuiles_nuage
del tuiles_image del tuiles_image
\ No newline at end of file
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
import os import os
import configparser import configparser
import datetime import datetime
import glob import glob
from osgeo import gdal from osgeo import gdal
import otbApplication as otb import otbApplication as otb
...@@ -12,13 +12,13 @@ import otbApplication as otb ...@@ -12,13 +12,13 @@ import otbApplication as otb
from app import Archive from app import Archive
def str2bool(v): def str2bool(v):
return v.lower() in ("true") return v.lower() in ("true")
class Processing(object): class Processing(object):
def __init__(self): def __init__(self):
pass pass
def i_download(self): def i_download(self):
""" """
Méthode pour télécharger les images sur le site Theia Land. Méthode pour télécharger les images sur le site Theia Land.
...@@ -30,12 +30,12 @@ class Processing(object): ...@@ -30,12 +30,12 @@ class Processing(object):
self.check_download = Archive.Archive(self.capteur, self.bandes, self.niveau, self.emprise, self.zone_etude,\ 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.resultats, self.annee_debut, int(self.annee_fin), self.seuil_nuage)
self.check_download.listing() 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() self.liste_dossier = dict()
for annee in os.listdir(self.resultats): 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))) : for image in sorted(glob.glob("{}/{}/Images/*".format(self.resultats, annee))) :
fichier.write("{}\n".format(os.path.basename(image)[:-4])) fichier.write("{}\n".format(os.path.basename(image)[:-4]))
...@@ -62,7 +62,7 @@ class Processing(object): ...@@ -62,7 +62,7 @@ class Processing(object):
""" """
options_vrt = gdal.ParseCommandLine('-resolution highest -separate') options_vrt = gdal.ParseCommandLine('-resolution highest -separate')
otb_NDVI = otb.Registry.CreateApplication("RadiometricIndices") otb_NDVI = otb.Registry.CreateApplication("RadiometricIndices")
otb_NDVI.SetParameterInt("channels.blue", 1) otb_NDVI.SetParameterInt("channels.blue", 1)
otb_NDVI.SetParameterInt("channels.green", 2) otb_NDVI.SetParameterInt("channels.green", 2)
...@@ -71,7 +71,7 @@ class Processing(object): ...@@ -71,7 +71,7 @@ class Processing(object):
otb_NDVI.SetParameterStringList("list", ["Vegetation:NDVI"]) otb_NDVI.SetParameterStringList("list", ["Vegetation:NDVI"])
sauvegarde = configparser.ConfigParser() sauvegarde = configparser.ConfigParser()
for annee in self.liste_dossier : for annee in self.liste_dossier :
sauvegarde.read("{}/{}/sauvegarde.ini".format(self.resultats, annee)) sauvegarde.read("{}/{}/sauvegarde.ini".format(self.resultats, annee))
...@@ -97,9 +97,9 @@ class Processing(object): ...@@ -97,9 +97,9 @@ class Processing(object):
with open("{}/{}/sauvegarde.ini".format(self.resultats, annee), 'w') as configfile: with open("{}/{}/sauvegarde.ini".format(self.resultats, annee), 'w') as configfile:
sauvegarde.write(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 Calul le ndvi, fusionnne en une seule image puis lance le module OTBPhenology
""" """
self.calcul_ndvi() self.calcul_ndvi()
self.otbPhenologie() self.otbPhenologie()
\ No newline at end of file
[donnees] [donnees]
chemin_emprise = # chemin/vers/shapefile/emprise
annee_debut = chemin_emprise =
annee_fin =
# 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] [sortie]
chemin = # chemin/dossier/resultats
chemin =
# Vrai si extraction des images des archives, faux si téléchagement de celles-ci
extraction = True
[theia] [theia]
identifiant = # Identifiant Theia-land
mdp = identifiant =
proxy =
# Mot de passe Theia-land
mdp =
# Proxy de connection si nécessaire
proxy =
[satellite] [satellite]
capteur = # Type du satellite source
processingLevel= # Possibilités :- SENTINEL2
bandes = # - LANDSAT8
\ No newline at end of file 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
...@@ -5,11 +5,14 @@ import sys, time ...@@ -5,11 +5,14 @@ import sys, time
from osgeo import ogr from osgeo import ogr
import configparser import configparser
from app.Processing import Processing from app.Processing import Processing
import app.Constantes as Constantes import app.Constantes as Constantes
import app.Outils as Outils import app.Outils as Outils
def str2bool(v):
return v.lower() in (["false"])
class Telechargement(Processing): class Telechargement(Processing):
def __init__(self, parent=None): def __init__(self, parent=None):
...@@ -17,10 +20,10 @@ class Telechargement(Processing): ...@@ -17,10 +20,10 @@ class Telechargement(Processing):
Processing.__init__(self) Processing.__init__(self)
self.logger = Outils.Log("log", "Téléchargement") self.logger = Outils.Log("log", "Téléchargement")
self.get_variable() self.get_variable()
def get_variable(self): def get_variable(self):
""" """
Récupération des variables dans le fichier de configuration Récupération des variables dans le fichier de configuration
""" """
...@@ -30,47 +33,55 @@ class Telechargement(Processing): ...@@ -30,47 +33,55 @@ class Telechargement(Processing):
# Dossier contenant les résultats # Dossier contenant les résultats
self.resultats = "{}".format(configfile["sortie"]["chemin"]) self.resultats = "{}".format(configfile["sortie"]["chemin"])
# Capteur utilisé # Capteur utilisé
self.capteur = "{}".format(configfile["satellite"]["capteur"]) self.capteur = "{}".format(configfile["satellite"]["capteur"])
self.niveau = "{}".format(configfile["satellite"]["processingLevel"]) self.niveau = "{}".format(configfile["satellite"]["processingLevel"])
self.bandes = "{}".format(configfile["satellite"]["bandes"]) 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 # Date de début et de fin de la recherche
try: try:
self.annee_debut = int("{}".format(configfile["donnees"]["annee_debut"])) self.annee_debut = int("{}".format(configfile["donnees"]["annee_debut"]))
except Exception as e: except Exception as e:
raise "L'année de départ est requise." raise "L'année de départ est requise."
self.annee_fin = "{}".format(configfile["donnees"]["annee_fin"]) 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 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 # Emprise et zone de l'étude
self.emprise = "{}".format(configfile["donnees"]["chemin_emprise"]) self.emprise = "{}".format(configfile["donnees"]["chemin_emprise"])
self.zone_etude = "{}".format(configfile["donnees"]["chemin_zone_etude"]) self.zone_etude = "{}".format(configfile["donnees"]["chemin_zone_etude"])
if not self.zone_etude : if not self.zone_etude :
self.zone_etude = self.emprise self.zone_etude = self.emprise
# Identifiant, mot de passe et proxy pour le téléchargement des images Théia # Identifiant, mot de passe et proxy pour le téléchargement des images Théia
self.id = "{}".format(configfile["theia"]["identifiant"]) self.id = "{}".format(configfile["theia"]["identifiant"])
self.mdp = "{}".format(configfile["theia"]["mdp"]) self.mdp = "{}".format(configfile["theia"]["mdp"])
self.proxy = "{}".format(configfile["theia"]["proxy"]) self.proxy = "{}".format(configfile["theia"]["proxy"])
def run(self): def run(self):
""" """
Fonction pour lancer le programme Fonction pour lancer le programme
""" """
# Début du processus # Début du processus
debut = time.time() debut = time.time()
# Recherche de nouvelles images non traitées et téléchargement de celles-ci le cas échéant # Recherche de nouvelles images non traitées et téléchargement de celles-ci le cas échéant
self.i_download() self.i_download()
# Traitement des images # Traitement des images
self.i_images_processing() self.i_images_processing()
# Fin du processus # Fin du processus
fin = time.time() fin = time.time()
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment