Как обрабатывать спутниковые снимки с помощью Sen2Cor

  • Tutorial
Sen2Cor — программа для обработки снимков, сделанных со спутника Sentinel-2. В статье рассказывается, как установить, запустить и настроить её.

Спутниковый снимок до и после обработки с помощью Sen2Cor

В магистратуре мне понадобилось сделать атмосферную коррекцию снимков со спутника Sentinel-2. Магистратура по экологии, поэтому можно было не углубляться в физику и математику, а использовать готовый инструмент. Такой инструмент нашёлся — Sen2Cor.

Что такое Sentinel-2
Sentinel-2 — пара спутников, запущенных Европейским космическим агентством (ESA) в 2015 году. Снимают в 13 диапазонах, пролетают над одним и тем же местом примерно раз в неделю. Область съёмки — все континенты, прибрежные зоны и внутренние моря. Каждый снимок охватывает территорию 100 на 100 километров. Максимальное пространственное разрешение — 10 метров на пиксель. Снимки распространяются бесплатно — их можно скачать после регистрации через Copernicus Open Access Hub или USGS Earth Explorer.

Проблема в том, что понятной инструкции для Sen2Cor нет. Авторы учебников по геоинформатике не лезут в такие дебри, как работа с конкретными программами, а авторы научных статей, напротив, полагают, что коррекция снимков — слишком простая часть методики, поэтому не описывают её подробно. На сайтах «для чайников» (и не совсем для чайников) о Sen2Cor тоже не пишут. Официальная документация запутанная: достаточно сказать, что раздел «Установка» на 26-й странице «Руководства пользователя» сразу отсылает к 60-й странице Release Notes. Чтобы разобраться, мне потребовалось время.

Я решил написать понятное руководство по установке, запуску и настройке Sen2Cor. Руководство ориентировано на биологов, экологов, специалистов по сельскому хозяйству и всех тех, кому может понадобиться обработка спутниковых снимков, но для кого она не является основной задачей. По сути, я делюсь собственным опытом. Абсолютную правильность и полноту не гарантирую. Специалисты по геоинформатике, думаю, сами мне что-то посоветуют.

Строго говоря, Sen2Cor делает не только атмосферную коррекцию, но и поправку на угол восхождения Солнца и рельеф местности, а также тематическую классификацию (scene classification), но для меня важнее всего была атмосферная коррекция. Поэтому для простоты я иногда вместо «обработка» пишу «атмосферная коррекция», хотя это неточно.

Sen2Cor работает в трёх режимах: как отдельное консольное приложение, как плагин в составе Sentinel-2 Toolbox и как консольное приложение, используемое в PDGS (Payload Data Ground Segment). PDGS — это наземный центр обработки данных, получаемых со спутников. Находится он в Италии в исследовательском институте. Теоретически можно запустить Sen2Cor в том же режиме, в котором его запускают в центре обработки данных, но для запуска понадобятся данные, которые просто так в интернете не скачать, поэтому мы данный вариант рассматривать не будем. Sentinel-2 Tolobox тоже обойдём стороной, потому что с этой программой я не работал. Она с графическим интерфейсом, поэтому полагаю, что разобраться в её работе несложно. Итак, в данной статье описано, как использовать Sen2Cor в режиме консольной программы.

Sen2Cor работает в 64-битных Windows, MacOS и Linux. У меня Linux, поэтому команды буду показывать на примере Linux. Впрочем, разница только в установщиках и в путях к файлам.

Sen2Cor требует 4 Гб оперативной памяти. Если меньше, то он запустится, но может аварийно завершиться на середине обработки. Расход оперативной памяти зависит от разрешения производимых снимков, поэтому если памяти мало и программа из-за этого выдаёт ошибку, то можно запустить обработку с меньшим разрешением. О том, как это сделать, написано далее. Аналогичных жёстких требований к процессору нет, но чем слабее процессор, тем больше времени займёт обработка.

Установка


Нужно скачать установщик и запустить его. Sen2Cor написан на Python, однако, интерпретатор и все необходимые пакеты находятся в установщике, поэтому самому устанавливать Python и настраивать окружение не нужно.

Предположим, что у нас есть пользователь user с домашним каталогом /home/user. Создадим в домашнем каталоге папку spaceshots, в которой будем работать со снимками. Полный путь к папке будет /home/user/spaceshots.

Далее загрузим и запустим установщик. Открываем страницу Sen2Cor на сайте инструментов Европейского космического агентства. Есть две версии программы: 2.5.5 и 2.8. Лучше устанавливать 2.8: она расходует меньше оперативной памяти и содержит меньше ошибок. Версия 2.5.5 может понадобиться, если нужно обработать снимки, сделанные по старым спецификациям. Нажмем на «Sen2Cor v2.8». В конце страницы в пункте «Standalone Installers» находятся ссылки для скачивания установщиков. Загружаем тот, который подходит для нашей операционной системы. В данном случае это «Linux installer: Sen2Cor-02.08.00-Linux64.run». Сохраняем файл в /home/user/spaceshots.

Далее открываем консоль, перемещаемся в каталог spaceshots и запускаем установщик.

$ cd ~/spaceshots
$ ./Sen2Cor-02.08.00-Linux64.run

По умолчанию программа устанавливается в текущий каталог. В нём создаётся папка Sen2Cor-02.08.00-Linux64, куда извлекаются все файлы программы. По большому счёту установка сводится к распаковке архива. Кроме того, в домашнем каталоге создаётся папка для конфигурационных файлов и логов: /home/user/sen2cor/2.8.

Если ошибок нет, то в консоли должна появиться надпись «Congratulations, Installation successful...» и предложение протестировать установку. Сделаем тестовый запуск:

$ /home/user/spaceshots/Sen2Cor-02.08.00-Linux64/bin/L2A_Process -h 

В этой команде /home/user/spaceshots/Sen2Cor-02.08.00-Linux64 — каталог, куда установился Sen2Cor. В папке bin находятся основные запускаемые файлы программы, в том числе главный файл L2A_Process. Опция -h говорит, что нужно показать справочную страницу. В результате выполнения команды в консоли должно появиться примерно следующее:

usage: L2A_Process.py [-h] [--mode MODE] [--resolution {10,20,60}]
                      [--datastrip DATASTRIP] [--tile TILE]
                      [--output_dir OUTPUT_DIR] [--work_dir WORK_DIR]
                      [--img_database_dir IMG_DATABASE_DIR]
                      [--res_database_dir RES_DATABASE_DIR]
                      [--processing_centre PROCESSING_CENTRE]
                      [--archiving_centre ARCHIVING_CENTRE]
                      [--processing_baseline PROCESSING_BASELINE] [--raw]
                      [--tif] [--sc_only] [--cr_only] [--debug]
                      [--GIP_L2A GIP_L2A] [--GIP_L2A_SC GIP_L2A_SC]
                      [--GIP_L2A_AC GIP_L2A_AC] [--GIP_L2A_PB GIP_L2A_PB]
                      input_dir

Sentinel-2 Level 2A Processor (Sen2Cor). Version: 2.8.0, created: 2019.02.20,
supporting Level-1C product version 14.2 - 14.5.

…

Если появилось, то установка прошла нормально и программа готова к использованию. Единственное, что ещё не помешает сделать — упростить запуск программы. Пока что нужно указывать полный путь к основному файлу: /home/user/spaceshots/Sen2Cor-02.08.00-Linux64/bin/L2A_Process. Это неудобно. Гораздо проще писать просто L2A_Process. Однако если сделать так прямо сейчас, то появится ошибка:

$ L2A_Process
bash: L2A_Process: команда не найдена

Чтобы исправить ошибку и запускать Sen2Cor по команде L2A_Process, нужно добавить одну команду в файл .bashrc, который находится в домашнем каталоге (в нашем случае — по адресу /home/user/.bashrc). Это скрытый файл, поэтому перед тем как открыть его, нужно включить в файловом менеджере показ скрытых файлов.

В конец файла .bashrc добавим следующие строки:

# Sen2Cor processor (v. 2.8.0)
source /home/user/spaceshots/Sen2Cor-02.08.00-Linux64/L2A_Bashrc

Первая строка — комментарий, чтобы помнить, зачем нужна вторая. Вторая строка при каждом запуске системы выполняет скрипт, содержащийся в файле L2A_Bashrc. Этот скрипт меняет некоторые переменные окружения так, что команда L2A_Process становится доступна отовсюду, и указывать полный путь к ней не нужно.

Чтобы изменения в .bashrc вступили в силу, нужно вернуться в консоль и выполнить команду

$ source ~/.bashrc

Ещё можно изменить место, куда будет установлена программа. Для этого нужно при запуске установщика указать опцию --target. Например, команда

# ./Sen2Cor-02.08.00-Linux64.run --target /usr/share/sen2cor

установит Sen2Cor в /usr/share/sen2cor. Мы запускаем команду от суперпользователя, потому что обычный пользователь, как правило, не может записывать файлы в /usr. Правда, в таком случае придётся потом запускать Sen2Cor с правами суперпользователя или менять права доступа к /usr/share/sen2cor.

Как установить в MacOS и Windows
В MacOS программа устанавливается так же, как в Linux.

В Windows установщик — это zip-архив, который нужно распаковать. При запуске вместо L2A_Process указывается L2A_Process.bat, и он находится не в папке bin, а сразу в той папке, в которую установлена программа:

C:\Users\user\spaceshots\Sen2Cor-02.08.00-Linux64/L2A_Process.bat -h

Папка с конфигурацией и логами в Windows тоже будет находиться в домашнем каталоге пользователя: С:\Users\user\sen2cor\2.8. Она создаётся при первом запуске программы.

Чтобы не указывать полный путь к запускаемому файлу, а писать просто L2A_Process.bat, в Windows нужно добавить путь к файлу L2A_Bashrc.bat в PATH.

Обработка снимка


Итак, мы установили Sen2Cor и сделали так, что он запускается по команде L2A_Process. Теперь сделаем атмосферную коррекцию. Предположим, что спутниковый снимок мы уже скачали и распаковали в /home/user/spaceshots. Я взял снимок местности к западу от Екатеринбурга, сделанный 27 июля 2018 года. Файл со снимком называется L1C_T40VFJ_A016162_20180727T071939.zip. После распаковки появилась папка S2A_MSIL1C_20180727T071621_N0206_R006_T40VFJ_20180727T092607.SAFE. Тогда для атмосферной коррекции нужно выполнить такую команду:

$ L2A_Process S2A_MSIL1C_20180727T071621_N0206_R006_T40VFJ_20180727T092607.SAFE/

После нажатия на Enter можно отдохнуть, потому что обработка занимает довольно много времени (на Яндекс.Облаке с Intel Cascade Lake и гарантированной долей 5% CPU — около часа). Sen2Cor выводит в консоль информацию о ходе работы, так что вы будете примерно понимать, что в данный момент делает программа.

Начало лога в консоли
Sentinel-2 Level 2A Processor (Sen2Cor). Version: 2.8.0, created: 2019.02.20, supporting Level-1C product version 14.2 - 14.5 started ...
Product version: 14.5
Operation mode: TOOLBOX
Processing baseline: 99.99
Progress[%]:  0.00 : Generating datastrip metadata
L1C datastrip found, L2A datastrip successfully generated
Selected resolution: 60 m
Progress[%]: 1.13 : PID-4202, L2A_ProcessTile: processing with resolution 60 m, elapsed time[s]: 2.299, total: 0:00:10.789933
Progress[%]: 1.13 : PID-4202, L2A_ProcessTile: start of pre processing, elapsed time[s]: 0.000, total: 0:00:10.790432
Progress[%]: 1.27 : PID-4202, L2A_Tables: start import, elapsed time[s]: 0.278, total: 0:00:11.068694
Progress[%]: 1.69 : PID-4202, L2A_Tables: band B01 imported, elapsed time[s]: 0.851, total: 0:00:11.919562
Progress[%]: 9.39 : PID-4202, L2A_Tables: band B02 imported, elapsed time[s]: 15.618, total: 0:00:27.537532
Progress[%]: 17.16 : PID-4202, L2A_Tables: band B03 imported, elapsed time[s]: 15.743, total: 0:00:43.280800
…


Когда программа завершит работу, в /home/user/spaceshots рядом с S2A_MSIL1C_20180727T071621_N0206_R006_T40VFJ_20180727T092607.SAFE/ должна появиться ещё одна папка с очень похожим названием — S2A_MSIL2A_20180727T071621_N9999_R006_T40VFJ_20200507T083341.SAFE

Теперь разберёмся, что делает программа и что за папку мы получили. Для этого нужно рассмотреть структуру снимков Sentinel-2.

Снимок со спутника Sentinel-2 — это zip-архив размером в несколько сотен мегабайт. В нашем случае архив называется L1C_T40VFJ_A016162_20180727T071939.zip. В названии закодирована информация: уровень обработки (L1C), код, обозначающий территорию (T40VFJ), номер орбиты (A016162), дата и время съёмки. Внутри этого архива есть папка с длинным названием, которое заканчивается на .SAFE. В папке *.SAFE есть папка GRANULE, в ней — ещё одна папка с длинным названием, внутри которой находится папка IMG_DATA, а в ней — 14 изображений в формате jp2. Среди них есть 13 пронумерованных — их названия заканчиваются на B01-B12 (плюс ещё одно с номером B8A). Это тайлы — снимки земной поверхности, сделанные на определённых длинах волн. Например, B04 — это снимок в красном диапазоне, а B08 — в ближнем инфракрасном, и вместе эти два снимка можно использовать для расчёта такого известного индекса, как NDVI. Название 14-го изображения заканчивается на TCI, что означает True Color Image — это полноцветный снимок, то есть примерно такой, какой получился бы на обычный фотоаппарат.

Sen2Cor получает в качестве исходных данных папку *.SAFE — именно она указывается в качестве единственного обязательного параметра при запуске программы. Если вместо папки *.SAFE указать что-то другое, например, исходный архив со снимком или конкретный тайл, то программа не запустится.

$ L2A_Process T40VFJ_20180727T071621_B04.jp2 
Product metadata file cannot be read.

Дело в том, что для атмосферной коррекции используются не только сами тайлы, но и метаданные, а они находятся в файлах внутри папки *.SAFE, а не в тайлах.

Результатом работы программы также является папка *.SAFE с похожей структурой: внутри есть папка GRANULE, внутри неё — ещё одна папка, в которой находится папка IMG_DATA, а в ней скорректированные тайлы. Тайлы сгруппированы по пространственному разрешению: в папке R10m находятся те, у которых пространственное разрешение составляет 10 метров, в R20m — те, где разрешение 20 метров, в R60m — 60 метров. При определённых настройках какие-то разрешения не обрабатываются и соответствующие им папки не создаются — об этом чуть ниже.

Название папки *.SAFE, получающейся в результате, отличается от названия исходной только одним: в начале вместо _MSIL1C_ указано _MSIL2A_. L1C и L2A — это коды уровня обработки. Уровень L1C означает, что снимок обработан до уровня Top-of-Atmosphere reflectance, то есть значения пикселей на снимке соответствуют отражению, зафиксированному у верхней границы атмосферы — там, где летает спутник. Уровень L2A — это обработка до уровня Bottom-of-Atmoshpere reflectance, то есть до значений отражения у поверхности Земли — так, как будто атмосфера абсолютно прозрачна. В реальности это, конечно, не так, и атмосферная коррекция позволяет убрать только часть искажений, возникающих при прохождении света через атмосферу, но в целом значения Bottom-of-Atmosphere reflectance больше соответствуют реальному отражению от земной поверхности, чем значения Top-of-Atmosphere reflectance.

Помимо скорректированных тайлов, Sen2Cor производит ещё несколько изображений: полноцветное (TCI), карты аэрозольной оптической плотности атмосферы (AOT — Aerosol Optical Thickness) и содержания водяного пара (WV — Water Vapour), карту тематической классификации типов поверхности (SC — Scene Classification). Они также находятся в папке IMG_DATA в каталогах для соответствующего пространственного разрешения.

Если нужно, чтобы папка с результатом работы программы называлась не *.SAFE, а по-другому, то можно самостоятельно указать название с помощью опции --output_dir. Предположим, что мы запускаем Sen2Cor три раза с разными настройками и хотим сохранить результаты в папки test1, test2 и test3. Тогда указываем --output_dir при запуске:


$ L2A_Process --output_dir /home/user/spaceshots/test1 S2A_MSIL1C_20180727T071621_N0206_R006_T40VFJ_20180727T092607.SAFE

— и скорректированный снимок окажется в каталоге /home/user/spaceshots/test1. При втором и третьем запуске указываем соответственно --output_dir /home/user/spaceshots/test2 и --output_dir /home/user/spaceshots/test3.

Ещё одна полезная опция — это --resolution. Она позволяет установить пространственное разрешение тайлов, которые будут получены в результате работы программы. Sen2Cor может создавать изображения с разным пространственным разрешением — 10, 20 или 60 метров на пиксель. По умолчанию делаются 10 и 20 метров. Предположим, что нам для разведочного анализа достаточно тайлов с разрешением 60 метров на пиксель. Тогда можно указать целевое разрешение с помощью опции --resolution:

$ L2A_Process --resolution 60 S2A_MSIL1C_20180727T071621_N0206_R006_T40VFJ_20180727T092607.SAFE

При запуске с такими параметрами Sen2Cor обработает снимок и создаст скорректированные тайлы с разрешением 60 метров. В отличие от стандартного запуска, обработка занимает намного меньше времени — чуть больше четырёх минут. Расход памяти тоже меньше, поэтому если запуск со стандартным разрешением закончился ошибкой из-за нехватки памяти, то можно указать разрешение 60 метров. В папке IMG_DATA будет находиться только папка R60m, а внутри неё — тайлы с разрешением 60 метров и некоторые другие изображения: полноцветное, тематическая карта и карта содержания водяного пара.

Конфигурационный файл


Мы обработали спутниковый снимок с помощью Sen2Cor, используя настройки по умолчанию. Разрешение и папку для сохранения результатов работы можно поменять с помощью опций --resolution и --output_dir. Есть ещё несколько опций командной строки, однако, с их помощью можно настроить не всё. Есть множество других параметров, важных при обработке, например: учитывать ли рельеф, удалять ли облака, как оценивать состояние атмосферы. В Sen2Cor они настраиваются с помощью конфигурационного файла.

Если запустить Sen2Cor и не указать путь к конфигурационному файлу, как мы делали раньше, то будет использоваться стандартный конфигурационный файл. Стандартным конфигурационный файл находится в домашнем каталоге — в нашем случае в папке /home/user/sen2cor/2.8/cfg. Файл называется L2A_GIPP.xml. L2A означает уровень обработки, GIPP расшифровывается как Ground Image Processing Parameters — параметры наземной обработки изображения. Это обычный xml-файл, внутри которого есть несколько секций, а в секциях — элементы для разных настроек. Для каждой настройки прямо в файле написано пояснение. Кроме того, подробное описание настроек содержится в документации — правда, разобраться в ней непросто.

Можно отредактировать напрямую стандартный конфигурационный файл, но лучше скопировать его и явно указать при запуске программы, что нужно использовать другой конфигурационный файл. Скопируем L2A_GIPP.xml в /home/user/spaceshots, переименуем в custom.xml и запустим программу с этим конфигурационным файлом:

$ L2A_Process --GIP_L2A /home/user/spaceshots/custom.xml --resolution 60 S2A_MSIL1C_20180727T071621_N0206_R006_T40VFJ_20180727T092607.SAFE

Обратите внимание, что опция для конфигурационного файла называется --GIP_L2A — с одной буквой «P». Поскольку мы не редактировали конфигурационный файл, то процесс и результат работы программы ничем не отличаются от запуска с конфигурацией по умолчанию.

В конфигурационном файле много разных параметров. Рассмотрим некоторые из них.

Логи


Log_Level — параметр, который определяет, насколько подробным будет журнал работы программы. Лог отображается в консоли во время работы и дополнительно сохраняется в папке для логов (в нашем случае — /home/user/sen2cor/2.8/log). Значение по умолчанию — INFO. Обычно нет необходимости менять эту настройку, если вы не столкнулись с ошибками в работе программы.

Учёт рельефа и угла восхождения Солнца


DEM_Directory — папка, в которой находится цифровая карта рельефа (DEM — Digital Elevetion Model). Результаты обработки с использованием цифровой карты рельефа обычно получаются более точными. По умолчанию — NONE, то есть рельеф не учитывается. Если у вас есть своя цифровая карта рельефа, то указываете путь к ней. Папка для DEM должна находиться там же, где и папки cfg и log, то есть в нашем случае — в каталоге /home/user/sen2cor/2.8. Следовательно, если у вас есть цифровая карта рельефа, то нужно поместить её в /home/user/sen2cor/2.8/dem и в DEM_Directory указать dem. Если её нет, но все равно хочется использовать, то можно указать любой путь (например, тоже написать dem) и настроить следующий параметр.

DEM_Reference — URL, с которого нужно скачать цифровую модель рельефа, если её нет в папке, указанной в предыдущем пункте. Разработчики Sen2Cor предлагают использовать
http://data_public:GDdci@data.cgiar-csi.org/srtm/tiles/GeoTIFF/
— это ссылка на STRM DEM, свободно распространяемую цифровую карту рельефа с 90-метровым пространственным разрешением. Учитывая, что масштаб ненамного мельче, чем у самих спутниковых снимков, эта модель должна давать хороший результат.

Если Sen2Cor увидит, что в DEM_Directory указано какое-то значение, помимо NONE, то он попытается открыть файлы с картой рельефа из указанного каталога. Если открыть файлы не получится, то он попытается скачать их по URL, указанному в DEM_Reference. Если не получится скачать, то в логе появится сообщение об ошибке и обработка продолжится без учёта рельефа. Файлы, скачанные с URL, сохраняются в DEM_Directory и не удаляются после завершения работы программы. Следовательно, если вы захотите ещё раз обработать тот же снимок с той же картой рельефа (например, изменив другие настройки коррекции), то Sen2Cor не будет повторно скачивать цифровую карту рельефа, а воспользуется её офлайн-копией.

Опция Generate_DEM_Output позволяет получить в результате работы программы отдельный тайл с цифровой картой рельефа. По умолчанию FALSE.

Опция DEM_Terrain_Correction частично отключает использование цифровой карты рельефа: рельеф по-прежнему будет учитываться при тематической классификации (SC) и построении карты AOT, но не при корректировке значений отражения от поверхности.

Если DEM не используется, то следует указать параметр Altitude — это средняя высота над уровнем моря в районе, запечатлённом на снимке. Высота указывается в километрах.

Ещё два параметра, имеющие отношение к учёту рельефа — это BRDF_Correction и BRDF_Lower_Bound. BRDF расшифровывается как bidirectional reflectance distribution function и означает уравнение, моделирующее отражение света от непрозрачной поверхности. Разные значения BRDF_Correction соответствует разным значениям одного из коэффициентов в этом уравнении. В официальной документации рекомендуют в большинстве случаев использовать 21. BRDF_Lower_Bound отвечает за ещё один коэффициент в уравнении, и его можно оставить по умолчанию, за исключением случаев, когда вы точно знаете, почему и зачем его нужно поменять.

Красивая картинка


Параметр Generate_TCI_Output включает и выключает создание полноцветного изображения. По умолчанию TRUE, но если красивая картинка не нужна, то можно выбрать FALSE.

Учёт состояния атмосферы


Параметры Aerosol_Type, Mid_Latitude, Ozone_Content указывают на состояние атмосферы в момент съёмки. Aerosol_Type можно установить по территории: если континент, то RURAL, если океан, то MARINE. Mid_Latitude аналогично определяется по времени года: если летом, то SUMMER, если зимой, то WINTER.

Параметр Ozone_Content указывает на содержание озона. Содержание озона можно поискать в онлайн-архиве Всемирного центра данных по озону и ультрафиолетовому излучению. На карте можно найти станцию, наиболее близкую к району съёмки, далее скачать набор с данными за нужное время и посмотреть результаты измерений в день съёмки. Однако установить реальный результат измерений в конфигурационном файле нельзя — нужно выбрать одно значение из списка для соответствующего времени года. Следовательно, нужно сначала узнать реально измеренное значение, а потом подобрать наиболее близкое из доступных. Например, по данным станции в Екатеринбурге, 27 июня 2018 года (время съёмки) содержание озона составляло 316 DU. В пояснении в конфигурационном файле указано: для лета в средних широтах доступные варианты — 250, 290, 331 (по умолчанию), 370, 410, 450. Наиболее близкое к 316 — это 331. Оно идёт по умолчанию, поэтому в данном случае можно ничего не менять. Если бы снимок был сделан несколькими днями раньше, когда содержание озона уменьшалось до 302 DU, следовало бы установить Ozone_Content в 290.

В принципе все три параметра — Aerosol_Type, Mid_Latitude, Ozone_Content — в большинстве случаев можно выставлять по умолчанию — AUTO для Aerosol_Type и Mid_Latitude и 0 для Ozone_Content. В таком случае Sen2Cor сам определит наиболее подходящие значения по метаданным снимка.

Удаление облачности


Параметр Cirrus_Correction говорит, удалять или нет перистые облака со снимка. Работает в паре с WV_Threshold_Cirrus — это порог содержания водяного пара, ниже которого удаление облаков автоматически отключается, даже если Cirrus_Correction установлено в TRUE. Следовательно, если есть основания полагать, что содержание водяного пара в атмосфере в момент съёмки было низкое, но небольшие облака всё же есть, и их нужно удалить, то лучше уменьшить значение WV_Threshold_Cirrus. WV_Threshold_Cirrus может быть от 0.1 до 1.

Заключение


Таким образом, в данной статье мы рассмотрели следующие вопросы: как установить Sen2Cor, как запустить его с настройками по умолчанию, как изменить некоторые параметры работы программы с помощью опций командной строки и конфигурационного файла. Для более глубокого изучения Sen2Cor можно обратиться к официальной документации, которая размещена на той же странице, что и установщики. Официальная документация включает четыре документа: более простые и понятные Release Note и Software User Manual и довольно сложные технические Product Definition и Input Output Data Definition. Последний файл также включает «The full reference of GIPP» в качестве вложенного pdf-файла. Полагаю, что технические специалисты найдут в этих документах ещё много полезного.
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 41

    0

    Использование Sen2Cor осложняется тем, что это как конь сферический в вакууме. Сцены Sentinel-2 нарезаны на тайлы, если вы хотите сделать атмосферную коррекцию для двух и более тайлов, то готовьтесь к Different results with tiles from one scene. Даже если тайлы сняты одним КА и в одно время.

      0
      Да, сам столкнулся с этой проблемой: были два соседних тайла с небольшим пересечением, пропустил их через Sen2Cor с одинаковыми настройками, сравнил отражение в нескольких точках внутри пересечения — значения оказались разными. Потом нашёл статью dx.doi.org/10.3390/rs10060926 — там обработали снимки до L2A с помощью Sen2Cor и сравнили их со снимками, уже обработанными до L2A в дата-центре ESA (для Европы можно скачать снимки, сразу обработанные до L2A). Оказалось, что между этими снимками разница где-то 5%. Так что да, возникает вопрос, а как именно и что там обрабатывается.
      Я ещё долго искал где-нибудь, какой именно алгоритм обработки реализован в Sen2Cor (там же разные есть — DOS и 6S, например), но так и не нашёл.
        0

        По ссылке в моем комментарии есть информация о проекте MAJA от ФранцКосмоса, похоже, что там более соответствующие друг-другу результаты получаются. MAJA бесплатна для некоммерческого использования, но сразу скажу, что сам не пробовал. Ну и задачи атмосферной коррекции могут быть разными, если нужно прямо вот суперточный BOA, то это одно, а если нужно, например, отслеживать динамику NDVI, то главное, чтобы результаты отражали реальный тренд.

          0
          Спасибо, может быть, посмотрю о MAJA, если понадобится (пока актуальных задач нет).
          В моём случае нужно было сравнить индексы в разных участках местности с разным уровнем загрязнения, поэтому суперточный BOA не требовался — главным был именно тренд.
      +2

      Хотелось бы увидеть в статье не только описание того, на какие кнопки нужно нажимать, но и того зачем это нужно делать. Какую новую информацию я получу со снимка, применив тот или иной шаг коррекции? Как это поможет мне использовать этот снимок? Пример в шапке не показателен, т.к. похожий результат достигается десятком кликов в фотошопе.


      Использую космоснимки для анализа рельефа при подготовке пешеходных маршрутов в малопосещаемых районах. Было бы интересно почитать о применении подобного ПО для анализа снимков, а не просто о том, какие кнопки тыкать.

        0
        Снимки Sen2Cor вряд ли помогут подготовить пешеходные маршруты, потому что у них слишком маленькое пространственное разрешение — максимум 10 метров на пиксель, поэтому даже нормальную дорогу на них будет видно как ниточку шириной в 1 пиксель. Сказать что-либо о рельефе по этим снимкам сложно — по-моему, вообще никакого рельефа не видно, даже если постараться разглядеть. Наверное, лучше для пешеходных маршрутов брать снимки DigitalGlobe — там разрешение повыше, до нескольких десятков сантиметров на пиксель. Правда, они платные. Ещё, наверное, можно взять OpenTopoMap (там неплохо прорисован рельеф, и это бесплатные карты).
        Пример в шапке действительно не очень показателен, потому что это просто картинка, к тому же полноцветная. Если сравнивать отдельные каналы по отражению в заданных точках, то разница будет видна, и будет понятно, что это не Фотошоп. Скорректированные каналы можно, например, использовать для расчёта вегетационных индексов — считается, что в результате атмосферной коррекции значения должны больше соответствовать действительности. То есть если мы посчитаем индекс до коррекции и индекс после коррекции и сравним, например, с результатами полевых измерений, то в теории индекс после коррекции должен быть ближе к результатам полевых измерений, чем индекс до коррекции.
          0

          На самом деле, разрешение 10 м/пиксель — это довольно неплохая точность, если сравнивать с другими доступными проектами. Google Maps, например, предлагает снимки 15-30 м/пиксель, и то на отдельные районы.
          DigitalGlobe как-то попытались использовать, но для некоммерческой группы там запредельные цены. Дальше запроса стоимости дело не пошло.
          OpenTopoMap для построения рельефа использует данные SRTM с разрешением ~90м, что не обеспечивает достаточной точности. К тому же, в приполярных областях данные SRTM вообще отсутствуют. Неплохие результаты даёт ALOS, но только для некоторых районов. Большие области или не отсняты, или данные получены со значительной погрешностью. Существенные проблемы приносит сглаживание участков с резким изменением крутизны склонов. То, что выглядит как 40° склон, может запросто оказаться двумя участками по 20° и 70°. Такая стенка наверняка станет неприятным сюрпризом.
          Ещё используем снимки Landsat 7,8 в видимом диапазоне — для выявления форм рельефа по характерным признакам, освещённости и т.д. — и иных — например, различить в ИК лёд и снег, которые в видимом диапазоне выглядят одинаковым белым пятном. Всё это, естественно, тоже вносит кучу погрешностей при ортотрансформации, склейке снимков и т.д. В итоге приходится полагаться только на невеликий накопленный опыт, чтобы свести всё воедино и попытаться угадать что же там такое на самом деле, поэтому и интересно получить максимальное количество информации с таких снимков.

            0
            Рекомендую:
            ArcGIS World Imagery
            www.arcgis.com/home/item.html?id=10df2279f9684e4a9f6a7f08febac2a9
            Например, на горы Северо-Восточного Алтая там разрешение 1.2 метра на пиксель, а точность привязки снимков 8.5 м (данные показываются после клика левой кнопкой на веб-карте). Я пользуюсь через SasPlanet.
              0
              Можно попытаться сделать нейросеть, которая по десятку снимков одного и того же участка, снятых в разное время (разный угол тени) будет пытаться получить более детальный рельеф. Но вот создать обучающую выборку и обучить… это может стать проблемой.
            0

            Мне кажется вы путаете тональную балансировку снимков и атмосферную коррекцию — Atmospheric Correction. Для первой задачи подходит растровый редактор, вторая — очень сложная научная задача.

              0
              А кстати не появилось ли какого-нибудь автоматического инструмента для этой тональной балансировки?
              Я иногда занимаюсь ручной дешифровкой степных пожаров в Даурии. Раньше я выкачивал 150 снимков на десктоп, и настраивал цвета нажимая кучу кнопок в QGIS. А теперь я за городом, и не могу выкачать с сервера 150 16-битных снимков. Я могу сконвертировать их в RGB, но перед этим надо с ними сделать что-то вроде Auto Colors.
                0

                Честно говоря не знаю. Можно посмотреть или OrfeoToolbox или, кажется, видел это в ScanEx Image Processor. Orfeo хорош тем, что там есть API, в т.ч. для python.
                Но общая проблема в том, что из-за облачности очень тяжело найти тайлы примерно совпадающие по периоду съемки. Это приведет к тому, что с одного края у вас будут тайлы июльские, а с другого майские, а такие, сильно не совпадающие по времени тайлы, практически невозможно отбалансировать, ну только если это не пустыня. Так что для моих задач тональная балансировка не актуальна.
                Хотя, сам долго жил в Даурии, солнца там очень много, может для Даурии и актуально делать бесшовные тонально сбалансированные мозаики.

                  0

                  image
                  Вот мозаика по снимкам за 3 года — все отлично с цветами, на мой взгляд. Облачные пиксели исключены из обработки фильтрацией. Делается бесплатно в Google Earth Engine.

                    0

                    Ну средняя за 3 года конечно получится, даже по СЗФО, внутри одного года с высокой вероятностью не получится, точнее зависит от региона. В Даурии получится, там под 300 солнечных дней в году, в других регионах по 60 солнечных дней в году.
                    А Google Earth Engine потом в как WMTS у себя в проекте можно использовать?

                      0

                      Еще раз повторюсь — с каждой сцены выбираете не облачные ПИКСЕЛЫ и потом из них строите мозаику. На каждом снимке есть пикселы, не покрытые облаками — вот не припомню такого, чтобы облачное покрытие было 100% для всей сцены.


                      Использовать можно, выгрузив как GeoTIFF файл.

              0
              Снимки Sentinel-2 для «обывателя» не очень полезны. Разглядеть мелкие местные предметы из-за разрешения — не выйдет. Только крупные. Единственные два плюса этих данных — это максимальное разрешение из сравнительно оперативно обновляющихся данных. То есть, если вам повезет, вы сможете выяснить, например, была ли река Х пересохшей три недели назад. Или в каком реально состоянии (плюс-минус) строительство какой-нибудь дороги в какой-нибудь заднице, где снимки в Google Maps или Картах Яндекса последний раз обновлялись три года назад.
              Атмосферная коррекция «обывателю» не нужна вообще. Эта процедура нужна только тогда, когда вы собираетесь производить фотограмметрические изменения.
              A, ну если вам нужна лицензионная чистота — Sentinel вам подойдет, потому что на снимках QuickBird/WorldView/GeoEye вы лицензионно-чистую схему не нарисуете.
              0

              Слышали ли вы что-нибудь про воспроизводимость исследований?.. Есть же готовый датасет Sentinel-2 Surface Reflectance (c атмосферной коррекцией, коррекцией угла съемки, положения Солнца,..) https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S2_SR Берите данные отсюда и ваша работа будет воспроизводима — может, вам же и пригодится в дальнейшем.


              P.S. А вообще лучше бы обойтись минимумом коррекций — например, посмотрите TOA (Top of Atmosphere Reflectance). Surface Reflectance снимков с перекрытием заметно отличается, что физически некорректно, так что на практике необходимо использовать серии снимков для создания композитного изображения, при этом фильтровать по маске облачности (приведенные в статье снимки явно очень облачные). Вот как пример, я как раз сегодня интересную статью про композит Sentinel-2 TOA на Google Earth Engine нашел и воспроизвел: https://github.com/mobigroup/gis-snippets/tree/master/GEE

                0
                Спасибо, про воспроизводимость исследований слышал, про этот датасет — не слышал. Правда, надо бы посмотреть, какое там покрытие — снимки в L2A, например, для России за всё время с марта 2017 года или только за какой-то более короткий промежуток.
                  0
                  Dataset Availability
                  2017-03-28T00:00:00 — Present

                  Как указано — все снимки с весны 2017 доступны. Сравните с «Sentinel-2B is a European optical imaging satellite that was launched on 7 March 2017.» Спутник Sentinel 2A с лета 2015 летает, то есть примерно полтора года архива по нему не обработаны. В любом случае, для существенно большей истории наблюдений смотрите Landsat 8 или предыдущие — по ним тоже есть датасеты TOA и SR.

                  0

                  А не в курсе ли вы на счет подвижек по гармонизации данных Landsat и Sentinel? Проблема в том, что в СЗФО всегда очень облачно и приходится использовать часть данных Landsat, а часть Sentinel-2. Из-за отсутствия гармонизации, что TOA, что BOA будут разными. А если у вас поле, у которого часть на S2, а часть на L8, то получается полная жесть, про анализ NDVI можно забыть.
                  Помню, что где-то мелькал проект по гармонизации этих данных, но как-то перестал следить и где-то потерялось все.

                    0

                    Разные спутники с разным оборудованием и разными спектральными частотами каналов и самими каналами — универсально никак нельзя объединить. А вот для конкретной задачи и территории — можно сравнить значения NDVI для перерывающейся области разных снимков и объединить их. Кстати, вы точно не отдельными сценами оперируете, а набором фильтрованных от облаков сцен с медианной фильтрацией значений каждого пиксела? Для Sentinel-2 известно:


                    With two satellites all regular areas indicated above will be revisited every five days under the same viewing conditions.

                    Даже если вам нужно как можно чаще анализ делать — можно маскировать облачные пиксели, получая частичное покрытие NDVI.

                      0

                      Спектральные диапазоны каналов в значительной степени пересекаются у разных КА, поэтому можно попытаться найти общий знаменатель. Вопрос в том, насколько это применимо. Думаю для задач анализа тренда, например NDVI, — более чем. Тут попытались Harmonized Landsat Sentinel-2, признаюсь, однако, что результат не проверял.


                      Кстати, вы точно не отдельными сценами оперируете, а набором фильтрованных от облаков сцен с медианной фильтрацией значений каждого пиксела?

                      Вы про композитный результат на основе серии снимков (я так понял revisit time вы для этого привели)? Нет, я так не делаю. Причин несколько:


                      1. Возьмите некоторые области СЗФО, там облачность такая, что будет один безоблачный снимок в мае, один в июле, а следующий в декабре-январе. И revisit time даже чаще чем 5 дней, бывает даже через день, но увы… облака.
                      2. На данный момент мои интересы в стороне от сельского хозяйства, мне не особо сейчас нужны атмосферные коррекции и фильтрации. Меня больше интересует лес и обработка радаров Sentinel-1.

                      Но да, про фильтрацию я согласен, если есть набор данных, то делать можно.
                      Все же, гармонизация Landsat и Sentinel важный вопрос в районах с частой облачностью. Ситуация когда полполя в Landsat, а полполя в Sentinel — просто рядовая.

                        0
                        Возьмите некоторые области СЗФО, там облачность такая, что будет один безоблачный снимок...

                        Не нужно искать безоблачные снимки! Возьмите облачные и маскируйте облачные пиксели — по соответствующему спектральному каналу и, если хотите, дополнительные маски добавьте. Лично я часто сталкиваюсь с около экваториальными территориями — там безоблачных снимков не бывает вообще, так что только фильтрация безоблачных пикселов с разных сцен спасает (и последующая медианная фильтрация попиксельно).


                        Ситуация когда полполя в Landsat, а полполя в Sentinel — просто рядовая.

                        Так и анализируйте раздельно — используя потом разные пороговые коэффициенты для NDVI по Landsat и Sentinel-2. Точнее будет, чем пытаться привести результат к единому NDVI и по нему анализировать.

                          0
                          Возьмите облачные и маскируйте облачные пиксели — по соответствующему спектральному каналу и, если хотите, дополнительные маски добавьте. Лично я часто сталкиваюсь с около экваториальными территориями — там безоблачных снимков не бывает вообще, так что только фильтрация безоблачных пикселов с разных сцен спасает (и последующая медианная фильтрация попиксельно).

                          Извините, но никак в толк не возьму, что маскировать если облачность 100%? Наверное на экваторе нет смены времен года и такой подход оправдан. Но если у вас один приемлемый снимок в начале мая, потом облачность непролазная, потом один в июле, следующий, может быть осенью, а потом зимой в морозы и больше ничего. Правильно ли я понял, что надо майские пиксели смешивать с июльскими? Что даст маскирование? Ну уберется 75% снимка, как это поможет при условии, что больше на эту территорию снимков нет за интересующий период нет? Бывает необходимость анализа внутри определенного периода, например только во время цветения определенного растения, так запросто в цветение может не быть никаких снимков вообще, только 100% облачность.
                          Ну и облака бывают мелкими барашками и солнце низко, но яркое, тогда будут четкие тени от облаков на земле, которые пока непонятно как автоматически находить и маскировать. В СЗФО не получается даже подобрать ближайший Landsat 8 под "гребенку" Landsat 7.
                          Могли бы вы привести пример того о чем вы говорите, но не за 3 года, а внутри сезона, желательно лета, например, для средней полосы европейской части РФ?

                            0

                            Возьмем скрипт примера из GEE и добавим фильтр облачности (не более 20% облаков) и фильтр по дате (май 2019) и отфильтруем по заданной территории (прямоугольник 29.5, 59.5, 31.5, 60.5 — Санкт-Петербург примерно в центре).
                            Получаем композитное изображение с полным покрытием:

                            На мой взгляд, тут есть некоторые небольшие артефакты, их можно вычистить более аккуратной фильтрацией облаков. Как видим, ситуация на деле далека от "не быть никаких снимков вообще".
                            Вот и сам скрипт GEE:


                            // This example uses the Sentinel-2 QA band to cloud mask
                            // the collection.  The Sentinel-2 cloud flags are less
                            // selective, so the collection is also pre-filtered by the
                            // CLOUDY_PIXEL_PERCENTAGE flag, to use only relatively
                            // cloud-free granule.
                            
                            // Function to mask clouds using the Sentinel-2 QA band.
                            function maskS2clouds(image) {
                              var qa = image.select('QA60')
                            
                              // Bits 10 and 11 are clouds and cirrus, respectively.
                              var cloudBitMask = 1 << 10;
                              var cirrusBitMask = 1 << 11;
                            
                              // Both flags should be set to zero, indicating clear conditions.
                              var mask = qa.bitwiseAnd(cloudBitMask).eq(0).and(
                                         qa.bitwiseAnd(cirrusBitMask).eq(0))
                            
                              // Return the masked and scaled data, without the QA bands.
                              return image.updateMask(mask).divide(10000)
                                  .select("B.*")
                                  .copyProperties(image, ["system:time_start"])
                            }
                            
                            // Set map area
                            var area = ee.Geometry.Rectangle(29.5, 59.5, 31.5, 60.5);
                            Map.centerObject(area, 8);
                            
                            // Map the function over one year of data and take the median.
                            // Load Sentinel-2 TOA reflectance data.
                            var images = ee.ImageCollection('COPERNICUS/S2_SR')
                              .filterDate('2019-05-01', '2019-05-31')
                              // Pre-filter to get less cloudy granules.
                              .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
                              .map(function(image) { return image.clip(area); });
                            
                            var composite = images
                              .map(maskS2clouds)
                              .median()
                            
                            // Display the results.
                            Map.addLayer(composite, {bands: ['B4', 'B3', 'B2'], min: 0, max: 0.3}, 'RGB')
                              0

                              Да, но май не интересен:


                              • почти всегда в начале мая есть немалое количество солнечных дней;
                              • в мае только начинается рост растений, для с/х не подойдет.

                              Возьмите, например, северную часть Рыбинского водохранилища и Череповец, тайл 37VDF, и возьмите июль. Скорее всего ничего не получится, а даже если получится, то будут четкие тени от маскированных облаков — барашков. Это в том случае если облака замаскируются хорошо. Перистые регулярно пролетают через все фильтры и маски.

                                0

                                Хорошо, смотрим на ту же территорию июль:

                                И здесь явно речь не идет про озвученную вами 100% облачность! Притом, что мы использовали простейший скрипт обработки.


                                Upd. Дополним еще данными Sentinel-2



                                Тоже взят скрипт из примеров GEE для нужного района и времени с ограничением не более 20% облачности на сцене.


                                А теперь возьмем минимальное значение вместо медианы — облака это точно отфильтрует:


                                Итого — ваша задача превратилась из не решаемой в элементарную, верно?:) Последней картинки вам может вполне хватить, трудозатраты на это — запуск официального примера и замена функции фильтрации медианы на минимум. Куда уж проще.


                                Еще можно посмотреть другие спутники, можно подобрать более подходящий алгоритм фильтрации облаков (обычно для летних снимков оценивают наиболее зеленый и наиболее синий пиксели, чтобы выбрать наилучшее значение для суши и воды, вместо медианной и минимальной фильтрации).

                                  0

                                  :-) собственно мы обсуждаем метод, но не определили цель, что немного наоборот :-). Конечно, ваш метод применим, особенно для получения визуальных мозаик, собственно я с этим никогда не спорил. Да, метод применим даже для более глубокого анализа когда есть серия близкорасположенных по времени снимков. Но:


                                  • у вас в июле много облачности, не факт, что интересующий вас объект будет виден под облачностью
                                  • попробуйте собрать мозаику на экстент тайла 37VDF за июль.

                                  Собственно весь вопрос: какую цель мы хотим достичь? Ну а от цели можно и метод выбрать и да, ваш метод важен и нужен и вполне может быть применен. Но есть области, где он работать просто не будет и тогда нужны другие методы. Собственно к радарам обратился именно из-за нехватки оптических данных. За всю осень может не быть ничего кроме "молока"!

                                    0

                                    Тем же методом и радарные данные обрабатываются :) Экстент назовите, который вас интересует, посмотрим — широта_мин, долгота_мин, широта_макс, долгота_макс.

                                      0

                                      Экстент (широта_мин, долгота_мин, широта_макс, долгота_макс) 58.5407855054331 37.2814375455109 59.5382353517154 39.1725811832316. За июль, без облаков, без резких теней от "барашков", пожалуйста :-)
                                      Ну с радарами отдельная пестня, там погода влияет, но не как в случае с облаками. Если вам надо найти вырубку, и вы даже знаете квартал, то далеко не всегда она будет видна на радаре. Может быть видна сегодня, а через 3 дня не видна. И вырубка быстроизменяющийся объект, для них подходят или одна сцена или ближайшие друг к другу сцены.

                                        0

                                        Пожалуйте:


                                        А вырубки вы, надеюсь, не глазами ищете? Сделайте оконный спектральный анализ и свертку с гауссовой функцией — увидите, что получится. Понимаете, на определенном масштабе кроны достаточно симметричны (круговая симметрия) и это легко выделить.

                                          0

                                          Извините, но вы широту с долготой перепутали, в Ашхабаде наверное все хорошо с облачностью :-) Вы же сами попросили


                                          Экстент назовите, который вас интересует, посмотрим — широта_мин, долгота_мин, широта_макс, долгота_макс.

                                          Я ответил


                                          Экстент (широта_мин, долгота_мин, широта_макс, долгота_макс) 58.5407855054331 37.2814375455109 59.5382353517154 39.1725811832316.

                                          А я еще подумал почему долгота с широтой в экстенте наоборот находятся :-)

                                            0

                                            Хех, ок. А я еще подумал, что это вам в теплые края захотелось ;) Смотрим Sentinel-2 SR:

                                            Это вовсе не 100% облачность, согласны?

                                              0

                                              Это июль одного года? Какого? Визуально выглядит хорошо.
                                              Да, итоговая облачность далеко не 100% но она явно есть. Вопрос в том, что здесь явно будут присутствовать резкие тени от барашков и сервис на таких данных опасно построить. Если останется даже 20% облачности, то это означает, что из 10 заказов 2 выполнить не удастся, и заранее неизвестно будет облачно или нет. В остальном вопросов нет, для визуального представления все отлично.

                                                0

                                                Июль 2019 года, в скрипте (см. выше) месяц поменял. Резкие тени фильтруются тоже, это не проблема. Для своих целей я еще удаляю шумовую компоненту пространственного спектра (масштаб одного пикселя) — кажется крохоборством, но это существенно, и полученный композит отлично годится для дальнейшей обработки.

                                                  0

                                                  А как вы находите резкие тени? Вы их потом тоже маскируете и меняете значения?
                                                  Вы такие композиты классифицируете или у вас только для визуальных целей? Если классифицируете то насколько точно у вас получается находить требуемые объекты?

                                                    0

                                                    Сами понимаете, не стоит вместо медианы брать минимальное значение. Если данных мало — можно первый квартиль взять. Если совсем мало данных — анализируйте в два прохода, на первом оцениваете гистограмму и находите валидный интервал значений, на втором фильтруете по нему. Есть и отдельные алгоритмы фильтрации тени, но если у вас площади небольшие — подход на основе одной гистограммы для всей площади (точнее, одна гистограмма для суши и другая для воды, если нужно) работает отлично. Весь композит я использую только для визуализации, а работаю с данными по каналам — выделяю высокочастотные компоненты для детализации рельефа и потом гравики, что мне нужно для решения обратной задачи гравики и построения 3д модели плотности среды для геологоразведочных проектов. На Linkedin у меня много про это постов и статей, от теории до практики.

                                            0
                                            Сделайте оконный спектральный анализ и свертку с гауссовой функцией — увидите, что получится.

                                            Если не сложно, можете ссылку на метод? Это к какой поляризации относится? У меня подозрение, что вырубка, при определенных условиях ничем не отличается от невырубки на радаре. Отражение что у вырубки, что у окружающего леса одинаковое.

                  0
                  работал с ГИС лет 8 назад, как было набором костылей, так и осталось(

                  Only users with full accounts can post comments. Log in, please.