GeoExMachina

Blog géomatique

Pytroll au coin du feu (1)

Pour du m'pop corn grillé

Suite à la présentation de Firemsg à la conférence Eumetsat 2017, on va ici rentrer dans le détail de l'application. Cela va nous permettre d'aborder l'utilisation de pytroll, une librairie bien utile pour la télédétection à partir d'images satellites. Comme l'explique l'équipe Pytroll, leur objectif est de fournir une librairie Python pour traiter les données issues de capteurs satellites :

" The objective of Pytroll is to provide an easy to use, modular, free and open source python framework for the processing of earth observation satellite data. The provided python packages are designed to be used both in R&D environments and in 24/7 operational production. "

Et il faut dire que c'est réussi, une bonne liste de capteurs opérationnels, une documentation accessible et des développeurs toujours prêts à dépanner. Alors on choisit son satellite préféré et on commence !

Personnellement, j'ai utilisé Pytroll pour le développement d'un outil de surveillance d'incendie à partir d'images Meteosat. Je vous invite à y voir le résultat par ici. Obtenir des données Meteosat est simple comme bonjour, il suffit de s'enregistrer sur le Data Center d'Eumetsat et de demander un accès aux données. L'accès par FTP permet notamment de réaliser des séries temporelles à haute répétitivité temporelle. Il suffit d'automatiser le téléchargement périodiquement (table de cron sur Linux).


Les noms des fichiers binaires ressemblent à cela : L-000-MSG3__-MSG3________-IR_039___-000001___-201709230245-C_.
Le nom est composé :
  • du type de fichier binaire (L pour LRIT, H pour HRIT)
  • du nom du satellite (MSG3)
  • de la bande (IR_039)
  • du segment (entre 1 et 8, il faut 8 segments pour obtenir l'image complète du globe)
  • de la date (YYYY/MM/DD/HHMM)
  • de l'état de compression (C_ = compressé, __ = décompressé)

  • Mais des fichiers binaires, ça n'est pas tout à fait simple à traiter... sauf avec Pytroll ! Il suffit juste de suivre l'installation de Pytroll et de compiler le Public Wavelet Transform Decompression Library Software. On peut alors utiliser pytroll/mpop avec python.

    Mpop fonctionne à partir de scènes que l'on définit en fonction d'une date d'acquisition et de l'aire souhaitée.
    La classe d'objet à utiliser pour cela est GeostationaryFactory (pour les satellites géostationnaires). Alors on l'importe, tout comme la fonction get_area_def pour sélectionner notre aire de découpe, et la fonction debug_on, qui permet d'obtenir les logs détaillés de mpop.

    from mpop.satellites import GeostationaryFactory
    from mpop.projector import get_area_def
    from mpop.utils import debug_on

    La fonction debug_on( ) se lance le plus simplement du monde :
    debug_on()

    La définition de la scène se fait par la fonction create_scene( ) :
    #Scene Configuration
    time_slot = datetime.datetime(YYYY, MM, DD, hh, mm)
    try:
    	global_data = GeostationaryFactory.create_scene("meteosat", "10", "seviri", time_slot)
    except:
    	print "\nSATELLITE DEFINITION LOAD FAILED, CHECK THAT meteosat10.cfg EXISTS IN THE MPOP FOLDER\
    		 OR CHANGE ARGUMENT IF YOU USE ANOTHER SATELLITE DEFINITION."
    Les deux premiers arguments permettent de retrouver le nom du fichier de configuration qui a été placé dans le dossier d'installation de mpop. Le troisième correspond au capteur utilisé (cf. fichier de config meteosat10.cfg), afin de charger les paramètres du capteur. Le quatrième argument correspond à l'heure d'acquisition de l'image (issue du nom de fichier binaire).

    L'aire de définition est définie par get_area_def( ). L'argument fait référence nom des régions définit dans le fichier areas.def.
    try:
    	aire = get_area_def("AfSubSahara")
    except:
    	print "\nAREA DEFINITION LOAD FAILED, CHECK THAT areas.def"
    On définit pour finir les bandes à charger (variable 'IRchannelList' et 'VISchannelList') et utilise la fonction load( ) pour procéder au chargement des bandes.
    #Data load
    try:
    	if MSG_FILE_TYPE == 'L' :
    		IRchannelList = ['IR_039', 'IR_108']
    		global_data.load(IRchannelList, area_extent=aire.area_extent, calibrate=1)
    		print "\nDATA LOAD : OK"
    	else :
    		IRchannelList = ['IR_039','IR_108','IR_120']
    		VISchannelList = ['VIS006','VIS008']
    		global_data.load(IRchannelList, area_extent=aire.area_extent, calibrate=1)
    		global_data.load(VISchannelList, area_extent=aire.area_extent, calibrate=2)
    		print "\nDATA LOAD : OK"
    except:
    	print"\nDATA LOAD FAILED, CHECK DATA AND TIME SLOT."
    
    L'argument calibrate permet d'obtenir les valeurs radiométriques en température de surface (calibrate = 1) ou en radiance (calibrate = 2). Ici je charge les bandes 3.9 µm et 10.8 µm pour les besoins de la télédétection d'anomalies thermiques, mais on peut charger toutes les bandes. Attention toutes les bandes ne sont pas accessibles en LRIT !

    A partir de là, les bandes sont accessibles en précisant la bande entre crochet. Celles-ci peuvent être exportées grâce à gdal :
    		driver=gdal.GetDriverByName("GTiff")
    		
    		for channel in IRchannelList:
    			#Save channel into tiff
    			file_name=file_nameBT+channel+'.tiff'
    			driver.CreateCopy(file_name,gdal_array.OpenArray(data[channel].data,None))

    A titre d'exemple voilà le type de résultat que l'on peut obtenir grâce à Pytroll !