Невозможно суммировать растры из-за узловых пикселей

12

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

Что я хочу сделать, это суммировать значения каждого растра. Тем не менее, кажется, что каждый раз, когда пиксель ноданных находится в сумме, результирующий пиксель напрямую классифицируется как ноданные. Я хотел бы иметь обратное: игнорировать все значения узлов и суммировать остальные.

Я подумал о 2 способах решения проблемы:

  1. суммирующие растры, игнорирующие значения узлов
  2. преобразование пикселей узлов в значение 0, а затем суммирование всех растров

введите описание изображения здесь

К сожалению, я не могу найти какой-либо инструмент для этого.

Может кто-нибудь мне помочь?

Damien
источник
Интересно, насколько интерпретируемым будет результат: в конце концов, суммы не будут включать значения за пропущенные дни, указывая на то, что они будут смещены на низкое значение различными величинами в зависимости от количества пропущенных данных. Если имеется сколько-нибудь заметное количество пропущенных данных, вам следует вместо этого рассмотреть вменение или прогнозирование значений в пропущенных ячейках, а затем выполнить суммирование.
whuber
1
Спасибо за этот комментарий. Я спросил менеджеров о данных, и они сказали, что они вычислили среднее значение, суммируя все доступные данные, а затем поделили на количество дней в месяце, когда наблюдения доступны для этого пикселя.
Дэмиен
2
Это идентично локальному среднему значению стека растров, где ГИС получает указание просто игнорировать все ячейки NoData, что предлагает вам другой путь. Кстати, эта процедура все еще потенциально смещена, когда отсутствующие наблюдения соотносятся со значениями. Например, когда вы пропускаете данные из-за облачного покрова, вполне вероятно, что в те дни влажность почвы может быть выше (в среднем), чем обычно.
whuber
1
Хорошо, я только что проверил инструмент статистики ячеек с опцией 'ignore nodata', и он делает именно то, что я хотел. Мне известны недостатки такого метода. Тем не менее, моя работа в довольно большом масштабе, как в пространстве, так и во времени, поэтому я предполагаю, что такие уклоны будут менее важными. Во всяком случае, у меня не так много выбора данных.
Дэмиен
Шкала не будет связана с количеством смещения. Важность смещения зависит от его размера и чувствительности вашего приложения к нему. Хотя вы не могли бы быть в состоянии сделать что - либо о данных, вы бы иметь контроль над процедурами их анализа. Есть много способов улучшить это. Среди ваших вариантов - интерполяция во времени и регрессия против ковариат, которые могут быть связаны с влажностью почвы и доступны даже в пропущенные даты. (Существует целая ветвь статистики, посвященная «вменению» пропущенных значений.)
whuber

Ответы:

1

Если у вас есть доступ к ArcGIS, то инструмент Cell Statistics может опционально игнорировать ноданные, которые вы суммируете \ mean \ min \ max ваших растров.

Hornbydd
источник
Если вы измените этот ответ, чтобы заменить «сумма» на «среднее», это будет правильно: посмотрите причину в ветке комментариев к вопросу.
whuber
Суммирование было только одной частью моей проблемы, так как я хочу получить среднее значение. Я только что проверил, и инструмент Cell statitics также является самым простым способом суммирования растров без учета пикселей узлов.
Дэмиен
11

Во-первых, вы можете использовать gdal_calc.py, чтобы изменить все -9999 на 0 и установить значение NoData на 0.

Например:

gdal_calc.py -A input.tif --outfile=input_with_NoData.tif --calc="A+9999*(A==-9999)" --NoDataValue=0

Затем вы можете игнорировать значение NoData, используя gdal_translate с параметром -a_nodata, за которым следует none .

-a_nodata значение :

Назначьте указанное значение узла для выходных полос. Начиная с GDAL 1.8.0, можно установить значение none, чтобы избежать установки значения nodata в выходной файл, если оно существует для исходного файла

Пример:

gdal_translate -a_nodata none input_with_NoData.tif output_without_NoData.tif
Антонио Фальчано
источник
Спасибо за чаевые. Я немного поиграл с параметром -a_nodata, и мне удалось получить значение -9999 вместо NULL. Тем не менее, мне все еще нужно изменить все -9999 пикселей на 0
Дэмиен
1
Вы можете использовать gdal_calc.py, чтобы изменить все -9999 на 0 перед применением gdal_translate -a_nodata none .... Например: gdal_calc.py -A input.tif --outfile=input_with_NoData.tif --type=Int16 --calc="A+9999*(A==-9999)" --NoDataValue=0
Антонио Фальчано
Я пробовал несколько команд, но я действительно думаю, что у меня проблема с gdal_calc.py. Например, я просто попытался добавить 1 ко всему растру ( i.imgur.com/WiZG7MC.png ) и получил эту ошибку Maxrepeat. Я не понимаю, я выполнил команду непосредственно из оболочки OSGeo, и этот модуль, кажется, правильно установлен, так как он появляется в списке, когда я открываю оболочку ( i.imgur.com/fgtMZQZ.png ). Моя установка не работает?
Дэмиен
Это похоже на проблему с регулярным выражением ... Попробуйте изменить свой рабочий каталог с помощью cdкоманды и повторите попытку, чтобы получить только -A test.tif.
Антонио Фальчано,
1
Это работает для меня, но я установил все это через установщик OSGeo4W . Вместо этого я вижу, что вы установили QGIS через автономный установщик. Поэтому попробуйте обновить / обновить настройки.
Антонио Фальчано,
5

В R:

library(raster)
s <- stack('file1', 'file2', ...)
ss <- sum(s, na.rm=TRUE)
Роберт Хейманс
источник
Не могли бы вы добавить пояснение к этому коду (если вы его написали) или ссылку на то, где вы его нашли, с краткой сводкой с сайта?
Пол
1
Вышеупомянутый сначала загружает растровый пакет, затем создает «стек» (3-мерный массив растровых файлов одинакового экстента и разрешения, где каждый файл становится частью этого стека), включающий файлы, обозначенные именами файлов через запятую , Последняя строка выполняет подсчет ячеек по всем слоям стека sс аргументом, в na.rm=TRUEрезультате чего NAзначения игнорируются. Выходной объект ss- это rasterобъект, который можно экспортировать с помощью writeRaster(см. ?writeRaster). (@RobertH - создатель rasterпакета R. )
jbaums
1

Условный инструмент в Spatial Analyst - это простой способ преобразования нулевых значений в нули. Тогда взятие сумм должно быть несложным делом.

барсук
источник
Спасибо за ваш ответ. Я следил за этим постом: support.esri.com/fr/knowledgebase/techarticles/detail/34932 и смог преобразовать все нулевые пиксели в 0. Однако мне бы хотелось, чтобы я мог выполнять эту операцию для всех растров в пределах каталог. Кажется, что «Переклассифицировать значения сетки» в QGIS может это сделать, но все, что я не знаю, как это работает. Я выбираю метод «Простая таблица» и прошу установить нулевое значение в 0 и не изменять другие значения, но результирующий растр колеблется от -0,99 до 0,08, в то время как первоначально он охватывает от 428 до 3491
Damien
Можете ли вы опубликовать отрывок вашего оригинального растра где-нибудь, чтобы мы могли посмотреть?
til_b
2
Если вы щелкнете правой кнопкой мыши по инструменту, вы можете запустить пакетный процесс для любого количества файлов, то есть для всего каталога.
Брок
Спасибо за Ваш ответ. Тем не менее, я могу преобразовать все NULL в 0 для одного файла, используя «Пространственный аналитик / Алгебра карт / Растровый калькулятор». Если я щелкну правой кнопкой мыши на этом инструменте, я смогу создать пакетную директорию, но какой будет синтаксис для автоматического учета каждого файла? ( i.imgur.com/aYaUCzz.png )
Дэмиен
Я посмотрел на инструмент «Пространственный аналитик / Переклассификация / Переклассификация», и он делает именно то, что я хочу. Мне удалось использовать пакетное окно для обработки нескольких файлов одновременно. У меня есть последняя проблема: если я щелкаю правой кнопкой мыши / заполняю 'выходной растр', он копирует одинаковые выходные файлы для всех входных растров. Как я могу сделать, чтобы создать разные выходные данные для каждого входа? ( i.imgur.com/jzTI2x9.png )
Дэмиен
1

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

Так же, как примечание об отображении значений узлов в QGIS: значения узлов всегда отображаются в виде значений узлов в окне карты и при использовании инструмента «информация об объекте», независимо от того, имеют ли они на самом деле значения -9999, 0, NULL и т. Д. Таким образом, после переклассификации значений узлов в 0, если вы перейдете в настройки слоя, вы найдете в Метаданных, что узлы имеют значение 0.

Я наконец нашел идеальный инструмент для квеста, GRASS r.series. Если для параметра «операция агрегирования» задано значение «максимум», а для параметра «распространение NULL» не установлено, инструмент создаст слой, соответствующий вашим требованиям.

Мирон
источник
0

Я помню эту проблему некоторое время назад. В качестве решения я думаю, что я сделал +1 ко всем ячейкам в растре, добавил растры вместе, а затем сделал окончательное вычитание (из всех добавленных вами +1). Это довольно грубо, но если оно выполнит свою работу ...!

Или используйте «Переклассифицировать значения сетки» на панели инструментов «Обработка» в QGIS, чтобы преобразовать ваши нулевые значения в ноль.

Роб Лодж
источник
Привет, я попробовал много способов использования инструмента «переклассифицировать значения сетки», но безуспешно. Я начал на растре, где я преобразовал все NULL пикселей в -9999. Я попытался переклассифицировать, используя метод [0] single, и установить 'old value = -9999', 'new value = 0.0', 'operator: [0] =', но все, что я получаю, это растр, полный 'nan' пиксели. Что я делаю не так?
Дэмиен