CORRECTION ATMOSPHÉRIQUE DES OBSERVATIONS DE COULEUR DES OCÉANS CONTAMINÉS PAR LE SOLEIL
François Steinmetz
Pierre-Yves Deschamps
Didier Ramon
HYGÉOS
Il s'agit de l'implémentation python/cython de l'algorithme de correction atmosphérique Polymer. http://www.opticsinfobase.org/oe/abstract.cfm?uri=oe-19-10-9783
Polymer est écrit en python3. Il est fortement recommandé d'utiliser anaconda pour installer toutes les dépendances requises. La version miniconda est suffisante. Le fichier environment.yml
peut être utilisé pour installer les dépendances, soit dans votre environnement anaconda actuel, soit dans un nouveau.
Pour créer un nouvel environnement anaconda (installation Python indépendante) avec des dépendances Polymer :
conda create -n polymer -c conda-forge mamba conda activate polymer mamba env update -f environment.yml
Les données auxiliaires peuvent être téléchargées avec la commande suivante :
$ make auxdata_all
Les fichiers pyx sont des fichiers cython qui doivent être convertis en C, puis compilés. Un makefile est fourni, il suffit donc de taper :
$ make
REMARQUE : la commande make all
téléchargera les fichiers auxiliaires et procédera à la compilation.
Il existe une interface de ligne de commande minimaliste polymer_cli.py
./polymer_cli.py <level1> <level2>
Où représente un fichier ou un répertoire de niveau 1 pour l'un des capteurs pris en charge et le résultat à générer.
Voir ./polymer_cli.py -h
pour plus d'aide
Plus d'options sont disponibles en exécutant polymère directement à partir de votre propre script Python.
from polymer.main import run_atm_corrfrom polymer.level1 import Level1from polymer.level2 import Level2run_atm_corr(Level1('MER_RR__1PRACR20050501_092849_000026372036_00480_16566_0000.N1', <autres arguments facultatifs de niveau 1>), Level2('output.nc', <autres arguments facultatifs de niveau 2>), <arguments polymères facultatifs>)
Voir example.py
pour plus de détails...
Multitraitement
Une option est multiprocessing
, qui contrôle le nombre de threads disponibles pour le traitement Polymer (par défaut, le multiprocessing est désactivé). Pour activer le traitement sur autant de threads qu'il y a de coeurs sur le CPU, passez la valeur -1
:
run_atm_corr(..., multiprocessing=-1)
Cette option contrôle la parallélisation du traitement principal du polymère. Cependant, Polymer s'appuie sur numpy, qui peut également utiliser le traitement parallèle, et entraîne une utilisation modérée de plusieurs cœurs. Pour désactiver également le multitraitement numpy, vous pouvez passer la variable d'environnement OMP_NUM_THREADS=1
(ou utiliser la bibliothèque threadpoolctl)
Les informations d'identification permettant d'accéder aux données auxiliaires de la NASA doivent être fournies dans votre fichier ~/.netrc :
cd ~ touch .netrc echo "machine urs.earthdata.nasa.gov login uid_goes_here password password_goes_here" > .netrc chmod 0600 .netrc
Plus d'informations ici : https://urs.earthdata.nasa.gov/documentation/for_users/data_access/curl_and_wget
Des données annexes (colonne totale d'ozone, vitesse du vent, pression de surface) peuvent être fournies à la classe niveau1 via la classe Ancillary_NASA (fichiers NASA au format hdf4) :
à partir de polymer.ancillary import Ancillary_NASA Level1(<filename>, ancillary=Ancillary_NASA())
NOTE : la classe Ancillary_NASA
a des options par défaut pour télécharger et sélectionner automatiquement le jeu de données disponible le plus proche, dans le dossier ANCILLARY/METEO/
Ce dossier est initialisé avec la commande make ancillary
ou make all
.
Pour plus d'informations sur les paramètres facultatifs, veuillez consulter l'aide d' Ancillary_NASA
.
En option, les données auxiliaires (colonne totale d'ozone, vitesse du vent, pression de surface) peuvent être fournies par la réanalyse globale ERA-Interim du CEPMMT.
Voir https://www.ecmwf.int/en/forecasts/datasets/reanalysis-datasets/era-interim
Les modules python suivants sont nécessaires pour interfacer Polymer avec ERA-Interim : * Client api python ecmwf (pour télécharger les fichiers ERA-Interim à la volée) Une clé ECMWF est nécessaire. Voir https://software.ecmwf.int/wiki/display/WEBAPI/Access+ECMWF+Public+Datasets * pygrib, pour lire les fichiers ERA-Interim au format grib.
Les données auxiliaires ERA-Interim sont utilisées en passant la classe Ancillary_ERA au paramètre auxiliaire du Level1.
à partir de polymer.ancillary_era import Ancillary_ERA Level1(<filename>, ancillary=Ancillary_ERA())
Par défaut, les données les plus proches dans le temps sont automatiquement utilisées, et téléchargées à la volée si nécessaire. Pour plus d'informations, veuillez consulter la docstring d'Ancillary_ERA.
Les données auxiliaires peuvent également être fournies par l'ensemble de données ERA5 du CEPMMT : https://www.ecmwf.int/en/forecasts/datasets/reanalysis-datasets/era5
Les modules Python suivants sont requis :
cdsapi. Une clé API CDS est requise. Veuillez consulter https://cds.climate.copernicus.eu/api-how-to pour plus de détails.
tableau x
à partir de polymer.ancillary_era5 import Ancillary_ERA5 Level1(<filename>, ancillary=Ancillary_ERA5())
Cette section fournit des informations sur les formats de fichiers et les capteurs pris en charge.
REMARQUE : La classe Level1
( from polymer.level1 import Level1
) détecte automatiquement le format de fichier et renvoie l'objet de niveau1 spécifique approprié (Level1_MERIS, Level1_OLCI, etc.).
FF (résolution réduite) et FR (pleine résolution) sont pris en charge.
Exemple:
from polymer.level1_meris import Level1_MERISLevel1_MERIS('MER_RR__1PRACR20050501_092849_000026372036_00480_16566_0000.N1') # arguments facultatifs : sline, eline, auxiliaire
RR et FR sont pris en charge. Le nom du produit Level1 est le nom du répertoire.
Exemple:
à partir de polymer.level1_olci import Level1_OLCILevel1_OLCI('S3A_OL_1_EFR____20170123T102747_20170123T103047_20170124T155459_0179_013_279_2160_LN1_O_NT_002.SEN3') # arguments facultatifs : sline, eline, scol, ecol, ancillary
MODIS, SeaWiFS et VIIRS nécessitent des fichiers Level1C en entrée. Consultez la section suivante sur les fichiers de niveau 1C pour plus d'informations.
Exemple:
from polymer.level1_nasa import *Level1_MODIS('A2010120124000.L1C')Level1_SeaWiFS('S2000116121145.L1C')Level1_VIIRS('V2013339115400.L1C') # arguments facultatifs : sline, eline, scol, ecol, auxiliaire
Le nom du produit de niveau 1 fait référence au chemin d'accès au granule (dans le répertoire "GRANULE/").
Exemple:
à partir de l'importation polymère.level1_msi Level1_MSILevel1_MSI('S2A_OPER_PRD_MSIL1C_PDMC_20160504T225644_R094_V20160504T105917_2016 0504T105917.SAFE/GRANULE/S2A_OPER_MSI_L1C_TL_SGS__20160504T163055_A004524_T30TXR_N02.02') # arguments facultatifs : sline, eline, auxiliaire
Polymer prend en charge la saisie de données ascii (CSV) provenant de plusieurs capteurs via la classe niveau 1 Level1_ASCII.
Level1_NETCDF peut être utilisé pour lire les produits MERIS, OLCI ou Sentinel2 au format netCDF4, écrits par SNAP, notamment lorsqu'ils sont utilisés pour du sous-ensemble.
Les OBPG L1A et L1B de la NASA n'incluent pas toutes les corrections radiométriques nécessaires. Il est donc nécessaire d'appliquer l2gen
avec des options personnalisées pour écrire les réflectances TOA dans ce que nous appelons le produit "Level1C".
La ligne de commande est généralement :
l2gen ifile=<level1a> ofile=<level1c> gain="1 1 1 1 1 1 1 1" oformat="netcdf4" l2prod="rhot_nnn polcor_nnn sena senz sola solz latitude longitude"
Voir tools/make_L1C.py
, qui est un script d'aide pour générer des produits de niveau 1c.
Les fichiers de sortie peuvent être au format hdf4 ou netcdf. Ils contiennent la réflectance de l'eau (sans dimension, entièrement normalisée pour le soleil et le capteur au nadir) et d'autres paramètres explicites.
Les drapeaux Polymère sont les suivants :
--------------------------------------------------------------------------------- | Flag name | Flag value | Description | |--------------------|-------------|--------------------------------------------| | LAND | 1 | Land mask | | CLOUD_BASE | 2 | Polymer's basic cloud mask | | L1_INVALID | 4 | Invalid level1 pixel | | NEGATIVE_BB | 8 | (deprecated flag) | | OUT_OF_BOUNDS | 16 | Retrieved marine parameters are outside | | | | valid bounds | | EXCEPTION | 32 | A processing error was encountered | | THICK_AEROSOL | 64 | Thick aerosol flag | | HIGH_AIR_MASS | 128 | Air mass exceeds 5 | | EXTERNAL_MASK | 512 | Pixel was masked using external mask | | CASE2 | 1024 | Pixel was processed in "case2" mode | | INCONSISTENCY | 2048 | Inconsistent result was detected | | | | (atmospheric reflectance out of bounds | | ANOMALY_RWMOD_BLUE | 4096 | Excessive difference was found at 412nm | | | | between Rw and Rwmod | --------------------------------------------------------------------------------|
Le marquage recommandé des pixels de sortie est le suivant (« & » représente l'opérateur ET au niveau du bit) :
------------------------------------------------------------------------------ | Sensor | Recommended flagging | Notes | | | (valid pixels) | | |----------|------------------------------|----------------------------------| | OLCI | bitmask & 1023 == 0 | | | | | | | MSI | bitmask & 1023 == 0 | | | | | | | MERIS | bitmask & 1023 == 0 | | | | | | | VIIRS | bitmask & 1023 == 0 | Sun glint and bright (cloudy) | | | and (Rnir<0.1) | pixels are discarded | | | and (Rgli<0.1) | | | | | | | SeaWiFS | bitmask & 1023+2048 == 0 | The INCONSISTENCY flag | | | | cleans up most noisy pixels | | | | | | MODIS | bitmask & 1023+4096 == 0 | The ANOMALY_RWMOD_BLUE removes | | | | outliers appearing on MODIS | | | | results at high SZA | -----------------------------------------------------------------------------|
Remarque : un masquage cloud supplémentaire à l'aide d'IdePix (https://github.com/bcdev/snap-idepix) est recommandé.
Ce logiciel est disponible sous la licence Polymer v2.0, disponible dans le fichier LICENCE.TXT.
Lorsque vous reconnaissez l'utilisation de Polymer pour des articles scientifiques, des rapports, etc., veuillez citer la référence suivante :
François Steinmetz, Pierre-Yves Deschamps, et Didier Ramon, "Correction atmosphérique en présence de reflets solaires : application à MERIS", Opt. Express 19, 9783-9800 (2011), http://dx.doi.org/10.1364/OE.19.009783
François Steinmetz et Didier Ramon "Produits de couleur océan cohérente Sentinel-2 MSI et Sentinel-3 OLCI utilisant POLYMÈRE", Proc. SPIE 10778, Télédétection des océans ouverts et côtiers et des eaux intérieures, 107780E (30 octobre 2018) ; https://doi.org/10.1117/12.2500232