#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import configparser import datetime import glob from osgeo import gdal import otbApplication as otb from app import Archive def str2bool(v): return v.lower() in ("true") class Processing(object): def __init__(self): pass def i_download(self): """ Méthode pour télécharger les images sur le site Theia Land. """ if not self.annee_fin : self.annee_fin = datetime.datetime.now().year self.check_download = Archive.Archive(self.capteur, self.bandes, self.niveau, self.emprise, self.zone_etude,\ self.resultats, self.annee_debut, int(self.annee_fin), self.seuil_nuage) self.check_download.listing() self.check_download.download_auto(self.id, self.mdp, self.proxy, extraction=self.extraction, groupe=self.groupe) self.liste_dossier = dict() for annee in os.listdir(self.resultats): with open("{}/{}/dates.txt".format(self.resultats, annee), "w") as fichier : for image in sorted(glob.glob("{}/{}/Images/*".format(self.resultats, annee))) : fichier.write("{}\n".format(os.path.basename(image)[:-4])) self.liste_dossier[annee] = sorted([x for x in glob.glob("{}/{}/Images/*".format(self.resultats, annee)) if x.endswith(".tif")]) def otbPhenologie(self): """ Appel le module OTB : 'SigmoFitting' sur l'image composée de l'empilement des NDVI """ otb_Phenologie = otb.Registry.CreateApplication("SigmoFitting") otb_Phenologie.SetParameterString("mode", "metrics") for annee in self.liste_dossier : otb_Phenologie.SetParameterString("in", "{}/{}/NDVI/stack_ndvi.tif".format(self.resultats, annee)) otb_Phenologie.SetParameterString("dates", "{}/{}/dates.txt".format(self.resultats, annee)) otb_Phenologie.SetParameterString("out", "{}/{}/metrics.tif".format(self.resultats, annee)) otb_Phenologie.ExecuteAndWriteOutput() def calcul_ndvi(self): """ Méthode effectuant le calcul du NDVI via le module OTB : 'RadiometricIndices' """ options_vrt = gdal.ParseCommandLine('-resolution highest -separate') otb_NDVI = otb.Registry.CreateApplication("RadiometricIndices") otb_NDVI.SetParameterInt("channels.blue", 1) otb_NDVI.SetParameterInt("channels.green", 2) otb_NDVI.SetParameterInt("channels.red", 3) otb_NDVI.SetParameterInt("channels.nir", 4) otb_NDVI.SetParameterStringList("list", ["Vegetation:NDVI"]) sauvegarde = configparser.ConfigParser() for annee in self.liste_dossier : sauvegarde.read("{}/{}/sauvegarde.ini".format(self.resultats, annee)) dossier_NDVI = "{}/{}/NDVI".format(self.resultats, annee) if not os.path.exists(dossier_NDVI) : os.makedirs(dossier_NDVI) for img in self.liste_dossier[annee] : chemin_ndvi = "{}/ndvi_{}".format(dossier_NDVI, os.path.basename(img)) if not str2bool(sauvegarde[os.path.basename(img)[:-4]]["NDVI"]): otb_NDVI.SetParameterString("in", img) otb_NDVI.SetParameterString("out", chemin_ndvi) otb_NDVI.ExecuteAndWriteOutput() sauvegarde[os.path.basename(img)[:-4]]["NDVI"] = "True" liste_ndvi = sorted([x for x in glob.glob("{}/*".format(dossier_NDVI)) if x.endswith(".tif") and "stack" not in x]) vrt = gdal.BuildVRT("", liste_ndvi, options=options_vrt) gdal.Translate("{}/{}/NDVI/stack_ndvi.tif".format(self.resultats, annee), vrt) with open("{}/{}/sauvegarde.ini".format(self.resultats, annee), 'w') as configfile: sauvegarde.write(configfile) def i_images_processing(self): """ Calul le ndvi, fusionnne en une seule image puis lance le module OTBPhenology """ self.calcul_ndvi() self.otbPhenologie()