Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Commandre Benjamin
TELIS
Commits
2f5020fd
Commit
2f5020fd
authored
Mar 09, 2020
by
Commandre Benjamin
Browse files
Correction téléchargement en fonction de la tuile S2
parent
458e75e4
Changes
2
Hide whitespace changes
Inline
Side-by-side
app/Archive.py
View file @
2f5020fd
...
...
@@ -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
))
...
...
app/Outils.py
View file @
2f5020fd
...
...
@@ -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
):
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment