การแก้ไขบรรยากาศของการสังเกตสีของมหาสมุทรที่ปนเปื้อนจากแสงแดด-แวววาว
ฟรองซัวส์ ชไตน์เมตซ์
ปิแอร์-อีฟส์ เดชองส์
ดิดิเยร์ รามอน
ไฮจีออส
นี่คือการใช้ python/cython ของอัลกอริธึมการแก้ไขบรรยากาศของโพลีเมอร์ http://www.opticsinfobase.org/oe/abstract.cfm?uri=oe-19-10-9783
โพลีเมอร์เขียนด้วย python3 ขอแนะนำอย่างยิ่งให้ใช้อนาคอนดาเพื่อติดตั้งการขึ้นต่อกันที่จำเป็นทั้งหมด เวอร์ชันมินิคอนดาก็เพียงพอแล้ว ไฟล์ environment.yml
สามารถใช้เพื่อติดตั้งการขึ้นต่อกัน ไม่ว่าจะในสภาพแวดล้อมแบบอนาคอนดาปัจจุบันของคุณหรือในสภาพแวดล้อมใหม่
หากต้องการสร้างสภาพแวดล้อมอนาคอนดาใหม่ (การติดตั้งหลามอิสระ) ด้วยการพึ่งพาโพลีเมอร์:
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 ของคุณเอง
จาก polymer.main นำเข้า run_atm_corrจากการนำเข้า polymer.level1 ระดับ 1 จากการนำเข้า polymer.level2 Level2run_atm_corr(Level1('MER_RR__1PRACR20050501_092849_000026372036_00480_16566_0000.N1', <ข้อโต้แย้งระดับ 1 ทางเลือกอื่นๆ>), Level2('output.nc', <อาร์กิวเมนต์เพิ่มเติมระดับ 2 อื่นๆ>), <อาร์กิวเมนต์โพลีเมอร์เผื่อเลือก>)
ดู example.py
สำหรับรายละเอียดเพิ่มเติม...
การประมวลผลหลายตัว
ทางเลือกหนึ่งคือ multiprocessing
ซึ่งควบคุมจำนวนเธรดที่พร้อมใช้งานสำหรับการประมวลผลโพลีเมอร์ (โดยค่าเริ่มต้น การประมวลผลหลายตัวจะถูกปิดใช้งาน) หากต้องการเปิดใช้งานการประมวลผลบนเธรดมากเท่าที่มีคอร์บน CPU ให้ส่งค่า -1
:
run_atm_corr(..., multiprocessing=-1)
ตัวเลือกนี้ควบคุมการขนานของการประมวลผลโพลีเมอร์หลัก อย่างไรก็ตาม โพลีเมอร์อาศัยตัวเลข ซึ่งสามารถใช้การประมวลผลแบบขนานได้เช่นกัน และส่งผลให้มีการใช้งานหลายคอร์ในระดับปานกลาง หากต้องการปิดใช้งานการประมวลผลหลายตัวจำนวนมาก คุณสามารถส่งตัวแปรสภาพแวดล้อม 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
ข้อมูลเสริม (คอลัมน์รวมโอโซน ความเร็วลม ความดันพื้นผิว) สามารถจัดเตรียมให้กับคลาสระดับ 1 ผ่านทางคลาส Ancillary_NASA (ไฟล์ NASA ในรูปแบบ hdf4):
จาก polymer.ancillary นำเข้า Ancillary_NASA Level1(<ชื่อไฟล์>, ancillary=Ancillary_NASA())
หมายเหตุ : คลาส Ancillary_NASA
มีตัวเลือกเริ่มต้นในการดาวน์โหลดและเลือกชุดข้อมูลที่ใกล้เคียงที่สุดโดยอัตโนมัติในโฟลเดอร์ ANCILLARY/METEO/
โฟลเดอร์นี้เริ่มต้นได้ด้วยคำสั่ง make ancillary
หรือ make all
.
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับพารามิเตอร์เสริม โปรดดูความช่วยเหลือจาก Ancillary_NASA
คุณสามารถเลือกให้ข้อมูลเสริม (คอลัมน์รวมของโอโซน ความเร็วลม ความดันพื้นผิว) ได้โดยการวิเคราะห์ซ้ำทั่วโลกของ ERA-Interim ของ ECMWF
ดู https://www.ecmwf.int/en/forecasts/datasets/reanalysis-datasets/era-interim
โมดูล python ต่อไปนี้จำเป็นต่อการเชื่อมต่อ Polymer กับ ERA-Interim: * ไคลเอ็นต์ ecmwf python api (เพื่อดาวน์โหลดไฟล์ ERA-Interim ได้ทันที) จำเป็นต้องใช้คีย์ ECMWF ดู https://software.ecmwf.int/wiki/display/WEBAPI/Access+ECMWF+Public+Datasets * pygrib เพื่ออ่านไฟล์ ERA-Interim ในรูปแบบ grib
ข้อมูลเสริมระหว่างกาลของ ERA-ERA ถูกใช้โดยการส่งคลาส Ancillary_ERA ไปยังพารามิเตอร์เสริมของระดับ 1
จากการนำเข้า polymer.ancillary_era Ancillary_ERA Level1(<ชื่อไฟล์>, ancillary=Ancillary_ERA())
ตามค่าเริ่มต้น ข้อมูลที่ใกล้เคียงที่สุดจะถูกใช้โดยอัตโนมัติ และดาวน์โหลดได้ทันทีหากจำเป็น สำหรับข้อมูลเพิ่มเติม โปรดดูที่เอกสารของ Ancillary_ERA
ข้อมูลเสริมสามารถจัดหาได้จากชุดข้อมูล ERA5 ของ ECMWF: https://www.ecmwf.int/en/forecasts/datasets/reanalysis-datasets/era5
จำเป็นต้องมีโมดูลหลามต่อไปนี้:
ซีดีซาปิ จำเป็นต้องมีคีย์ CDS API โปรดดู https://cds.climate.copernicus.eu/api-how-to สำหรับรายละเอียดเพิ่มเติม
เอ็กซ์เรย์
จาก polymer.ancillary_era5 นำเข้า Ancillary_ERA5 Level1(<ชื่อไฟล์>, ancillary=Ancillary_ERA5())
ส่วนนี้ให้ข้อมูลเกี่ยวกับรูปแบบไฟล์และเซ็นเซอร์ที่รองรับ
หมายเหตุ : คลาส Level1
( from polymer.level1 import Level1
) จะตรวจจับรูปแบบไฟล์โดยอัตโนมัติและส่งคืนออบเจ็กต์ระดับ 1 เฉพาะที่เหมาะสม (Level1_MERIS, Level1_OLCI ฯลฯ)
รองรับทั้ง FF (ลดความละเอียด) และ FR (ความละเอียดเต็ม)
ตัวอย่าง:
จาก polymer.level1_meris นำเข้า Level1_MERISLevel1_MERIS('MER_RR__1PRACR20050501_092849_000026372036_00480_16566_0000.N1') # อาร์กิวเมนต์เสริม: sline, eline, ancillary
รองรับทั้ง RR และ FR ชื่อของผลิตภัณฑ์ Level1 คือชื่อของไดเร็กทอรี
ตัวอย่าง:
จาก polymer.level1_olci นำเข้า Level1_OLCILevel1_OLCI('S3A_OL_1_EFR____20170123T102747_20170123T103047_20170124T155459_0179_013_279_2160_LN1_O_NT_002.SEN3') # อาร์กิวเมนต์เสริม: sline, eline, scol, ecol, เสริม
MODIS, SeaWiFS และ VIIRS ต้องใช้ไฟล์ Level1C เป็นอินพุต ดูส่วนถัดไปเกี่ยวกับไฟล์ระดับ 1C สำหรับข้อมูลเพิ่มเติม
ตัวอย่าง:
จากการนำเข้า polymer.level1_nasa *Level1_MODIS('A2010120124000.L1C')Level1_SeaWiFS('S2000116121145.L1C')Level1_VIIRS('V2013339115400.L1C') # อาร์กิวเมนต์ทางเลือก: sline, eline, scol, ecol, อุปกรณ์เสริม
ชื่อของผลิตภัณฑ์ระดับ 1 อ้างอิงถึงพาธไปยังแกรนูล (ในไดเร็กทอรี "GRANULE/")
ตัวอย่าง:
จากการนำเข้า polymer.level1_msi ระดับ1_MSIระดับ1_MSI('S2A_OPER_PRD_MSIL1C_PDMC_20160504T225644_R094_V20160504T105917_2016 0504T105917.ปลอดภัย/เม็ด/S2A_OPER_MSI_L1C_TL_SGS__20160504T163055_A004524_T30TXR_N02.02') # อาร์กิวเมนต์เสริม: sline, eline, ancillary
โพลีเมอร์รองรับอินพุตข้อมูล ASCII (CSV) จากเซ็นเซอร์หลายตัวผ่านคลาส Level1 Level1_ASCII
Level1_NETCDF สามารถใช้เพื่ออ่านผลิตภัณฑ์ MERIS, OLCI หรือ Sentinel2 ในรูปแบบ netCDF4 ที่เขียนโดย SNAP โดยเฉพาะเมื่อใช้สำหรับการตั้งค่าย่อย
NASA OBPG L1A และ L1B ไม่ได้รวมการแก้ไขเรดิโอเมตริกที่จำเป็นทั้งหมด ดังนั้นจึงจำเป็นต้องใช้ l2gen
กับตัวเลือกที่กำหนดเองเพื่อเขียนการสะท้อน TOA ลงในสิ่งที่เราเรียกว่าผลิตภัณฑ์ "Level1C"
โดยทั่วไปบรรทัดคำสั่งจะเป็น:
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)
ซอฟต์แวร์นี้มีให้ใช้งานภายใต้ลิขสิทธิ์โพลิเมอร์ v2.0 ซึ่งมีอยู่ในไฟล์ LICENCE.TXT
เมื่อรับทราบถึงการใช้โพลีเมอร์ในเอกสารทางวิทยาศาสตร์ รายงาน ฯลฯ โปรดอ้างอิงข้อมูลอ้างอิงต่อไปนี้:
François Steinmetz, Pierre-Yves Deschamps และ Didier Ramon, "การแก้ไขบรรยากาศเมื่อมีแสงตะวัน: ใช้กับ MERIS", ตัวเลือก ด่วน 19, 9783-9800 (2011), http://dx.doi.org/10.1364/OE.19.009783
François Steinmetz และ Didier Ramon "ผลิตภัณฑ์สีน้ำทะเลที่สอดคล้องกัน Sentinel-2 MSI และ Sentinel-3 OLCI โดยใช้ POLYMER", Proc. SPIE 10778, การสำรวจระยะไกลของมหาสมุทรเปิดและชายฝั่งและน่านน้ำภายในประเทศ, 107780E (30 ตุลาคม 2018); https://doi.org/10.1117/12.2500232