АТМОСФЕРНАЯ КОРРЕКЦИЯ НАБЛЮДЕНИЙ ЗА ЗАГРЯЗНЕННЫМ ЦВЕТОМ ОКЕАНА СОЛНЕЧНЫМИ БЛИНАМИ
Франсуа Стейнмец
Пьер-Ив Дешам
Дидье Рамон
ГИГЕОС
Это реализация алгоритма атмосферной коррекции Polymer на Python/cython. http://www.opticsinfobase.org/oe/abstract.cfm?uri=oe-19-10-9783
Полимер написан на Python3. Настоятельно рекомендуется использовать anaconda для установки всех необходимых зависимостей. Миникондовой версии достаточно. Файл environment.yml
можно использовать для установки зависимостей либо в текущей среде anaconda, либо в новой.
Чтобы создать новую среду anaconda (независимая установка Python) с зависимостями Polymer:
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.
из полимера.main import run_atm_corrfrom полимер.уровень1 импорт уровня1из полимера.уровень2 импорт уровня2run_atm_corr(Level1('MER_RR__1PRACR20050501_092849_000026372036_00480_16566_0000.N1', <другие необязательные аргументы уровня 1>), Level2('output.nc', <другие необязательные аргументы уровня 2>), <необязательные аргументы полимера>)
См. example.py
для более подробной информации...
Многопроцессорность
Один из вариантов — multiprocessing
, который контролирует количество потоков, доступных для обработки Polymer (по умолчанию многопроцессорность отключена). Чтобы активировать обработку на таком количестве потоков, сколько ядер имеется в процессоре, передайте значение -1
:
run_atm_corr(..., multiprocessing=-1)
Эта опция управляет распараллеливанием основной обработки Polymer. Однако Polymer полагается на numpy, который также может использовать параллельную обработку и приводит к умеренному использованию нескольких ядер. Чтобы также отключить многопроцессорность numpy, вы можете передать переменную среды OMP_NUM_THREADS=1
(или использовать библиотеку threadpoolctl)
Учетные данные для доступа к вспомогательным данным НАСА должны быть указаны в вашем файле ~/.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.
Вспомогательные данные (общее содержание озона, скорость ветра, приземное давление) могут быть предоставлены классу level1 через класс Ancillary_NASA (файлы НАСА в формате hdf4):
из полимера.ancillary import Ancillary_NASA Level1(<имя файла>, ancillary=Ancillary_NASA())
ПРИМЕЧАНИЕ . Класс Ancillary_NASA
имеет параметры по умолчанию для автоматической загрузки и выбора ближайшего доступного набора данных в папке ANCILLARY/METEO/
Эта папка инициализируется командой make ancillary
или make all
.
Для получения дополнительной информации о дополнительных параметрах обратитесь к справке Ancillary_NASA
.
При желании вспомогательные данные (общее содержание озона, скорость ветра, приземное давление) могут быть предоставлены с помощью глобального реанализа ERA-Interim ЕЦСПП.
См. https://www.ecmwf.int/en/forecasts/datasets/reanasis-datasets/era-interim.
Для взаимодействия Polymer с ERA-Interim необходимы следующие модули Python: * API-клиент ecmwf python (для оперативной загрузки файлов ERA-Interim). Необходим ключ ECMWF. См. https://software.ecmwf.int/wiki/display/WEBAPI/Access+ECMWF+Public+Datasets * pygrib, чтобы прочитать файлы ERA-Interim в формате Grib.
Вспомогательные данные ERA-Interim используются путем передачи класса Ancillary_ERA вспомогательному параметру Level1.
из полимера.ancillary_era import Ancillary_ERA Level1(<имя файла>, ancillary=Ancillary_ERA())
По умолчанию автоматически используются наиболее близкие по времени данные, которые при необходимости загружаются на лету. Для получения дополнительной информации просмотрите строку документации Ancillary_ERA.
Вспомогательные данные также могут быть предоставлены набором данных ERA5 ЕЦСПП: https://www.ecmwf.int/en/forecasts/datasets/reanasis-datasets/era5.
Требуются следующие модули Python:
cdsapi. Требуется ключ API CDS. Более подробную информацию можно найти на странице https://cds.climate.copernicus.eu/api-how-to.
рентгеновский массив
из полимера.ancillary_era5 import Ancillary_ERA5 Level1(<имя файла>, ancillary=Ancillary_ERA5())
В этом разделе представлена информация о поддерживаемых форматах файлов и датчиках.
ПРИМЕЧАНИЕ . Класс Level1
( from polymer.level1 import Level1
) автоматически определяет формат файла и возвращает соответствующий конкретный объект уровня 1 (Level1_MERIS, Level1_OLCI и т. д.).
Поддерживаются как FF (пониженное разрешение), так и FR (полное разрешение).
Пример:
from полимер.level1_meris import Level1_MERISLevel1_MERIS('MER_RR__1PRACR20050501_092849_000026372036_00480_16566_0000.N1') # необязательные аргументы: sline, eline, вспомогательный
Поддерживаются как 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.
Пример:
from полимер.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, вспомогательный
Polymer поддерживает ввод данных в формате ASCII (CSV) от нескольких датчиков через класс уровня 1 Level1_ASCII.
Level1_NETCDF можно использовать для чтения продуктов MERIS, OLCI или Sentinel2 в формате netCDF4, написанном SNAP, в частности, когда он используется для подмножества.
НАСА 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. Они содержат коэффициент отражения воды (безразмерный, полностью нормированный для Солнца и датчика в надире) и другие параметры, которые не требуют пояснений.
Флаги Polymer следующие:
--------------------------------------------------------------------------------- | 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 | --------------------------------------------------------------------------------|
Рекомендуемая пометка выходных пикселей следующая (& означает побитовый оператор И):
------------------------------------------------------------------------------ | 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).
Это программное обеспечение доступно по лицензии Polymer v2.0, доступной в файле LICENCE.TXT.
Подтверждая использование Polymer в научных статьях, отчетах и т. д., пожалуйста, укажите следующую ссылку:
Франсуа Штайнмец, Пьер-Ив Дешам и Дидье Рамон, «Атмосферная поправка при наличии солнечного блика: применение к MERIS», Opt. Экспресс 19, 9783-9800 (2011), http://dx.doi.org/10.1364/OE.19.009783
Франсуа Штайнмец и Дидье Рамон «Продукты Sentinel-2 MSI и Sentinel-3 OLCI, обеспечивающие согласованный цвет океана с использованием ПОЛИМЕРА», Proc. SPIE 10778, Дистанционное зондирование открытого и прибрежного океана и внутренних вод, 107780E (30 октября 2018 г.); https://doi.org/10.1117/12.2500232