CORRECCIÓN ATMOSFÉRICA DE OBSERVACIONES DE COLOR DEL OCÉANO CONTAMINADO CON BRILLOS SOLARES
François Steinmetz
Pierre-Yves Deschamps
Didier Ramón
HIGEOS
Esta es la implementación en Python/Cython del algoritmo de corrección atmosférica de Polymer. http://www.opticsinfobase.org/oe/abstract.cfm?uri=oe-19-10-9783
El polímero está escrito en python3. Se recomienda encarecidamente utilizar anaconda para instalar todas las dependencias necesarias. La versión miniconda es suficiente. El archivo environment.yml
se puede utilizar para instalar las dependencias, ya sea en su entorno anaconda actual o en uno nuevo.
Para crear un nuevo entorno anaconda (instalación independiente de Python) con dependencias de Polymer:
conda create -n polymer -c conda-forge mamba conda activate polymer mamba env update -f environment.yml
Los datos auxiliares se pueden descargar con el siguiente comando:
$ make auxdata_all
Los archivos pyx son archivos cython que deben convertirse a C y luego compilarse. Se proporciona un archivo MAKE, así que simplemente escriba:
$ make
NOTA: el comando make all
descargará los archivos auxiliares y procederá a la compilación.
Hay una interfaz de línea de comando polymer_cli.py
./polymer_cli.py <level1> <level2>
¿Dónde está un archivo o directorio de nivel 1 para cualquiera de los sensores admitidos y es el resultado que se generará?
Consulte ./polymer_cli.py -h
para obtener más ayuda.
Hay más opciones disponibles ejecutando Polymer directamente desde su propio script de Python.
frompolymer.main import run_atm_corrfrompolymer.level1 import Level1frompolymer.level2 import Level2run_atm_corr(Level1('MER_RR__1PRACR20050501_092849_000026372036_00480_16566_0000.N1', <otros argumentos opcionales de nivel1>), Level2('output.nc', <otros argumentos opcionales de nivel 2>), <argumentos de polímero opcionales>)
Consulte example.py
para obtener más detalles...
Multiprocesamiento
Una opción es multiprocessing
, que controla la cantidad de subprocesos disponibles para el procesamiento de polímeros (de forma predeterminada, el multiprocesamiento está desactivado). Para activar el procesamiento en tantos subprocesos como núcleos haya en la CPU, pase el valor -1
:
run_atm_corr(..., multiprocessing=-1)
Esta opción controla la paralelización del procesamiento central del polímero. Sin embargo, Polymer se basa en numpy, que también puede utilizar procesamiento paralelo y da como resultado un uso moderado de múltiples núcleos. Para desactivar también el multiprocesamiento numpy, puede pasar la variable de entorno OMP_NUM_THREADS=1
(o usar la biblioteca threadpoolctl)
Las credenciales para acceder a los datos auxiliares de la NASA deben proporcionarse en su archivo ~/.netrc:
cd ~ touch .netrc echo "machine urs.earthdata.nasa.gov login uid_goes_here password password_goes_here" > .netrc chmod 0600 .netrc
Más información aquí: https://urs.earthdata.nasa.gov/documentation/for_users/data_access/curl_and_wget
Los datos auxiliares (columna total de ozono, velocidad del viento, presión en la superficie) se pueden proporcionar a la clase de nivel 1 a través de la clase Ancillary_NASA (archivos NASA en formato hdf4):
de polímero.ancillary import Ancillary_NASA Nivel1(<nombre de archivo>, ancillary=Ancillary_NASA())
NOTA : la clase Ancillary_NASA
tiene opciones predeterminadas para descargar y seleccionar automáticamente el conjunto de datos disponible más cercano, en la carpeta ANCILLARY/METEO/
Esta carpeta se inicializa con el comando make ancillary
o make all
.
Para obtener más información sobre los parámetros opcionales, consulte la ayuda de Ancillary_NASA
.
Opcionalmente, los datos auxiliares (columna total de ozono, velocidad del viento, presión en la superficie) pueden ser proporcionados por el reanálisis global ERA-Interim del ECMWF.
Ver https://www.ecmwf.int/en/forecasts/datasets/reanalysis-datasets/era-interim
Los siguientes módulos de Python son necesarios para interconectar Polymer con ERA-Interim: * Cliente api de Python ecmwf (para descargar archivos de ERA-Interim sobre la marcha) Se necesita una clave ECMWF. Consulte https://software.ecmwf.int/wiki/display/WEBAPI/Access+ECMWF+Public+Datasets * pygrib para leer los archivos ERA-Interim en formato grib.
Los datos auxiliares ERA-Interim se utilizan pasando la clase Ancillary_ERA al parámetro auxiliar del Nivel1.
de polímero.ancillary_era importar Ancillary_ERA Nivel1(<nombre de archivo>, ancillary=Ancillary_ERA())
De forma predeterminada, los datos más cercanos en el tiempo se utilizan automáticamente y se descargan sobre la marcha si es necesario. Para obtener más información, consulte la cadena de documentación de Ancillary_ERA.
Los datos auxiliares también pueden ser proporcionados por el conjunto de datos ERA5 del ECMWF: https://www.ecmwf.int/en/forecasts/datasets/reanalysis-datasets/era5
Se requieren los siguientes módulos de Python:
cdsapi. Se requiere una clave CDS API. Consulte https://cds.climate.copernicus.eu/api-how-to para obtener más detalles.
matriz x
de polímero.ancillary_era5 importar Ancillary_ERA5 Nivel1(<nombre de archivo>, ancillary=Ancillary_ERA5())
Esta sección proporciona información sobre los formatos de archivos y sensores admitidos.
NOTA : La clase Level1
( from polymer.level1 import Level1
) detecta automáticamente el formato del archivo y devuelve el objeto de nivel1 específico apropiado (Level1_MERIS, Level1_OLCI, etc.).
Se admiten tanto FF (resolución reducida) como FR (resolución completa).
Ejemplo:
frompolymer.level1_meris import Level1_MERISLevel1_MERIS('MER_RR__1PRACR20050501_092849_000026372036_00480_16566_0000.N1') # argumentos opcionales: sline, eline, ancillary
Se admiten tanto RR como FR. El nombre del producto Level1 es el nombre del directorio.
Ejemplo:
de polímero.level1_olci importar Level1_OLCILevel1_OLCI('S3A_OL_1_EFR____20170123T102747_20170123T103047_20170124T155459_0179_013_279_2160_LN1_O_NT_002.SEN3') # opcional argumentos: sline, eline, scol, ecol, auxiliar
MODIS, SeaWiFS y VIIRS requieren archivos Level1C como entrada. Consulte la siguiente sección sobre archivos de nivel 1C para obtener más información.
Ejemplo:
de polímero.level1_nasa import *Level1_MODIS('A2010120124000.L1C')Level1_SeaWiFS('S2000116121145.L1C')Level1_VIIRS('V2013339115400.L1C') # argumentos opcionales: sline, eline, scol, ecológico, auxiliar
El nombre del producto de nivel 1 hace referencia a la ruta al granulo (en el directorio "GRANULE/").
Ejemplo:
desde la importación de polímero.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') # argumentos opcionales: sline, eline, auxiliar
Polymer admite la entrada de datos ascii (CSV) desde múltiples sensores a través de la clase nivel1 Level1_ASCII.
Level1_NETCDF se puede utilizar para leer productos MERIS, OLCI o Sentinel2 en formato netCDF4, escritos por SNAP, en particular cuando se utilizan para subconjuntos.
NASA OBPG L1A y L1B no incluyen todas las correcciones radiométricas necesarias. Por lo tanto, es necesario aplicar l2gen
con opciones personalizadas para escribir las reflectancias TOA en lo que llamamos producto "Level1C".
La línea de comando suele ser:
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"
Consulte tools/make_L1C.py
, que es un script auxiliar para generar productos de nivel 1c.
Los archivos de salida pueden estar en formato hdf4 o netcdf. Contienen la reflectancia del agua (adimensional, completamente normalizada para el sol y el sensor en el nadir) y otros parámetros que se explican por sí mismos.
Las banderas de Polímero son las siguientes:
--------------------------------------------------------------------------------- | 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 | --------------------------------------------------------------------------------|
El marcado recomendado de píxeles de salida es el siguiente ('&' representa el operador AND bit a 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 | -----------------------------------------------------------------------------|
Nota: se recomienda un enmascaramiento de nube adicional usando IdePix (https://github.com/bcdev/snap-idepix).
Este software está disponible bajo la licencia Polymer v2.0, disponible en el archivo LICENCE.TXT.
Al reconocer el uso de Polymer para artículos científicos, informes, etc., cite la siguiente referencia:
François Steinmetz, Pierre-Yves Deschamps y Didier Ramon, "Corrección atmosférica en presencia de reflejos solares: aplicación a MERIS", Opt. Expreso 19, 9783-9800 (2011), http://dx.doi.org/10.1364/OE.19.009783
François Steinmetz y Didier Ramon "Productos de color oceánico consistentes Sentinel-2 MSI y Sentinel-3 OLCI utilizando POLÍMERO", Proc. SPIE 10778, Teledetección de los océanos abiertos y costeros y de las aguas interiores, 107780E (30 de octubre de 2018); https://doi.org/10.1117/12.2500232