Commit 2f5020fd authored by Commandre Benjamin's avatar Commandre Benjamin
Browse files

Correction téléchargement en fonction de la tuile S2

1 merge request!3Develop
Showing with 79 additions and 95 deletions
+79 -95
...@@ -21,9 +21,6 @@ import app.Constantes as Constantes ...@@ -21,9 +21,6 @@ import app.Constantes as Constantes
id_tuile = re.compile("T[0-9]+[A-Z]+") id_tuile = re.compile("T[0-9]+[A-Z]+")
date_tuile = re.compile("[SENTINEL.+?_]([0-9]*?)-") date_tuile = re.compile("[SENTINEL.+?_]([0-9]*?)-")
def str2bool(v):
return v.lower() in (["false"])
class Archive(): class Archive():
""" """
Classe pour lister, télécharger les archives via site Theia selon un shapefile représentant la zone d'étude. 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(): ...@@ -161,93 +158,79 @@ class Archive():
return "{},{},{},{}".format(extent_[2], extent_[0], extent_[3], extent_[1]) return "{},{},{},{}".format(extent_[2], extent_[0], extent_[3], extent_[1])
def listing_by_tile(self): 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 nbImage = 0
if hasattr(self, 'liste_tuiles'): for tuile in 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
print(self.url) self.requete['location'] = tuile
# Tant qu'il existe une image à traiter self.url = "{0}/{1}/api/collections/{2}/search.json?{3}".format(self.serveur, self.resto, self.capteur, urlencode(self.requete))
while suivante:
try : self.get_liste_images()
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 def listing_by_coord(self):
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 self.requete['box'] = self.coord_box_dd()
data_Dict = defaultdict(list)
data_Dict = UserDict(eval(new_data))
# Selection des archives à télécharger self.url = "{0}/{1}/api/collections/{2}/search.json?{3}".format(self.serveur, self.resto, self.capteur, urlencode(self.requete))
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.niveau == "LEVEL3A": self.get_liste_images()
self.liste_archive.append([archive_download, out_archive, feature_id])
# Vérification si d'autres images sont disponibles def get_liste_images(self):
for link in data_Dict['properties']['links'] :
if link["title"] is 'suivant' : # S'il existe une autre image, suivante = vrai, faux sinon
self.url = link['href'].replace("\\", "") suivante = True
suivante = True
break # Tant qu'il existe une image à traiter
else : while suivante:
suivante = False
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: except Exception as e:
self.logger.error("Error connexion or error variable : {0}".format(e)) self.logger.error("Error connexion or error variable : {0}".format(e))
sys.exit(1) sys.exit(1)
# Si aucune image n'est disponible pour une année, le dossier correspondant n'est pas créé def listing(self):
if nbImage != len(self.liste_archive) : """
if not os.path.exists("{}/{}/Images".format(self.dossier_sortie, annee)) : Méthode pour lister les images disponibles sur la plateforme 'Theia Land' correspondant à la zone.
os.makedirs("{}/{}/Images".format(self.dossier_sortie, annee)) """
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))) self.logger.info("{0} image(s) correspondent aux critères.".format(len(self.liste_archive)))
...@@ -314,7 +297,7 @@ class Archive(): ...@@ -314,7 +297,7 @@ class Archive():
nom_image = l[1].split("/")[-1][:-4] nom_image = l[1].split("/")[-1][:-4]
# Lecture du fichier de sauvegarde # 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 ... # Si la date existe dans le fichier de sauvegarde ...
if str(date) in sauvegarde.keys() : if str(date) in sauvegarde.keys() :
...@@ -323,7 +306,6 @@ class Archive(): ...@@ -323,7 +306,6 @@ class Archive():
if nom_image not in sauvegarde[str(date)].keys() : if nom_image not in sauvegarde[str(date)].keys() :
sauvegarde[str(date)][nom_image] = "False" sauvegarde[str(date)][nom_image] = "False"
sauvegarde[str(date)]["NDVI"] = "False"
if date in dico_date.keys() : if date in dico_date.keys() :
dico_date[date].append(l) dico_date[date].append(l)
...@@ -333,8 +315,6 @@ class Archive(): ...@@ -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. # ... 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" : elif sauvegarde[str(date)][nom_image] == "False" :
sauvegarde[str(date)]["NDVI"] = "False"
if date in dico_date.keys() : if date in dico_date.keys() :
dico_date[date].append(l) dico_date[date].append(l)
else : else :
...@@ -351,7 +331,7 @@ class Archive(): ...@@ -351,7 +331,7 @@ class Archive():
dico_date[date] = [l] dico_date[date] = [l]
# Sauvegarde du fichier de sauvegarde mis à jour. # 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) sauvegarde.write(configfile)
# Pour toutes les dates à traiter # Pour toutes les dates à traiter
...@@ -371,15 +351,14 @@ class Archive(): ...@@ -371,15 +351,14 @@ class Archive():
reponse = requests.get(url, headers=head, proxies=proxyDict) reponse = requests.get(url, headers=head, proxies=proxyDict)
if self.extraction : if self.extraction :
# Ajout de l'archive à la liste # Ajout de l'archive à la liste
liste_content.append(reponse.content) liste_content.append(reponse.content)
del reponse del reponse
else : else :
if self.groupe == "Tuile" : 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: 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): if not os.path.exists(dossier_archive):
os.makedirs(dossier_archive) os.makedirs(dossier_archive)
...@@ -393,9 +372,10 @@ class Archive(): ...@@ -393,9 +372,10 @@ class Archive():
self.traitement_images(cle, liste_content) self.traitement_images(cle, liste_content)
del 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
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 # Pour toutes les images traitées à cette date
for img in dico_date[cle] : for img in dico_date[cle] :
...@@ -403,7 +383,7 @@ class Archive(): ...@@ -403,7 +383,7 @@ class Archive():
sauvegarde[str(cle)][img[1].split("/")[-1][:-4]] = "True" sauvegarde[str(cle)][img[1].split("/")[-1][:-4]] = "True"
# Sauvegarde du fichier de sauvegarde mis à jour. # 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) sauvegarde.write(configfile)
self.logger.info("All images have been downloaded !") self.logger.info("All images have been downloaded !")
...@@ -501,7 +481,7 @@ class Archive(): ...@@ -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_image = []
tuiles_nuage = [] tuiles_nuage = []
...@@ -513,7 +493,7 @@ class Archive(): ...@@ -513,7 +493,7 @@ class Archive():
# Pour chaque archive # Pour chaque archive
for idx, content in enumerate(liste_content) : for idx, content in enumerate(liste_content) :
# Lecture de l'archive # Lecture de l'archive
tzip = zipfile.ZipFile(io.BytesIO(content)) tzip = zipfile.ZipFile(io.BytesIO(content))
...@@ -533,9 +513,8 @@ class Archive(): ...@@ -533,9 +513,8 @@ class Archive():
mmap_name = "/vsimem/"+uuid4().hex mmap_name = "/vsimem/"+uuid4().hex
liste_mem.append(mmap_name) liste_mem.append(mmap_name)
gdal.FileFromMemBuffer(mmap_name, tzip.read(img)) gdal.FileFromMemBuffer(mmap_name, tzip.read(img))
print(mmap_name) # liste_bandes.append(gdal.Open(mmap_name))
sys.exit(1) liste_bandes.append(mmap_name)
liste_bandes.append(gdal.Open(mmap_name))
# On fusionne les différentes bandes en une seule image # On fusionne les différentes bandes en une seule image
# on découpe l'image selon l'emprise # on découpe l'image selon l'emprise
...@@ -562,7 +541,7 @@ class Archive(): ...@@ -562,7 +541,7 @@ class Archive():
gdal.FileFromMemBuffer(mmap_name, tzip.read(image_nuage)) gdal.FileFromMemBuffer(mmap_name, tzip.read(image_nuage))
liste_mem.append(mmap_name) 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 : for mmap_name in liste_mem :
gdal.Unlink(mmap_name) gdal.Unlink(mmap_name)
...@@ -572,7 +551,7 @@ class Archive(): ...@@ -572,7 +551,7 @@ class Archive():
liste_bandes = None liste_bandes = None
del tzip del tzip
liste_content[idx] = None del liste_content[idx]
del liste_content del liste_content
...@@ -582,7 +561,10 @@ class Archive(): ...@@ -582,7 +561,10 @@ class Archive():
self.logger.info("Sauvegarde des images") 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)) self.logger.debug("Dossier image : {0}".format(dossier))
......
...@@ -125,6 +125,8 @@ def clip(image, cut, form="Mem", dst="", type_sortie=gdal.GDT_Float32, nodata="N ...@@ -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) return gdal.Warp(dst, image, options=option_clip)
def str2bool(v):
return v.lower() in (["false"])
def checkDate(date): def checkDate(date):
......
Supports Markdown
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