KOREKSI ATMOSFER PENGAMATAN WARNA LAUT TERKONTAMINASI KILAS MATAHARI
François Steinmetz
Pierre-Yves Deschamps
Didier Ramon
HIGEOS
Ini adalah implementasi python/cython dari algoritma koreksi atmosfer Polimer. http://www.opticsinfobase.org/oe/abstract.cfm?uri=oe-19-10-9783
Polimer ditulis dalam python3. Sangat disarankan untuk menggunakan anaconda untuk menginstal semua dependensi yang diperlukan. Versi miniconda sudah cukup. File environment.yml
dapat digunakan untuk menginstal dependensi, baik di lingkungan anaconda Anda saat ini, atau di lingkungan baru.
Untuk membuat lingkungan anaconda baru (instalasi python independen) dengan dependensi Polimer:
conda create -n polymer -c conda-forge mamba conda activate polymer mamba env update -f environment.yml
Data tambahan dapat diunduh dengan perintah berikut:
$ make auxdata_all
File pyx adalah file cython yang perlu dikonversi ke C, kemudian dikompilasi. Makefile disediakan, jadi ketik saja:
$ make
CATATAN: perintah make all
akan mengunduh file tambahan dan melanjutkan ke kompilasi.
Ada antarmuka baris perintah minimalis polymer_cli.py
./polymer_cli.py <level1> <level2>
Di mana file atau direktori level1 untuk salah satu sensor yang didukung, dan merupakan hasil yang akan dihasilkan.
Lihat ./polymer_cli.py -h
untuk bantuan lebih lanjut
Opsi lainnya tersedia dengan menjalankan polimer langsung dari skrip python Anda sendiri.
dari polimer.main impor run_atm_corrdari polimer.level1 impor Level1dari polimer.level2 impor Level2run_atm_corr(Level1('MER_RR__1PRACR20050501_092849_000026372036_00480_16566_0000.N1', <argumen level1 opsional lainnya>), Level2('output.nc', <argumen level2 opsional lainnya>), <argumen polimer opsional>)
Lihat example.py
untuk lebih jelasnya...
Multiproses
Salah satu opsinya adalah multiprocessing
, yang mengontrol jumlah thread yang tersedia untuk pemrosesan Polymer (secara default, multiprocessing dinonaktifkan). Untuk mengaktifkan pemrosesan pada thread sebanyak jumlah inti pada CPU, berikan nilai -1
:
run_atm_corr(..., multiprocessing=-1)
Opsi ini mengontrol paralelisasi pemrosesan Polimer inti. Namun, Polymer mengandalkan numpy, yang juga dapat menggunakan pemrosesan paralel, dan menghasilkan penggunaan beberapa inti secara moderat. Untuk juga menonaktifkan multiprosesor numpy, Anda dapat meneruskan variabel lingkungan OMP_NUM_THREADS=1
(atau menggunakan pustaka threadpoolctl)
Kredensial untuk mengakses data tambahan NASA harus diberikan di file ~/.netrc Anda:
cd ~ touch .netrc echo "machine urs.earthdata.nasa.gov login uid_goes_here password password_goes_here" > .netrc chmod 0600 .netrc
Informasi lebih lanjut di sini: https://urs.earthdata.nasa.gov/documentation/for_users/data_access/curl_and_wget
Data tambahan (total kolom ozon, kecepatan angin, tekanan permukaan) dapat diberikan ke kelas level1 melalui kelas Ancillary_NASA (file NASA dalam format hdf4):
dari polimer.ancillary import Ancillary_NASA Level1(<namafile>, ancillary=Ancillary_NASA())
CATATAN : kelas Ancillary_NASA
memiliki opsi default untuk mengunduh secara otomatis dan memilih kumpulan data terdekat yang tersedia, di folder ANCILLARY/METEO/
Folder ini diinisialisasi dengan perintah make ancillary
atau make all
.
Untuk informasi lebih lanjut tentang parameter opsional, silakan lihat bantuan Ancillary_NASA
.
Secara opsional, data tambahan (total kolom ozon, kecepatan angin, tekanan permukaan) dapat disediakan oleh analisis ulang global ECMWF ERA-Interim.
Lihat https://www.ecmwf.int/en/forecasts/datasets/reanalisis-datasets/era-interim
Modul python berikut diperlukan untuk menghubungkan Polimer dengan ERA-Interim: * klien python api ecmwf (untuk mengunduh file ERA-Interim dengan cepat) Kunci ECMWF diperlukan. Lihat https://software.ecmwf.int/wiki/display/WEBAPI/Access+ECMWF+Public+Datasets * pygrib, untuk membaca file ERA-Interim dalam format grib.
Data tambahan ERA-Interim digunakan dengan meneruskan kelas Ancillary_ERA ke parameter tambahan Level1.
dari polimer.ancillary_era import Ancillary_ERA Level1(<namafile>, ancillary=Ancillary_ERA())
Secara default, data terdekat dalam waktu secara otomatis digunakan, dan diunduh dengan cepat jika diperlukan. Untuk informasi lebih lanjut, silakan lihat dokumen Ancillary_ERA.
Data tambahan juga dapat disediakan oleh kumpulan data ERA5 ECMWF: https://www.ecmwf.int/en/forecasts/datasets/reanalisis-datasets/era5
Modul python berikut diperlukan:
cdsapi. Kunci API CDS diperlukan. Silakan lihat https://cds.climate.copernicus.eu/api-how-to untuk detail lebih lanjut.
xarray
dari polimer.ancillary_era5 impor Ancillary_ERA5 Level1(<nama file>, ancillary=Ancillary_ERA5())
Bagian ini memberikan informasi tentang format file dan sensor yang didukung.
CATATAN : Kelas Level1
( from polymer.level1 import Level1
) secara otomatis mendeteksi format file dan mengembalikan objek level1 spesifik yang sesuai (Level1_MERIS, Level1_OLCI, dll).
Baik FF (resolusi rendah) dan FR (resolusi penuh) didukung.
Contoh:
dari polimer.level1_meris import Level1_MERISLevel1_MERIS('MER_RR__1PRACR20050501_092849_000026372036_00480_16566_0000.N1') # argumen opsional: sline, eline, ancillary
Baik RR dan FR didukung. Nama produk Level1 adalah nama direktori.
Contoh:
dari polimer.level1_olci impor Level1_OLCILevel1_OLCI('S3A_OL_1_EFR____20170123T102747_20170123T103047_20170124T155459_0179_013_279_2160_LN1_O_NT_002.SEN3') # argumen opsional: sline, eline, scol, ecol, ancillary
MODIS, SeaWiFS dan VIIRS memerlukan file Level1C sebagai input. Lihat bagian selanjutnya tentang file Level 1C untuk informasi lebih lanjut.
Contoh:
dari polimer.level1_nasa import *Level1_MODIS('A2010120124000.L1C')Level1_SeaWiFS('S2000116121145.L1C')Level1_VIIRS('V2013339115400.L1C') # argumen opsional: sline, eline, scol, ecol, tambahan
Nama produk level1 mengacu pada jalur ke granul (di direktori "GRANULE/").
Contoh:
dari impor polimer.level1_msi Level1_MSILlevel1_MSI('S2A_OPER_PRD_MSIL1C_PDMC_20160504T225644_R094_V20160504T105917_2016 0504T105917.SAFE/GRANULE/S2A_OPER_MSI_L1C_TL_SGS__20160504T163055_A004524_T30TXR_N02.02') # argumen opsional: sline, eline, ancillary
Polymer mendukung input data ascii (CSV) dari beberapa sensor melalui kelas level1 Level1_ASCII.
Level1_NETCDF dapat digunakan untuk membaca produk MERIS, OLCI atau Sentinel2 dalam format netCDF4, yang ditulis oleh SNAP, khususnya bila digunakan untuk subsetting.
NASA OBPG L1A dan L1B tidak menyertakan semua koreksi radiometrik yang diperlukan. Oleh karena itu perlu untuk menerapkan l2gen
dengan opsi khusus untuk menulis reflektansi TOA ke dalam apa yang kami sebut produk "Level1C".
Baris perintah biasanya:
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"
Lihat tools/make_L1C.py
, yang merupakan skrip pembantu untuk menghasilkan produk level 1c.
File outputnya bisa dalam format hdf4 atau netcdf. Mereka berisi reflektansi air (tanpa dimensi, dinormalisasi sepenuhnya untuk matahari dan sensor di titik nadir) dan parameter lain yang cukup jelas.
Bendera Polimer adalah sebagai berikut:
--------------------------------------------------------------------------------- | 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 | --------------------------------------------------------------------------------|
Penandaan piksel keluaran yang direkomendasikan adalah sebagai berikut ('&' mewakili operator AND bitwise):
------------------------------------------------------------------------------ | 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 | -----------------------------------------------------------------------------|
Catatan: disarankan menggunakan cloud masking tambahan menggunakan IdePix (https://github.com/bcdev/snap-idepix).
Perangkat lunak ini tersedia di bawah lisensi Polymer v2.0, tersedia dalam file LICENCE.TXT.
Saat mengakui penggunaan Polimer untuk makalah ilmiah, laporan, dll, harap mengutip referensi berikut:
François Steinmetz, Pierre-Yves Deschamps, dan Didier Ramon, "Koreksi atmosfer dengan adanya kilatan matahari: penerapan pada MERIS", Opt. Ekspres 19, 9783-9800 (2011), http://dx.doi.org/10.1364/OE.19.009783
François Steinmetz dan Didier Ramon "Produk pewarna laut yang konsisten Sentinel-2 MSI dan Sentinel-3 OLCI menggunakan POLIMER", Proc. SPIE 10778, Penginderaan Jauh Laut Terbuka dan Pesisir serta Perairan Darat, 107780E (30 Oktober 2018); https://doi.org/10.1117/12.2500232