태양광선으로 오염된 해양 색상 관측의 대기 보정
프랑수아 스타인메츠
피에르 이브 데샹
디디에 라몬
히게오스
이것은 Polymer 대기 보정 알고리즘의 python/cython 구현입니다. http://www.opticsinfobase.org/oe/abstract.cfm?uri=oe-19-10-9783
폴리머는 Python3으로 작성되었습니다. 필요한 모든 종속성을 설치하려면 아나콘다를 사용하는 것이 좋습니다. miniconda 버전이면 충분합니다. 현재 아나콘다 환경이나 새 환경에 종속성을 설치하는 데 파일 environment.yml
사용할 수 있습니다.
폴리머 종속성을 사용하여 새 아나콘다 환경(독립 Python 설치)을 생성하려면:
conda create -n polymer -c conda-forge mamba conda activate polymer mamba env update -f environment.yml
보조 데이터는 다음 명령을 사용하여 다운로드할 수 있습니다.
$ make auxdata_all
pyx 파일은 C로 변환한 후 컴파일해야 하는 cython 파일입니다. makefile이 제공되므로 다음을 입력하십시오.
$ make
참고: make all
명령은 보조 파일을 다운로드하고 컴파일을 진행합니다.
최소한의 명령줄 인터페이스인 polymer_cli.py
가 있습니다.
./polymer_cli.py <level1> <level2>
지원되는 센서에 대한 level1 파일 또는 디렉터리는 어디에 있으며 생성될 결과는 무엇입니까?
자세한 도움말은 ./polymer_cli.py -h
참조하세요.
자신의 Python 스크립트에서 직접 폴리머를 실행하면 더 많은 옵션을 사용할 수 있습니다.
frompolymer.main import run_atm_corrfrompolymer.level1 import Level1frompolymer.level2 import Level2run_atm_corr(레벨1('MER_RR__1PRACR20050501_092849_000026372036_00480_16566_0000.N1', <기타 선택적 레벨1 인수>), Level2('output.nc', <기타 선택적 level2 인수>), <선택적 폴리머 인수>)
자세한 내용은 example.py
참조하세요...
다중 처리
한 가지 옵션은 폴리머 처리에 사용할 수 있는 스레드 수를 제어하는 multiprocessing
입니다(기본적으로 멀티프로세싱은 비활성화되어 있음). CPU에 있는 코어 수만큼 스레드에서 처리를 활성화하려면 -1
값을 전달합니다.
run_atm_corr(..., multiprocessing=-1)
이 옵션은 핵심 폴리머 처리의 병렬화를 제어합니다. 그러나 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 파일)를 통해 level1 클래스에 제공될 수 있습니다.
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/reanalytic-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/reanalytic-datasets/era5)에서도 제공될 수 있습니다.
다음 Python 모듈이 필요합니다.
cdsapi. CDS API 키가 필요합니다. 자세한 내용은 https://cds.climate.copernicus.eu/api-how-to를 참조하세요.
엑스레이
frompolymer.ancillary_era5 import Ancillary_ERA5 Level1(<파일 이름>, ancillary=Ancillary_ERA5())
이 섹션에서는 지원되는 파일 형식 및 센서에 대한 정보를 제공합니다.
참고 : Level1
클래스( from polymer.level1 import Level1
)는 파일 형식을 자동 감지하고 적절한 특정 level1 개체(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 제품의 이름은 디렉터리의 이름입니다.
예:
frompolymer.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, ancillary
level1 제품의 이름은 "GRANULE/" 디렉터리에 있는 그래뉼의 경로를 나타냅니다.
예:
Polymer.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"
레벨 1c 제품을 생성하기 위한 도우미 스크립트인 tools/make_L1C.py
를 참조하세요.
출력 파일은 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에 따라 사용할 수 있습니다.
과학 논문, 보고서 등에 폴리머 사용을 인정할 때 다음 참고 자료를 인용하십시오.
François Steinmetz, Pierre-Yves Deschamps 및 Didier Ramon, "태양광이 있을 때 대기 보정: MERIS에 적용", Opt. 익스프레스 19, 9783-9800 (2011), http://dx.doi.org/10.1364/OE.19.009783
François Steinmetz 및 Didier Ramon "POLYMER를 사용한 Sentinel-2 MSI 및 Sentinel-3 OLCI 일관된 바다 색상 제품", Proc. SPIE 10778, 외해 및 연안 해양 및 내륙 수역의 원격 감지, 107780E(2018년 10월 30일); https://doi.org/10.1117/12.2500232