太陽の輝きで汚染された海洋色観測の大気補正
フランソワ・スタインメッツ
ピエール=イヴ・デシャン
ディディエ・ラモン
ヒジオス
これは、Polymer 大気補正アルゴリズムの Python/cython 実装です。 http://www.opticsinfobase.org/oe/abstract.cfm?uri=oe-19-10-9783
ポリマーはPython3で書かれています。必要な依存関係をすべてインストールするには、anaconda を使用することを強くお勧めします。 miniconda版で十分です。ファイルenvironment.yml
使用して、現在のanaconda環境または新しいanaconda環境に依存関係をインストールできます。
Polymer 依存関係を使用して新しい anaconda 環境 (独立した Python インストール) を作成するには:
conda create -n polymer -c conda-forge mamba conda activate polymer mamba env update -f environment.yml
補助データは次のコマンドでダウンロードできます。
$ make auxdata_all
pyx ファイルは cython ファイルであり、C に変換してからコンパイルする必要があります。 Makefile が提供されるので、次のように入力するだけです。
$ make
注: make all
コマンドは補助ファイルをダウンロードし、コンパイルに進みます。
最小限のコマンドラインインターフェイスpolymer_cli.py
があります。
./polymer_cli.py <level1> <level2>
ここで、 はサポートされているセンサーのレベル 1 ファイルまたはディレクトリであり、 は生成される結果です。
詳細については、 ./polymer_cli.py -h
を参照してください。
独自の 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', <その他のオプションのレベル 1 引数>), Level2('output.nc', <その他のオプションのレベル 2 引数>), <オプションのポリマー引数>)
詳細については、 example.py
参照してください...
マルチプロセッシング
オプションの 1 つはmultiprocessing
で、Polymer の処理に使用できるスレッドの数を制御します (デフォルトでは、multiprocessing は無効になっています)。 CPU 上のコアと同じ数のスレッドで処理をアクティブにするには、値-1
を渡します。
run_atm_corr(..., multiprocessing=-1)
このオプションは、コアの Polymer 処理の並列化を制御します。ただし、Polymer は並列処理も使用できる numpy に依存しているため、複数のコアが適度に使用されます。 numpy マルチプロセッシングも無効にするには、環境変数OMP_NUM_THREADS=1
を渡すことができます (または threadpoolctl ライブラリを使用します)。
NASA の補助データにアクセスするための資格情報は、~/.netrc ファイルに指定する必要があります。
cd ~ touch .netrc echo "machine urs.earthdata.nasa.gov login uid_goes_here password password_goes_here" > .netrc chmod 0600 .netrc
詳細はこちら: https://urs.earthdata.nasa.gov/documentation/for_users/data_access/curl_and_wget
補助データ (オゾン合計列、風速、表面圧力) は、クラス Ancillary_NASA (HDF4 形式の NASA ファイル) を通じてレベル 1 クラスに提供できます。
frompolymer.ancillary import Ancillary_NASA Level1(<ファイル名>, ancillary=Ancillary_NASA())
注: Ancillary_NASA
クラスには、 ANCILLARY/METEO/
フォルダー内の利用可能な最も近いデータセットを自動的にダウンロードして選択するデフォルト オプションがあります。
このフォルダーは、コマンドmake ancillary
またはmake all
で初期化されます。
オプションのパラメータの詳細については、 Ancillary_NASA
のヘルプを参照してください。
オプションで、ECMWF のグローバル再分析 ERA-Interim によって補助データ (オゾン総カラム、風速、表面圧力) を提供できます。
https://www.ecmwf.int/en/forecasts/datasets/reanalysis-datasets/era-interim を参照してください。
Polymer と ERA-Interim のインターフェースには、次の Python モジュールが必要です。 * ecmwf Python API クライアント (ERA-Interim ファイルをオンザフライでダウンロードするため) ECMWF キーが必要です。 grib 形式で ERA-Interim ファイルを読み取るには、https://software.ecmwf.int/wiki/display/WEBAPI/Access+ECMWF+Public+Datasets * pygrib を参照してください。
ERA-Interim補助データは、Ancillary_ERAクラスをLevel1のパラメータ補助に渡すことによって使用されます。
frompolymer.ancillary_era import Ancillary_ERA Level1(<ファイル名>, ancillary=Ancillary_ERA())
デフォルトでは、時間的に最も近いデータが自動的に使用され、必要に応じてその場でダウンロードされます。詳細については、Ancillary_ERA の docstring を参照してください。
補助データは、ECMWF の ERA5 データセットからも提供できます: https://www.ecmwf.int/en/forecasts/datasets/reanalysis-datasets/era5
次の Python モジュールが必要です。
cdサピ。 CDS API キーが必要です。詳細については、https://cds.climate.copernicus.eu/api-how-to を参照してください。
Xアレイ
frompolymer.ancillary_era5 import Ancillary_ERA5 Level1(<ファイル名>, ancillary=Ancillary_ERA5())
このセクションでは、サポートされているファイル形式とセンサーに関する情報を提供します。
注: クラスLevel1
( from polymer.level1 import Level1
) はファイル形式を自動検出し、適切な特定のレベル 1 オブジェクト (Level1_MERIS、Level1_OLCI など) を返します。
FF (縮小解像度) と FR (フル解像度) の両方がサポートされています。
例:
frompolymer.level1_meris import Level1_MERISLevel1_MERIS('MER_RR__1PRACR20050501_092849_000026372036_00480_16566_0000.N1') # オプションの引数: sline、eline、ancillary
RRとFRの両方がサポートされています。 Level1 製品の名前はディレクトリの名前です。
例:
ポリマーから.level1_olci import Level1_OLCILevel1_OLCI('S3A_OL_1_EFR____20170123T102747_20170123T103047_20170124T155459_0179_013_279_2160_LN1_O_NT_002.SEN3') # オプションの引数: sline、eline、scol、ecol、ancillary
MODIS、SeaWiFS、および VIIRS は入力として Level1C ファイルを必要とします。詳細については、レベル 1C ファイルに関する次のセクションを参照してください。
例:
frompolymer.level1_nasa import *Level1_MODIS('A2010120124000.L1C')Level1_SeaWiFS('S2000116121145.L1C')Level1_VIIRS('V2013339115400.L1C') # オプションの引数: sline、eline、scol、ecol、補助的な
レベル 1 プロダクトの名前は、グラニュール (「GRANULE/」ディレクトリ内) へのパスを指します。
例:
ポリマー.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') # オプションの引数: sline、eline、ancillary
Polymer は、level1 クラス Level1_ASCII を介して複数のセンサーからの ASCII (CSV) データ入力をサポートします。
Level1_NETCDF を使用すると、特にサブセット化に使用する場合、SNAP によって書き込まれた netCDF4 形式の MERIS、OLCI、または Sentinel2 製品を読み取ることができます。
NASA OBPG L1A および L1B には、必要なすべての放射補正が含まれているわけではありません。したがって、TOA 反射率を「Level1C」プロダクトと呼ぶものに書き込むには、カスタム オプションを使用してl2gen
適用する必要があります。
通常、コマンドラインは次のようになります。
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"
tools/make_L1C.py
を参照してください。これは、レベル 1c プロダクトを生成するためのヘルパー スクリプトです。
出力ファイルの形式は、hdf4 または netcdf です。これらには、水の反射率 (無次元、太陽と天底のセンサーに対して完全に正規化されたもの) およびその他の自明のパラメーターが含まれています。
ポリマー フラグは次のとおりです。
--------------------------------------------------------------------------------- | 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 | --------------------------------------------------------------------------------|
出力ピクセルの推奨フラグ設定は次のとおりです (「&」はビット単位の AND 演算子を表します)。
------------------------------------------------------------------------------ | 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 | -----------------------------------------------------------------------------|
注: IdePix (https://github.com/bcdev/snap-idepix) を使用した追加のクラウド マスキングをお勧めします。
このソフトウェアは、LICENCE.TXT ファイルで入手可能な Polymer ライセンス v2.0 に基づいて利用できます。
科学論文やレポートなどで Polymer の使用を認める場合は、次の参考文献を引用してください。
François Steinmetz、Pierre-Yves Deschamps、および Didier Ramon、「太陽の輝きがある場合の大気補正: MERIS への応用」、Opt. Express 19、9783-9800 (2011)、http://dx.doi.org/10.1364/OE.19.009783
François Steinmetz および Didier Ramon「ポリマーを使用した Sentinel-2 MSI および Sentinel-3 OLCI の一貫した海洋色製品」、Proc. SPIE 10778、外洋および沿岸海洋および内陸水域のリモートセンシング、107780E (2018 年 10 月 30 日); https://doi.org/10.1117/12.2500232