diff --git a/app/Archive.py b/app/Archive.py index 7e0d42b3e2626a7d02969af3bc2afe5aaaeb8ed5..76f271e026eb4282fd5a65698eb9535c55210a4e 100644 --- a/app/Archive.py +++ b/app/Archive.py @@ -21,9 +21,6 @@ import app.Constantes as Constantes id_tuile = re.compile("T[0-9]+[A-Z]+") date_tuile = re.compile("[SENTINEL.+?_]([0-9]*?)-") -def str2bool(v): - return v.lower() in (["false"]) - class Archive(): """ Classe pour lister, télécharger les archives via site Theia selon un shapefile représentant la zone d'étude. @@ -161,93 +158,79 @@ class Archive(): return "{},{},{},{}".format(extent_[2], extent_[0], extent_[3], extent_[1]) def listing_by_tile(self): - - for tuile in self.liste_tuiles : - - self.requete['location'] = tuile - - print(urlencode(self.requete)) - - def listing(self): - """ - Méthode pour lister les images disponibles sur la plateforme 'Theia Land' correspondant à la zone. - """ nbImage = 0 - if hasattr(self, 'liste_tuiles'): - self.listing_by_tile() - - # print(urlencode(self.requete)) - # print(self.coord_box_dd()) - self.requete['box'] = self.coord_box_dd() - - # sys.exit(1) - self.liste_annees = ["2019"] - self.niveau = 'LEVEL2A' - # Boucle sur les annees - # self.logger.info("Images availables") - for annee in self.liste_annees: - - self.logger.info("=============== {0} ===============".format(annee)) - - if self.emprise : - # self.url = "{0}/{1}/api/collections/{2}/search.json?lang=fr&processingLevel={3}&_pretty=true&q={4}&box={5}&maxRecord=500".format(self.serveur, self.resto, self.capteur, self.niveau, annee, self.coord_box_dd()) - self.url = "{0}/{1}/api/collections/{2}/search.json?{3}".format(self.serveur, self.resto, self.capteur, urlencode(self.requete)) - else : - self.url = "{0}/{1}/api/collections/{2}/search.json?lang=fr&processingLevel={3}&_pretty=true&q={4}&location={5}&maxRecord=500".format(self.serveur, self.resto, self.capteur, self.niveau, annee, self.liste_tuiles[0]) - - # S'il existe une autre image, suivante = vrai, faux sinon - suivante = True + for tuile in self.liste_tuiles : - print(self.url) + self.requete['location'] = tuile - # Tant qu'il existe une image à traiter - while suivante: + self.url = "{0}/{1}/api/collections/{2}/search.json?{3}".format(self.serveur, self.resto, self.capteur, urlencode(self.requete)) - try : - request_headers = {"User-Agent": "Magic-browser"} - req = urllib.request.Request(self.url, headers = request_headers) # Connexion à la base de données - data = urllib.request.urlopen(req).read() # Lecture de la base de données + self.get_liste_images() - new_data = re.sub(b"null", b"'null'", data) # Suppression de l'expression "null" pouvant causer une erreur Python - new_data = re.sub(b"false", b"False", new_data) # Renomme le booléen selon la syntaxe Python + def listing_by_coord(self): - # Conversion des données sous la forme d'un dictionnaire - data_Dict = defaultdict(list) - data_Dict = UserDict(eval(new_data)) + self.requete['box'] = self.coord_box_dd() - # Selection des archives à télécharger - for d in range(len(data_Dict['features'])): - name_archive = data_Dict['features'][d]['properties']['productIdentifier'] - feature_id = data_Dict["features"][d]['id'] - link_archive = data_Dict['features'][d]['properties']['services']['download']['url'].replace("\\", "") - url_archive = link_archive.replace(self.resto, "rocket/#") - archive_download = url_archive.replace("/download", "") # Url de l'archive à télécharger - out_archive = "{0}/{1}.zip".format(self.dossier_sortie, name_archive) # Nom de sortie de l'archive + self.url = "{0}/{1}/api/collections/{2}/search.json?{3}".format(self.serveur, self.resto, self.capteur, urlencode(self.requete)) - if "SENTINEL2X" not in out_archive or self.niveau == "LEVEL3A": - self.liste_archive.append([archive_download, out_archive, feature_id]) + self.get_liste_images() - # Vérification si d'autres images sont disponibles - for link in data_Dict['properties']['links'] : - if link["title"] is 'suivant' : - self.url = link['href'].replace("\\", "") - suivante = True - break - else : - suivante = False + def get_liste_images(self): + + # S'il existe une autre image, suivante = vrai, faux sinon + suivante = True + + # Tant qu'il existe une image à traiter + while suivante: + + try : + request_headers = {"User-Agent": "Magic-browser"} + req = urllib.request.Request(self.url, headers = request_headers) # Connexion à la base de données + data = urllib.request.urlopen(req).read() # Lecture de la base de données + + new_data = re.sub(b"null", b"'null'", data) # Suppression de l'expression "null" pouvant causer une erreur Python + new_data = re.sub(b"false", b"False", new_data) # Renomme le booléen selon la syntaxe Python + + # Conversion des données sous la forme d'un dictionnaire + data_Dict = defaultdict(list) + data_Dict = UserDict(eval(new_data)) + + # Selection des archives à télécharger + for d in range(len(data_Dict['features'])): + name_archive = data_Dict['features'][d]['properties']['productIdentifier'] + feature_id = data_Dict["features"][d]['id'] + link_archive = data_Dict['features'][d]['properties']['services']['download']['url'].replace("\\", "") + url_archive = link_archive.replace(self.resto, "rocket/#") + archive_download = url_archive.replace("/download", "") # Url de l'archive à télécharger + out_archive = "{0}/{1}.zip".format(self.dossier_sortie, name_archive) # Nom de sortie de l'archive + + if "SENTINEL2X" not in out_archive or self.requete["processingLevel"] == "LEVEL3A": + self.liste_archive.append([archive_download, out_archive, feature_id]) + + # Vérification si d'autres images sont disponibles + for link in data_Dict['properties']['links'] : + if link["title"] is 'suivant' : + self.url = link['href'].replace("\\", "") + suivante = True + break + else : + suivante = False - except Exception as e: - self.logger.error("Error connexion or error variable : {0}".format(e)) - sys.exit(1) + except Exception as e: + self.logger.error("Error connexion or error variable : {0}".format(e)) + sys.exit(1) - # Si aucune image n'est disponible pour une année, le dossier correspondant n'est pas créé - if nbImage != len(self.liste_archive) : - if not os.path.exists("{}/{}/Images".format(self.dossier_sortie, annee)) : - os.makedirs("{}/{}/Images".format(self.dossier_sortie, annee)) + def listing(self): + """ + Méthode pour lister les images disponibles sur la plateforme 'Theia Land' correspondant à la zone. + """ - nbImage = len(self.liste_archive) + if hasattr(self, 'liste_tuiles'): + self.listing_by_tile() + else : + self.listing_by_coord() self.logger.info("{0} image(s) correspondent aux critères.".format(len(self.liste_archive))) @@ -314,7 +297,7 @@ class Archive(): nom_image = l[1].split("/")[-1][:-4] # Lecture du fichier de sauvegarde - sauvegarde.read("{}/{}/sauvegarde.ini".format(self.dossier_sortie, date[:4])) + sauvegarde.read("{}/sauvegarde.ini".format(self.dossier_sortie)) # Si la date existe dans le fichier de sauvegarde ... if str(date) in sauvegarde.keys() : @@ -323,7 +306,6 @@ class Archive(): if nom_image not in sauvegarde[str(date)].keys() : sauvegarde[str(date)][nom_image] = "False" - sauvegarde[str(date)]["NDVI"] = "False" if date in dico_date.keys() : dico_date[date].append(l) @@ -333,8 +315,6 @@ class Archive(): # ... et que l'image exite mais n'a pas été traité, on la rajoute dans la liste des images à traiter. elif sauvegarde[str(date)][nom_image] == "False" : - sauvegarde[str(date)]["NDVI"] = "False" - if date in dico_date.keys() : dico_date[date].append(l) else : @@ -351,7 +331,7 @@ class Archive(): dico_date[date] = [l] # Sauvegarde du fichier de sauvegarde mis à jour. - with open("{}/{}/sauvegarde.ini".format(self.dossier_sortie, date[:4]), 'w') as configfile: + with open("{}/sauvegarde.ini".format(self.dossier_sortie), 'w') as configfile: sauvegarde.write(configfile) # Pour toutes les dates à traiter @@ -371,15 +351,14 @@ class Archive(): reponse = requests.get(url, headers=head, proxies=proxyDict) if self.extraction : - # Ajout de l'archive à la liste + # Ajout de l'archive à la liste liste_content.append(reponse.content) del reponse else : if self.groupe == "Tuile" : - dossier_archive = "{0}/{1}/Archive".format(self.dossier_sortie, id_tuile.search(img[1]).group(0)) + dossier_archive = "{0}/{1}".format(self.dossier_sortie, id_tuile.search(img[1]).group(0)) else: - dossier_archive = "{0}/{1}/Archive".format(self.dossier_sortie, cle[:4]) - + dossier_archive = "{0}/Archive/{1}".format(self.dossier_sortie, cle[:4]) if not os.path.exists(dossier_archive): os.makedirs(dossier_archive) @@ -393,9 +372,10 @@ class Archive(): self.traitement_images(cle, liste_content) del liste_content + # Mis à jour du fichier de sauvegarde # Lecture du fichier de sauvegarde - sauvegarde.read("{}/{}/sauvegarde.ini".format(self.dossier_sortie, cle[:4])) + sauvegarde.read("{}/sauvegarde.ini".format(self.dossier_sortie)) # Pour toutes les images traitées à cette date for img in dico_date[cle] : @@ -403,7 +383,7 @@ class Archive(): sauvegarde[str(cle)][img[1].split("/")[-1][:-4]] = "True" # Sauvegarde du fichier de sauvegarde mis à jour. - with open("{}/{}/sauvegarde.ini".format(self.dossier_sortie, cle[:4]), 'w') as configfile: + with open("{}/sauvegarde.ini".format(self.dossier_sortie), 'w') as configfile: sauvegarde.write(configfile) self.logger.info("All images have been downloaded !") @@ -501,7 +481,7 @@ class Archive(): """ - self.logger.info("Date : {0} -> {1} image(s)".format(date, len(liste_content))) + self.logger.info("Date : {0} ".format(date)) tuiles_image = [] tuiles_nuage = [] @@ -513,7 +493,7 @@ class Archive(): # Pour chaque archive for idx, content in enumerate(liste_content) : - + # Lecture de l'archive tzip = zipfile.ZipFile(io.BytesIO(content)) @@ -533,9 +513,8 @@ class Archive(): mmap_name = "/vsimem/"+uuid4().hex liste_mem.append(mmap_name) gdal.FileFromMemBuffer(mmap_name, tzip.read(img)) - print(mmap_name) - sys.exit(1) - liste_bandes.append(gdal.Open(mmap_name)) + # liste_bandes.append(gdal.Open(mmap_name)) + liste_bandes.append(mmap_name) # On fusionne les différentes bandes en une seule image # on découpe l'image selon l'emprise @@ -562,7 +541,7 @@ class Archive(): gdal.FileFromMemBuffer(mmap_name, tzip.read(image_nuage)) liste_mem.append(mmap_name) - tuiles_nuage.append(Outils.clip(gdal.Open(mmap_name), self.zone_etude)) + tuiles_nuage.append(Outils.clip(mmap_name, self.zone_etude)) for mmap_name in liste_mem : gdal.Unlink(mmap_name) @@ -572,7 +551,7 @@ class Archive(): liste_bandes = None del tzip - liste_content[idx] = None + del liste_content[idx] del liste_content @@ -582,7 +561,10 @@ class Archive(): self.logger.info("Sauvegarde des images") - dossier = "{0}/{1}/Images".format(self.dossier_sortie, date[:4]) + dossier = "{0}/Images/{1}".format(self.dossier_sortie, date[:4]) + + if not os.path.exists(dossier): + os.makedirs(dossier) self.logger.debug("Dossier image : {0}".format(dossier)) diff --git a/app/Outils.py b/app/Outils.py index 3923982741d22de5cf3f8283e28f7a3c3f56c00d..fc2bf3dcd46a5b30fcd0d2ef5b49bf2b6c9f49ec 100644 --- a/app/Outils.py +++ b/app/Outils.py @@ -125,6 +125,8 @@ def clip(image, cut, form="Mem", dst="", type_sortie=gdal.GDT_Float32, nodata="N return gdal.Warp(dst, image, options=option_clip) +def str2bool(v): + return v.lower() in (["false"]) def checkDate(date):