CORREÇÃO ATMOSFÉRICA DE OBSERVAÇÕES DE CORES DO OCEANO CONTAMINADAS COM BRILHO SOL
François Steinmetz
Pierre Yves Deschamps
Didier Ramon
HIGEOS
Esta é a implementação python/cython do algoritmo de correção atmosférica Polymer. http://www.opticsinfobase.org/oe/abstract.cfm?uri=oe-19-10-9783
O polímero é escrito em python3. É altamente recomendado usar o anaconda para instalar todas as dependências necessárias. A versão miniconda é suficiente. O arquivo environment.yml
pode ser usado para instalar as dependências, seja em seu ambiente anaconda atual ou em um novo.
Para criar um novo ambiente anaconda (instalação independente do python) com dependências do Polymer:
conda create -n polymer -c conda-forge mamba conda activate polymer mamba env update -f environment.yml
Os dados auxiliares podem ser baixados com o seguinte comando:
$ make auxdata_all
Os arquivos pyx são arquivos cython que precisam ser convertidos para C e depois compilados. Um makefile é fornecido, então basta digitar:
$ make
NOTA: o comando make all
irá baixar os arquivos auxiliares e prosseguir para a compilação.
Existe uma interface de linha de comando minimalista polymer_cli.py
./polymer_cli.py <level1> <level2>
Onde é um arquivo ou diretório de nível1 para qualquer um dos sensores suportados e é o resultado a ser gerado.
Consulte ./polymer_cli.py -h
para obter mais ajuda
Mais opções estão disponíveis executando o polímero diretamente de seu próprio script python.
de polímero.main importar run_atm_corrfrom polímero.nível1 importar Nível1de polímero.nível2 importar Nível2run_atm_corr(Level1('MER_RR__1PRACR20050501_092849_000026372036_00480_16566_0000.N1', <outros argumentos opcionais de nível1>), Nível2('output.nc', <outros argumentos opcionais de nível 2>), <argumentos opcionais de polímero>)
Veja example.py
para mais detalhes...
Multiprocessamento
Uma opção é multiprocessing
, que controla o número de threads disponíveis para processamento do Polymer (por padrão, o multiprocessamento está desativado). Para ativar o processamento em tantas threads quantos núcleos houver na CPU, passe o valor -1
:
run_atm_corr(..., multiprocessing=-1)
Esta opção controla a paralelização do processamento principal do Polymer. No entanto, o Polymer depende do numpy, que também pode usar processamento paralelo e resulta em um uso moderado de vários núcleos. Para desativar também o multiprocessamento numpy, você pode passar a variável de ambiente OMP_NUM_THREADS=1
(ou usar a biblioteca threadpoolctl)
As credenciais para acessar dados auxiliares da NASA devem ser fornecidas em seu arquivo ~/.netrc:
cd ~ touch .netrc echo "machine urs.earthdata.nasa.gov login uid_goes_here password password_goes_here" > .netrc chmod 0600 .netrc
Mais informações aqui: https://urs.earthdata.nasa.gov/documentation/for_users/data_access/curl_and_wget
Dados auxiliares (coluna total de ozônio, velocidade do vento, pressão superficial) podem ser fornecidos para a classe level1 através da classe Ancillary_NASA (arquivos NASA em formato hdf4):
de importação de polímero.ancillary Ancillary_NASA Level1(<nome do arquivo>, ancillary=Ancillary_NASA())
NOTA : a classe Ancillary_NASA
possui opções padrão para baixar e selecionar automaticamente o conjunto de dados disponível mais próximo, na pasta ANCILLARY/METEO/
Esta pasta é inicializada com o comando make ancillary
ou make all
.
Para obter mais informações sobre os parâmetros opcionais, consulte a ajuda de Ancillary_NASA
.
Opcionalmente, os dados auxiliares (coluna total de ozônio, velocidade do vento, pressão superficial) podem ser fornecidos pela reanálise global ERA-Interim do ECMWF.
Consulte https://www.ecmwf.int/en/forecasts/datasets/reanálise-datasets/era-interim
Os seguintes módulos python são necessários para fazer a interface do Polymer com o ERA-Interim: * ecmwf python api client (para baixar arquivos ERA-Interim dinamicamente) Uma chave ECMWF é necessária. Consulte https://software.ecmwf.int/wiki/display/WEBAPI/Access+ECMWF+Public+Datasets * pygrib, para ler os arquivos ERA-Interim no formato grib.
Os dados auxiliares ERA-Interim são usados passando a classe Ancillary_ERA para o parâmetro auxiliar do Nível1.
de polímero.ancillary_era importar Ancillary_ERA Level1(<nome do arquivo>, ancillary=Ancillary_ERA())
Por padrão, os dados mais próximos no tempo são usados automaticamente e baixados dinamicamente, se necessário. Para obter mais informações, consulte a documentação de Ancillary_ERA.
Os dados auxiliares também podem ser fornecidos pelo conjunto de dados ERA5 do ECMWF: https://www.ecmwf.int/en/forecasts/datasets/reanálise-datasets/era5
Os seguintes módulos python são necessários:
cdsapi. É necessária uma chave de API CDS. Consulte https://cds.climate.copernicus.eu/api-how-to para obter mais detalhes.
matriz x
de polímero.ancillary_era5 importar Ancillary_ERA5 Level1(<nome do arquivo>, ancillary=Ancillary_ERA5())
Esta seção fornece informações sobre os formatos de arquivo e sensores suportados.
NOTA : A classe Level1
( from polymer.level1 import Level1
) detecta automaticamente o formato do arquivo e retorna o objeto level1 específico apropriado (Level1_MERIS, Level1_OLCI, etc).
Tanto FF (resolução reduzida) quanto FR (resolução total) são suportados.
Exemplo:
de polímero.level1_meris import Level1_MERISLevel1_MERIS('MER_RR__1PRACR20050501_092849_000026372036_00480_16566_0000.N1') # argumentos opcionais: sline, eline, auxiliar
Tanto RR quanto FR são suportados. O nome do produto Level1 é o nome do diretório.
Exemplo:
de polímero.level1_olci import Level1_OLCILevel1_OLCI('S3A_OL_1_EFR____20170123T102747_20170123T103047_20170124T155459_0179_013_279_2160_LN1_O_NT_002.SEN3') # argumentos opcionais: sline, eline, scol, ecol, auxiliares
MODIS, SeaWiFS e VIIRS requerem arquivos Level1C como entrada. Consulte a próxima seção sobre arquivos de Nível 1C para obter mais informações.
Exemplo:
de polímero.level1_nasa importar *Level1_MODIS('A2010120124000.L1C')Level1_SeaWiFS('S2000116121145.L1C')Level1_VIIRS('V2013339115400.L1C') # argumentos opcionais: sline, eline, scol, ecol, auxiliar
O nome do produto nível1 refere-se ao caminho para o grânulo (no diretório "GRANULE/").
Exemplo:
da importação de polímero.level1_msi Nível1_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 opcionais: sline, eline, auxiliar
O Polymer suporta entrada de dados ascii (CSV) de vários sensores por meio da classe level1 Level1_ASCII.
Level1_NETCDF pode ser usado para ler produtos MERIS, OLCI ou Sentinel2 no formato netCDF4, escritos por SNAP, em particular quando usado para subconjuntos.
NASA OBPG L1A e L1B não incluem todas as correções radiométricas necessárias. Assim, é necessário aplicar l2gen
com opções personalizadas para escrever as refletâncias TOA no que chamamos de produto "Level1C".
A linha de comando normalmente é:
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 é um script auxiliar para gerar produtos de nível 1c.
Os arquivos de saída podem estar no formato hdf4 ou netcdf. Eles contêm a refletância da água (adimensional, totalmente normalizada para o sol e sensor no nadir) e outros parâmetros autoexplicativos.
Os sinalizadores de polímero são os seguintes:
--------------------------------------------------------------------------------- | 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 | --------------------------------------------------------------------------------|
A sinalização recomendada de pixels de saída é a seguinte ('&' representa o 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 | -----------------------------------------------------------------------------|
Observação: é recomendado mascaramento de nuvem adicional usando IdePix (https://github.com/bcdev/snap-idepix).
Este software está disponível sob a licença Polymer v2.0, disponível no arquivo LICENCE.TXT.
Ao reconhecer o uso do Polímero para artigos científicos, relatórios, etc., cite a seguinte referência:
François Steinmetz, Pierre-Yves Deschamps e Didier Ramon, "Correção atmosférica na presença de brilho solar: aplicação ao MERIS", Opt. Expresso 19, 9783-9800 (2011), http://dx.doi.org/10.1364/OE.19.009783
François Steinmetz e Didier Ramon "Produtos de cores oceânicas consistentes Sentinel-2 MSI e Sentinel-3 OLCI usando POLYMER", Proc. SPIE 10778, Detecção Remota do Oceano Aberto e Costeiro e das Águas Interiores, 107780E (30 de outubro de 2018); https://doi.org/10.1117/12.2500232