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
45b53db7
Commit
45b53db7
authored
Nov 13, 2020
by
Commandre Benjamin
Browse files
Update
parent
ab471555
Changes
4
Hide whitespace changes
Inline
Side-by-side
app/Archive.py
View file @
45b53db7
...
...
@@ -221,7 +221,7 @@ class Archive:
Méthode pour lister les images disponibles sur la plateforme 'Theia Land' correspondant à la zone.
"""
if
hasattr
(
self
,
'
liste_tuiles
'
)
:
if
self
.
liste_tuiles
is
not
None
:
self
.
listing_by_tile
()
else
:
self
.
listing_by_coord
()
...
...
app/Outils.py
View file @
45b53db7
#!/bin/env python3
# -*- coding: utf-8 -*-
import
sys
import
argparse
import
ast
import
configparser
import
inspect
import
logging
from
logging.handlers
import
RotatingFileHandler
import
signal
import
sys
from
contextlib
import
contextmanager
import
inspect
from
datetime
import
datetime
from
logging.handlers
import
RotatingFileHandler
from
osgeo
import
gdal
import
app.Constantes
as
Constantes
import
configparser
import
ast
from
datetime
import
datetime
import
app.Satellites
as
Satellites
import
app.Telechargement
as
Telechargement
class
Fusion
(
argparse
.
Action
):
def
__init__
(
self
,
option_strings
,
dest
,
nargs
=
None
,
**
kwargs
):
super
(
Fusion
,
self
).
__init__
(
option_strings
,
dest
,
nargs
,
**
kwargs
)
def
__call__
(
self
,
parser
,
namespace
,
values
,
option_string
=
None
):
setattr
(
namespace
,
self
.
dest
,
' '
.
join
(
values
).
lower
())
def
__init__
(
self
,
option_strings
,
dest
,
nargs
=
None
,
**
kwargs
):
super
(
Fusion
,
self
).
__init__
(
option_strings
,
dest
,
nargs
,
**
kwargs
)
def
__call__
(
self
,
parser
,
namespace
,
values
,
option_string
=
None
):
setattr
(
namespace
,
self
.
dest
,
' '
.
join
(
values
).
lower
())
class
Log
(
object
):
def
__init__
(
self
,
dossier
,
nomFichier
,
niveau
=
None
):
def
__init__
(
self
,
dossier
,
nom_fichier
,
niveau
=
None
):
super
(
Log
,
self
).
__init__
()
stack
=
inspect
.
stack
()
nom_classe
=
stack
[
1
][
0
].
f_locals
[
"self"
].
__class__
.
__name__
super
(
Log
,
self
)
.
__
init__
(
)
self
.
__
logger__
=
logging
.
getLogger
(
nom_fichier
)
stack
=
inspect
.
stack
()
nom_classe
=
stack
[
1
][
0
].
f_locals
[
"self"
].
__class__
.
__name__
if
niveau
is
None
:
try
:
niveau
=
Constantes
.
NIVEAU_DEFAUT
except
Exception
:
niveau
=
logging
.
DEBUG
self
.
__logger__
=
logging
.
getLogger
(
nomFichier
)
self
.
__logger__
.
setLevel
(
niveau
)
if
niveau
is
None
:
try
:
niveau
=
Constantes
.
NIVEAU_DEFAUT
except
:
niveau
=
logging
.
DEBUG
format_fichier
=
logging
.
Formatter
(
'%(asctime)s :: %(levelname)s :: %(message)s'
,
datefmt
=
'%d-%m-%Y %H:%M:%S'
)
fichier_log
=
RotatingFileHandler
(
"{0}/{1}.log"
.
format
(
dossier
,
nom_fichier
),
'a'
,
1000000
,
1
)
self
.
__logger__
.
setLevel
(
niveau
)
fichier_log
.
setLevel
(
niveau
)
fichier_log
.
setFormatter
(
format_fichier
)
self
.
__logger__
.
addHandler
(
fichier_log
)
format_fichier
=
logging
.
Formatter
(
'%(asctime)s :: %(levelname)s :: %(message)s'
,
datefmt
=
'%d-%m-%Y %H:%M:%S'
)
fichierLog
=
RotatingFileHandler
(
"{0}/{1}.log"
.
format
(
dossier
,
nomFichier
),
'a'
,
1000000
,
1
)
format_console
=
logging
.
Formatter
(
'%(asctime)s ::
{0} ::
%(levelname)s :: %(message)s'
.
format
(
nom_classe
),
datefmt
=
'%d-%m-%Y %H:%M:%S'
)
fichierLog
.
setLevel
(
niveau
)
fichierLog
.
setFormatter
(
format_fichier
)
self
.
__logger__
.
addHandler
(
fichierLog
)
console
=
logging
.
StreamHandler
(
)
console
.
setLevel
(
niveau
)
console
.
setFormatter
(
format_console
)
format_console
=
logging
.
Formatter
(
'%(asctime)s :: {0} :: %(levelname)s :: %(message)s'
.
format
(
nom_classe
),
datefmt
=
'%d-%m-%Y %H:%M:%S'
)
self
.
__logger__
.
addHandler
(
console
)
console
=
logging
.
StreamHandler
()
console
.
setLevel
(
niveau
)
console
.
setFormatter
(
format_console
)
self
.
__logger__
.
addHandler
(
console
)
def
info
(
self
,
message
):
self
.
__logger__
.
info
(
message
)
def
info
(
self
,
message
):
self
.
__logger__
.
info
(
message
)
def
debug
(
self
,
message
):
self
.
__logger__
.
debug
(
message
)
def
debu
g
(
self
,
message
):
self
.
__logger__
.
debu
g
(
message
)
def
warnin
g
(
self
,
message
):
self
.
__logger__
.
warnin
g
(
message
)
def
warning
(
self
,
message
):
self
.
__logger__
.
warning
(
message
)
def
error
(
self
,
message
):
self
.
__logger__
.
error
(
message
)
def
error
(
self
,
message
):
self
.
__logger__
.
error
(
message
)
def
critical
(
self
,
message
):
self
.
__logger__
.
critical
(
message
)
def
critical
(
self
,
message
):
self
.
__logger__
.
critical
(
message
)
def
exception
(
self
,
message
):
self
.
__logger__
.
exception
(
message
)
def
exception
(
self
,
message
):
self
.
__logger__
.
exception
(
message
)
def
close
(
self
):
for
handler
in
self
.
__logger__
.
handlers
[:]:
handler
.
close
()
self
.
__logger__
.
removeHandler
(
handler
)
def
close
(
self
):
for
handler
in
self
.
__logger__
.
handlers
[:]
:
handler
.
close
()
self
.
__logger__
.
removeHandler
(
handler
)
class
TimeoutException
(
Exception
):
pass
class
TimeoutException
(
Exception
):
pass
@
contextmanager
def
limitation_temporelle
(
secondes
):
def
signal_handler
():
raise
TimeoutException
def
signal
_handler
(
signum
,
frame
):
raise
TimeoutException
signal
.
signal
(
signal
.
SIGALRM
,
signal_handler
)
signal
.
alarm
(
secondes
)
signal
.
signal
(
signal
.
SIGALRM
,
signal_handler
)
signal
.
alarm
(
secondes
)
try
:
yield
finally
:
signal
.
alarm
(
0
)
try
:
yield
finally
:
signal
.
alarm
(
0
)
# Utilisation :
#
...
...
@@ -103,146 +113,158 @@ def limitation_temporelle(secondes):
# pass
def
clip
(
image
,
cut
,
form
=
"Mem"
,
dst
=
""
,
type_sortie
=
gdal
.
GDT_Float32
,
nodata
=
"NaN"
):
"""
Découpe une image selon un shapefile donné. Si le type de l'image en sortie
n'est pas spécifié, l'image sera retournée en pointeur mémoire et ne sera pas sauvegardée.
"""
Découpe une image selon un shapefile donné. Si le type de l'image en sortie
n'est pas spécifié, l'image sera retournée en pointeur mémoire et ne sera pas sauvegardée.
:param image: Chemin vers l'image dans laquelle on veut découper l'emprise.
:type image: Chaîne de caractères
:param image: Chemin vers l'image dans laquelle on veut découper l'emprise.
:type image: Chaîne de caractères
:param cut: Chemin vers le shapefile représentant l'emprise.
:type cut: Chaîne de caractères
:param cut: Chemin vers le shapefile représentant l'emprise.
:type cut: Chaîne de caractères
:param form: Format de l'image en sortie.
:type form: Chaîne de caractères
:param form: Format de l'image en sortie.
:type form: Chaîne de caractères
:param dst: Chemin de l'image en sortie.
:type dst: Chaîne de caractères
"""
:param dst: Chemin de l'image en sortie.
:type dst: Chaîne de caractères
option_clip
=
gdal
.
WarpOptions
(
cropToCutline
=
True
,
\
cutlineDSName
=
cut
,
outputType
=
type_sortie
,
format
=
form
,
dstNodata
=
nodata
)
:param nodata: Valeur nodata.
:type nodata: Chaîne de caractères ou Entier
:param type_sortie: Type du pixel de l'image de sortie.
:type type_sortie: gdal.GDT
"""
option_clip
=
gdal
.
WarpOptions
(
cropToCutline
=
True
,
cutlineDSName
=
cut
,
outputType
=
type_sortie
,
format
=
form
,
dstNodata
=
nodata
)
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
):
d
=
date
.
split
(
'-'
)
try
:
if
not
date
:
annee
=
datetime
.
now
().
year
if
datetime
.
now
().
month
<
10
:
mois
=
"0{}"
.
format
(
datetime
.
now
().
month
)
else
:
mois
=
datetime
.
now
().
month
if
datetime
.
now
().
day
<
10
:
jour
=
"0{}"
.
format
(
datetime
.
now
().
day
)
else
:
jour
=
datetime
.
now
().
day
elif
len
(
d
)
==
1
:
annee
=
d
[
0
]
mois
=
"01"
jour
=
"01"
elif
len
(
d
)
==
2
:
annee
=
d
[
0
]
mois
=
d
[
1
]
jour
=
"01"
elif
len
(
d
)
==
3
:
annee
=
d
[
0
]
mois
=
d
[
1
]
jour
=
d
[
2
]
datetime
(
int
(
annee
),
int
(
mois
),
int
(
jour
))
return
"{annee}-{mois}-{jour}"
.
format
(
annee
=
annee
,
mois
=
mois
,
jour
=
jour
)
except
ValueError
:
print
(
"Format invalide"
)
sys
.
exit
(
1
)
except
IndexError
:
print
(
"La date doit être au format 'AAAA-MM-JJ', 'AAAA-MM' ou 'AAAA'"
)
sys
.
exit
(
1
)
def
check_date
(
date
):
d
=
date
.
split
(
'-'
)
annee
=
None
mois
=
None
jour
=
None
try
:
if
not
date
:
annee
=
datetime
.
now
().
year
if
datetime
.
now
().
month
<
10
:
mois
=
"0{}"
.
format
(
datetime
.
now
().
month
)
else
:
mois
=
datetime
.
now
().
month
if
datetime
.
now
().
day
<
10
:
jour
=
"0{}"
.
format
(
datetime
.
now
().
day
)
else
:
jour
=
datetime
.
now
().
day
elif
len
(
d
)
==
1
:
annee
=
d
[
0
]
mois
=
"01"
jour
=
"01"
elif
len
(
d
)
==
2
:
annee
=
d
[
0
]
mois
=
d
[
1
]
jour
=
"01"
elif
len
(
d
)
==
3
:
annee
=
d
[
0
]
mois
=
d
[
1
]
jour
=
d
[
2
]
# datetime(int(annee), int(mois), int(jour))
return
"{annee}-{mois}-{jour}"
.
format
(
annee
=
annee
,
mois
=
mois
,
jour
=
jour
)
except
ValueError
:
print
(
"Format invalide"
)
sys
.
exit
(
1
)
except
IndexError
:
print
(
"La date doit être au format 'AAAA-MM-JJ', 'AAAA-MM' ou 'AAAA'"
)
sys
.
exit
(
1
)
def
get_variable
(
self
,
config
):
"""
Récupération des variables dans le fichier de configuration
"""
configfile
=
configparser
.
ConfigParser
()
configfile
.
read
(
config
)
self
.
requete
=
dict
()
self
.
requete
[
"lang"
]
=
"fr"
self
.
requete
[
"_pretty"
]
=
"true"
self
.
requete
[
"maxRecord"
]
=
500
# Capteur utilisé
self
.
capteur
=
configfile
[
"satellite"
][
"capteur"
]
self
.
bandes
=
configfile
[
"satellite"
][
"bandes"
]
self
.
requete
[
"processingLevel"
]
=
configfile
[
"satellite"
][
"processingLevel"
]
# Dossier contenant les résultats
self
.
dossier_sortie
=
configfile
[
"sortie"
][
"chemin"
]
try
:
if
str2bool
(
configfile
[
"sortie"
][
"extraction"
]):
self
.
extraction
=
False
else
:
self
.
extraction
=
True
except
:
self
.
extraction
=
True
self
.
groupe
=
configfile
[
"sortie"
][
"groupe"
]
# Date de début et de fin de la recherche
try
:
# self.date_debut = configfile["donnees"]["date_debut"]
self
.
requete
[
"startDate"
]
=
check
D
ate
(
configfile
[
"donnees"
][
"date_debut"
])
except
Exception
as
e
:
raise
"L'année de départ est requise."
self
.
requete
[
"completionDate"
]
=
check
D
ate
(
configfile
[
"donnees"
][
"date_fin"
])
self
.
seuil_nuage
=
float
(
configfile
[
"donnees"
][
"seuil_nuage"
])
/
100.0
if
configfile
[
"donnees"
][
"seuil_nuage"
]
else
0.0
# Emprise et zone de l'étude
self
.
emprise
=
configfile
[
"donnees"
][
"chemin_emprise"
]
if
self
.
emprise
:
self
.
zone_etude
=
configfile
[
"donnees"
][
"chemin_zone_etude"
]
if
not
self
.
zone_etude
:
self
.
zone_etude
=
self
.
emprise
else
:
try
:
self
.
liste_tuiles
=
list
(
ast
.
literal_eval
(
configfile
[
"donnees"
][
"liste_tuiles"
]))
except
Exception
as
e
:
raise
"Aucune emprise ni aucune tuile n'a été renseigné."
self
.
nombre_image
=
configfile
[
"donnees"
][
"nombre_image"
]
# Identifiant, mot de passe et proxy pour le téléchargement des images Théia
self
.
id
=
configfile
[
"theia"
][
"identifiant
"
]
self
.
mdp
=
configfile
[
"theia"
][
"mdp"
]
self
.
proxy
=
c
on
figfile
[
"theia"
][
"proxy"
]
if
self
.
bandes
==
"RGB"
:
self
.
extent_img
=
Satellites
.
SATELLITE
[
self
.
capteur
][
self
.
requete
[
"processingLevel"
]][:
-
1
]
else
:
self
.
extent_img
=
Satellites
.
SATELLITE
[
self
.
capteur
][
self
.
requete
[
"processingLevel
"
]
]
if
self
.
requete
[
"processingLevel"
]
==
"LEVEL2A"
:
self
.
nuage
=
Satellites
.
SATELLITE
[
self
.
capteur
][
"NUAGE"
]
else
:
self
.
nuage
=
None
self
.
serveur
=
Satellites
.
SATELLITE
[
self
.
capteur
][
"serveur"
]
self
.
resto
=
Satellites
.
SATELLITE
[
self
.
capteur
][
"resto
"
]
self
.
token_type
=
Satellites
.
SATELLITE
[
self
.
capteur
][
"token_type"
]
"""
Récupération des variables dans le fichier de configuration
"""
configfile
=
configparser
.
ConfigParser
()
configfile
.
read
(
config
)
self
.
requete
=
dict
()
self
.
requete
[
"lang"
]
=
"fr"
self
.
requete
[
"_pretty"
]
=
"true"
self
.
requete
[
"maxRecord"
]
=
500
# Capteur utilisé
self
.
capteur
=
configfile
[
"satellite"
][
"capteur"
]
self
.
bandes
=
list
(
ast
.
literal_eval
(
configfile
[
"satellite"
][
"bandes"
]
))
self
.
requete
[
"processingLevel"
]
=
configfile
[
"satellite"
][
"processingLevel"
]
# Dossier contenant les résultats
self
.
dossier_sortie
=
configfile
[
"sortie"
][
"chemin"
]
try
:
if
str2bool
(
configfile
[
"sortie"
][
"extraction"
]):
self
.
extraction
=
False
else
:
self
.
extraction
=
True
except
Exception
:
self
.
extraction
=
True
self
.
groupe
=
configfile
[
"sortie"
][
"groupe"
]
# Date de début et de fin de la recherche
try
:
# self.date_debut = configfile["donnees"]["date_debut"]
self
.
requete
[
"startDate"
]
=
check
_d
ate
(
configfile
[
"donnees"
][
"date_debut"
])
except
Exception
:
raise
Exception
(
"L'année de départ est requise."
)
self
.
requete
[
"completionDate"
]
=
check
_d
ate
(
configfile
[
"donnees"
][
"date_fin"
])
self
.
seuil_nuage
=
float
(
configfile
[
"donnees"
][
"seuil_nuage"
])
/
100.0
if
configfile
[
"donnees"
][
"seuil_nuage"
]
else
0.0
# Emprise et zone de l'étude
self
.
emprise
=
configfile
[
"donnees"
][
"chemin_emprise"
]
if
self
.
emprise
:
self
.
zone_etude
=
configfile
[
"donnees"
][
"chemin_zone_etude"
]
if
not
self
.
zone_etude
:
self
.
zone_etude
=
self
.
emprise
else
:
try
:
self
.
liste_tuiles
=
list
(
ast
.
literal_eval
(
configfile
[
"donnees"
][
"liste_tuiles"
]))
except
Exception
:
raise
Exception
(
"Aucune emprise ni aucune tuile n'a été renseigné."
)
self
.
nombre_image
=
configfile
[
"donnees"
][
"nombre_image"
]
if
self
.
requete
[
"processingLevel"
]
==
"LEVEL2A"
:
self
.
nuage
=
Satellites
.
SATELLITE
[
self
.
capteur
][
"NUAGE
"
]
else
:
self
.
nuage
=
N
on
e
self
.
prefix
=
Satellites
.
SATELLITE
[
self
.
capteur
][
configfile
[
"satellite"
][
"processingLevel"
]]
# Identifiant, mot de passe et proxy pour le téléchargement des images Théia
# self.id = configfile["theia"]["identifiant
"]
# self.mdp = configfile["theia"]["mdp"]
#
self.
proxy = configfile["theia"]["proxy"]
self
.
serveur
=
Satellites
.
SATELLITE
[
self
.
capteur
][
"serveur"
]
self
.
resto
=
Satellites
.
SATELLITE
[
self
.
capteur
][
"resto"
]
self
.
api
=
Telechargement
.
Telechargement
(
self
.
serveur
,
configfile
[
"theia"
][
"identifiant"
],
configfile
[
"theia"
][
"mdp"
],
configfile
[
"theia"
][
"proxy
"
]
)
#
self.token_type = Satellites.SATELLITE[self.capteur]["token_type"]
app/Satellites.py
View file @
45b53db7
...
...
@@ -5,24 +5,23 @@ import collections
SATELLITE
=
collections
.
defaultdict
(
dict
)
#
Informations obtenues sur le site 'Theia-land' ou sur le blog d'Olivier HAGOLLE
#
Informations obtenues sur le site 'Theia-land' ou sur le blog d'Olivier HAGOLLE
########################## SENTINEL2 ###############################
#
######################### SENTINEL2 ###############################
SATELLITE
[
"SENTINEL2"
][
"serveur"
]
=
"https://theia.cnes.fr/atdistrib"
SATELLITE
[
"SENTINEL2"
][
"resto"
]
=
"resto2"
SATELLITE
[
"SENTINEL2"
][
"token_type"
]
=
"text"
SATELLITE
[
"SENTINEL2"
][
"R"
]
=
2
SATELLITE
[
"SENTINEL2"
][
"PIR"
]
=
3
SATELLITE
[
"SENTINEL2"
][
"LEVEL2A"
]
=
[
'_FRE_B2.tif'
,
'_FRE_B3.tif'
,
'_FRE_B4.tif'
,
'_FRE_B8.tif'
]
SATELLITE
[
"SENTINEL2"
][
"
NUAGE
"
]
=
[
'_CLM_R1.tif'
]
SATELLITE
[
"SENTINEL2"
][
"
LEVEL3A
"
]
=
[
'_
FRC_B2.tif'
,
'_FRC_B3.tif'
,
'_FRC_B4.tif'
,
'_FRC_B8.tif'
]
SATELLITE
[
"SENTINEL2"
][
"LEVEL2A"
]
=
'FRE'
SATELLITE
[
"SENTINEL2"
][
"
LEVEL3A
"
]
=
'FRC'
SATELLITE
[
"SENTINEL2"
][
"
NUAGE
"
]
=
'_
CLM_R1'
########################## LANDSAT #################################
#
######################### LANDSAT #################################
SATELLITE
[
"Landsat"
][
"serveur"
]
=
"https://theia-landsat.cnes.fr"
SATELLITE
[
"Landsat"
][
"resto"
]
=
"resto"
SATELLITE
[
"Landsat"
][
"token_type"
]
=
"json"
SATELLITE
[
"Landsat"
][
"R"
]
=
3
SATELLITE
[
"Landsat"
][
"PIR"
]
=
4
telis.py
View file @
45b53db7
...
...
@@ -22,12 +22,12 @@ class Telechargement(object):
"""
Fonction pour lancer le programme
"""
#
Début du processus
#
Début du processus
debut
=
time
.
time
()
prog
=
Archive
(
self
.
config
)
prog
.
listing
()
prog
.
download
_auto
()
prog
.
download
()
# Fin du processus
fin
=
time
.
time
()
...
...
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