Commit 822f2c2d authored by Commandre Benjamin's avatar Commandre Benjamin
Browse files

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

parent 03ea8e75
......@@ -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))
......
......@@ -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):
......
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