Неможливо підсумовувати растри через пікселі нодату


12

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

Що я хочу зробити, це підсумовувати значення кожного растру. Однак, схоже, щоразу, коли піксель нодату знаходиться в сумі, отриманий піксель безпосередньо класифікується як нодатні. Мені б хотілося навпаки: ігнорування всіх значень нодатів та підсумовування решти.

Я продумав два способи вирішення проблеми:

  1. підсумовування растрових ігнорувань значень нодатів
  2. перетворивши пікселі нодатів у значення 0, потім підсумуйте всі растри

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

На жаль, я не можу знайти жодного інструмента для цього.

Хтось може мені допомогти?


Цікаво, наскільки інтерпретаційним буде результат: адже суми не включатимуть значення за пропущені дні, вказуючи на те, що вони будуть упереджено низькими на різні суми залежно від кількості відсутніх даних. Якщо є якась значна кількість відсутніх даних, то вам слід замість цього ввести або передбачити значення у відсутніх комірок, а потім виконати суму.
whuber

1
Дякую за цей коментар Я запитав у менеджерів даних, і вони сказали, що вони обчислили середнє значення шляхом підсумовування всіх доступних даних, а потім розділити на кількість днів протягом місяця, коли є спостереження за цим пікселем.
Дамієн

2
Це ідентично локальній середній групі растрових груп, де ГІС доручається просто ігнорувати всі комірки NoData, що пропонує інший шлях для вас. До речі, ця процедура все ще потенційно є упередженою, коли відсутні спостереження співвідносяться зі значеннями. Наприклад, коли вам не вистачає даних через хмарний покрив, можливо, в ці дні вологість ґрунту може бути вищою (в середньому), ніж зазвичай.
whuber

1
Добре, я щойно перевірив інструмент статистики комірок за допомогою перевіреного "ігнорувати вузли", і він робить саме те, що я хотів. Мені відомо про недоліки такого методу. Однак моя робота знаходиться в досить великому масштабі, як в просторі, так і в часі, тому я припускаю, що такі упередження будуть менш важливими. У всякому разі, у мене дійсно не так багато вибору даних.
Дамієн

Шкала не буде пов’язана з величиною зміщення. Важливість зміщення залежить від його розміру та чутливості вашої заявки до нього. Хоча ви не могли б бути в змозі зробити що - небудь про дані, ви б мати контроль над процедурами їх аналізу. Існує маса способів удосконалення цього. Серед ваших варіантів - інтерполяція з часом та регрес проти коваріатів, які можуть бути співвіднесені з вологістю ґрунту та доступні навіть у пропущені дати. (Є ціла галузь статистики, присвячена "зарахуванню" відсутніх значень.)
whuber

Відповіді:


1

Якщо у вас є доступ до ArcGIS, тоді інструмент " Статистика статистики комірок" може необов'язково ігнорувати вузли, які ви підсумовуєте \ середні \ хв \ макс.


Якщо ви модифікуєте цю відповідь, щоб замінити "суму" на "середню", це буде правильно: дивіться нитку коментаря до питання з причини.
whuber

Підведення підсумків було лише однією частиною моєї проблеми, оскільки я хочу отримати середнє значення. Я щойно перевірив, і інструмент статики стільникових клітин також є найпростішим способом підсумовувати растри, не враховуючи пікселів нодату.
Дамієн

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, після якого не буде вжито жодного .

-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

Умовний інструмент у просторовому аналітиці - це простий спосіб перетворення нульових значень у нулі. Тоді взяти суми слід негайно.


Дякую за вашу відповідь Я дотримувався цієї публікації: support.esri.com/fr/knowledgebase/techarticles/detail/34932 і зміг перетворити всі нульові пікселі в 0. Однак мені б хотілося, щоб можна було зробити цю операцію для всіх растрових файлів у каталог. "Перекласифікувати значення сітки" в QGIS, здається, може це зробити, але все, що я не знаю, як це працює. Я вибираю метод "Проста таблиця" і прошу його встановити нульове значення 0 і не змінювати інші значення, але результуюча растра коливається від -0,99 до 0,08, тоді як вона спочатку охоплює від 428 до 3491
Дамієн

Чи можете ви розмістити десь уривок свого оригінального растру, щоб ми могли подивитися?
til_b

2
Якщо ви клацніть правою кнопкою миші на інструменті, ви можете запустити пакетний процес на стільки файлів, скільки хочете, тобто на весь каталог.
brock

Дякую за вашу відповідь. Однак я можу конвертувати всі NULL в 0 для одного файлу, використовуючи «просторовий аналітик / алгебра карти / калькулятор растра». Якщо я клацну правою кнопкою миші на цьому інструменті, я можу створити папку, але яким буде синтаксис, щоб автоматично враховувати кожен файл? ( i.imgur.com/aYaUCzz.png )
Дамієн

Я подивився на інструмент «просторовий аналітик / Reclass / Reclassify», і він робить саме те, що я хочу. Мені вдалося використати пакетне вікно для того, щоб обробити декілька файлів одночасно. У мене є остання проблема: якщо я клацну правою кнопкою миші / заповнити 'вихідний растр', він копіює однакові вихідні файли для всіх вхідних растрових файлів. Як я можу зробити так, щоб він створив різний вихід для кожного вводу? ( i.imgur.com/jzTI2x9.png )
Дамієн

1

У мене була така ж проблема і деякий час тому, і мені вдалося її вирішити.

Як і примітка про відображення значень нодатів у QGIS: значення nodata завжди відображаються як значення nodata у вікні карти та при використанні інструменту "інформація про об'єкт", незалежно від того, чи вони насправді мають значення -9999, 0, NULL тощо Отже, після перекласифікації значень нодатів до 0, якщо ви перейдете в налаштування шару, ви знайдете в метаданих, що nodata мають значення 0.

Нарешті я знайшов ідеальний інструмент для квесту, ГРАС r.series. Якщо параметр "сукупна операція" встановлений "максимум" і "розповсюдження NULLs" не встановлений, інструмент створить шар, який відповідає вашим вимогам.


0

Я пам’ятаю, як у мене була проблема з тим часом. Як рішення, я думаю, що я зробив +1 для всіх комірок у растрі, додав растри разом, а потім зробив остаточне віднімання (проте скільки +1 ви додали). Це досить грубо, але якщо це виконає роботу ...!

Крім того, використовуйте "Перекласифікувати значення сітки" в панелі інструментів "Обробка" в QGIS, щоб перетворити ваші нульові значення в нуль.


Привіт, я спробував багато способів використання інструменту "перекласифікувати значення сітки" без успіху. Я почав з растру, де я перетворив усі NULL пікселі на -9999. Я намагався перекласифікувати за допомогою методу [0] сингл і встановив 'old value = -9999', 'new value = 0.0', 'operator: [0] =', але все, що я отримую, це растр, повний 'nan' пікселів. Що я роблю неправильно?
Дамієн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.