ATMOSPHÄRISCHE KORREKTUR VON SONNENGLINT-KONTAMINIERTEN MEERESFARBENBEOBACHTUNGEN
François Steinmetz
Pierre-Yves Deschamps
Didier Ramon
HYGEOS
Dies ist die Python/Cython-Implementierung des Polymer-Atmosphärenkorrekturalgorithmus. http://www.opticsinfobase.org/oe/abstract.cfm?uri=oe-19-10-9783
Polymer ist in Python3 geschrieben. Es wird dringend empfohlen, Anaconda zu verwenden, um alle erforderlichen Abhängigkeiten zu installieren. Die Miniconda-Version ist ausreichend. Mit der Datei environment.yml
können Sie die Abhängigkeiten entweder in Ihrer aktuellen Anaconda-Umgebung oder in einer neuen installieren.
So erstellen Sie eine neue Anaconda-Umgebung (unabhängige Python-Installation) mit Polymer-Abhängigkeiten:
conda create -n polymer -c conda-forge mamba conda activate polymer mamba env update -f environment.yml
Die Hilfsdaten können mit dem folgenden Befehl heruntergeladen werden:
$ make auxdata_all
Bei den Pyx-Dateien handelt es sich um Cython-Dateien, die in C konvertiert und dann kompiliert werden müssen. Es wird ein Makefile bereitgestellt, also geben Sie einfach Folgendes ein:
$ make
HINWEIS: Der Befehl make all
lädt die Hilfsdateien herunter und fährt mit der Kompilierung fort.
Es gibt eine minimalistische Befehlszeilenschnittstelle polymer_cli.py
./polymer_cli.py <level1> <level2>
Wo ist eine Datei oder ein Verzeichnis der Ebene 1 für einen der unterstützten Sensoren und das zu generierende Ergebnis?
Weitere Hilfe finden Sie unter ./polymer_cli.py -h
Weitere Optionen stehen zur Verfügung, indem Sie Polymer direkt aus Ihrem eigenen Python-Skript ausführen.
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', <andere optionale Level1-Argumente>), Level2('output.nc', <andere optionale Level2-Argumente>), <optionale Polymerargumente>)
Weitere Details finden Sie unter example.py
...
Mehrfachverarbeitung
Eine Option ist multiprocessing
, die die Anzahl der für die Polymerverarbeitung verfügbaren Threads steuert (standardmäßig ist Multiprocessing deaktiviert). Um die Verarbeitung auf so vielen Threads zu aktivieren, wie Kerne auf der CPU vorhanden sind, übergeben Sie den Wert -1
:
run_atm_corr(..., multiprocessing=-1)
Diese Option steuert die Parallelisierung der Kernpolymerverarbeitung. Allerdings setzt Polymer auf Numpy, das auch Parallelverarbeitung nutzen kann und zu einer moderaten Auslastung mehrerer Kerne führt. Um Numpy Multiprocessing ebenfalls zu deaktivieren, können Sie die Umgebungsvariable OMP_NUM_THREADS=1
übergeben (oder die Threadpoolctl-Bibliothek verwenden).
Die Anmeldeinformationen für den Zugriff auf NASA-Zusatzdaten sollten in Ihrer ~/.netrc-Datei angegeben werden:
cd ~ touch .netrc echo "machine urs.earthdata.nasa.gov login uid_goes_here password password_goes_here" > .netrc chmod 0600 .netrc
Weitere Informationen hier: https://urs.earthdata.nasa.gov/documentation/for_users/data_access/curl_and_wget
Zusatzdaten (Ozon-Gesamtsäule, Windgeschwindigkeit, Oberflächendruck) können der Klasse Level1 über die Klasse Ancillary_NASA (NASA-Dateien im HDF4-Format) bereitgestellt werden:
from polymer.ancillary import Ancillary_NASA Level1(<filename>, ancillary=Ancillary_NASA())
HINWEIS : Die Klasse Ancillary_NASA
verfügt über Standardoptionen zum automatischen Herunterladen und Auswählen des nächstgelegenen verfügbaren Datensatzes im Ordner ANCILLARY/METEO/
Dieser Ordner wird mit dem Befehl make ancillary
oder make all
initialisiert.
Weitere Informationen zu den optionalen Parametern finden Sie in der Hilfe von Ancillary_NASA
.
Optional können die Zusatzdaten (Gesamtozonsäule, Windgeschwindigkeit, Oberflächendruck) von der globalen Reanalyse ERA-Interim des ECMWF bereitgestellt werden.
Siehe https://www.ecmwf.int/en/forecasts/datasets/reanalysis-datasets/era-interim
Die folgenden Python-Module sind erforderlich, um Polymer mit ERA-Interim zu verbinden: * ecmwf Python-API-Client (um ERA-Interim-Dateien im Handumdrehen herunterzuladen) Ein ECMWF-Schlüssel ist erforderlich. Siehe https://software.ecmwf.int/wiki/display/WEBAPI/Access+ECMWF+Public+Datasets * pygrib, um die ERA-Interim-Dateien im Grib-Format zu lesen.
Die ERA-Interim-Zusatzdaten werden verwendet, indem die Klasse Ancillary_ERA an den Parameter ancillary von Level1 übergeben wird.
from polymer.ancillary_era import Ancillary_ERA Level1(<filename>, ancillary=Ancillary_ERA())
Standardmäßig werden automatisch die nächstgelegenen Daten verwendet und bei Bedarf spontan heruntergeladen. Weitere Informationen finden Sie im Dokumentstring von Ancillary_ERA.
Die Zusatzdaten können auch über den ERA5-Datensatz des ECMWF bereitgestellt werden: https://www.ecmwf.int/en/forecasts/datasets/reanalysis-datasets/era5
Die folgenden Python-Module sind erforderlich:
cdsapi. Ein CDS-API-Schlüssel ist erforderlich. Weitere Informationen finden Sie unter https://cds.climate.copernicus.eu/api-how-to.
xarray
aus polymer.ancillary_era5 import Ancillary_ERA5 Level1(<filename>, ancillary=Ancillary_ERA5())
In diesem Abschnitt finden Sie Informationen zu den unterstützten Dateiformaten und Sensoren.
HINWEIS : Die Klasse Level1
( from polymer.level1 import Level1
) erkennt das Dateiformat automatisch und gibt das entsprechende spezifische Level1-Objekt zurück (Level1_MERIS, Level1_OLCI usw.).
Es werden sowohl FF (reduzierte Auflösung) als auch FR (volle Auflösung) unterstützt.
Beispiel:
from polymer.level1_meris import Level1_MERISLevel1_MERIS('MER_RR__1PRACR20050501_092849_000026372036_00480_16566_0000.N1') # optionale Argumente: sline, eline, ancillary
Sowohl RR als auch FR werden unterstützt. Der Name des Level1-Produkts ist der Name des Verzeichnisses.
Beispiel:
from polymer.level1_olci import Level1_OLCILevel1_OLCI('S3A_OL_1_EFR____20170123T102747_20170123T103047_20170124T155459_0179_013_279_2160_LN1_O_NT_002.SEN3') # optional Argumente: sline, eline, scol, ecol, ancillary
MODIS, SeaWiFS und VIIRS erfordern Level1C-Dateien als Eingabe. Weitere Informationen finden Sie im nächsten Abschnitt zu Level 1C-Dateien.
Beispiel:
from polymer.level1_nasa import *Level1_MODIS('A2010120124000.L1C')Level1_SeaWiFS('S2000116121145.L1C')Level1_VIIRS('V2013339115400.L1C') # optionale Argumente: sline, eline, scol, ecol, untergeordnet
Der Name des Level1-Produkts bezieht sich auf den Pfad zum Granulat (im Verzeichnis „GRANULE/“).
Beispiel:
aus polymer.level1_msi-Import 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') # optionale Argumente: sline, eline, ancillary
Polymer unterstützt die ASCII-Dateneingabe (CSV) von mehreren Sensoren über die Level1-Klasse Level1_ASCII.
Level1_NETCDF kann zum Lesen von MERIS-, OLCI- oder Sentinel2-Produkten im netCDF4-Format verwendet werden, die von SNAP geschrieben wurden, insbesondere wenn sie für Teilmengen verwendet werden.
NASA OBPG L1A und L1B enthalten nicht alle notwendigen radiometrischen Korrekturen. Daher ist es notwendig, l2gen
mit benutzerdefinierten Optionen anzuwenden, um die TOA-Reflexionen in das zu schreiben, was wir „Level1C“-Produkt nennen.
Die Befehlszeile lautet normalerweise:
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"
Siehe tools/make_L1C.py
, ein Hilfsskript zum Generieren von Produkten der Stufe 1c.
Die Ausgabedateien können im Format hdf4 oder netcdf vorliegen. Sie enthalten den Wasserreflexionsgrad (dimensionslos, vollständig normiert für Sonne und Sensor am Nadir) und andere selbsterklärende Parameter.
Die Polymer-Flags sind die folgenden:
--------------------------------------------------------------------------------- | 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 | --------------------------------------------------------------------------------|
Die empfohlene Kennzeichnung von Ausgabepixeln ist die folgende ('&' steht für den bitweisen UND-Operator):
------------------------------------------------------------------------------ | 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 | -----------------------------------------------------------------------------|
Hinweis: Eine zusätzliche Cloud-Maskierung mit IdePix (https://github.com/bcdev/snap-idepix) wird empfohlen.
Diese Software ist unter der Polymer-Lizenz v2.0 verfügbar, die in der Datei LICENCE.TXT verfügbar ist.
Wenn Sie die Verwendung von Polymer für wissenschaftliche Arbeiten, Berichte usw. anerkennen, geben Sie bitte die folgende Referenz an:
François Steinmetz, Pierre-Yves Deschamps und Didier Ramon, „Atmosphärische Korrektur bei Sonneneinstrahlung: Anwendung auf MERIS“, Opt. Express 19, 9783-9800 (2011), http://dx.doi.org/10.1364/OE.19.009783
François Steinmetz und Didier Ramon „Sentinel-2 MSI und Sentinel-3 OLCI konsistente Ozeanfarbprodukte unter Verwendung von POLYMER“, Proc. SPIE 10778, Fernerkundung des offenen und küstennahen Ozeans und der Binnengewässer, 107780E (30. Oktober 2018); https://doi.org/10.1117/12.2500232