由于没有数据像素,无法对栅格求和


12

我有一组包含每日土壤湿度数据的栅格(.vrt)。我想对所有栅格的像素求和,以便按月进行度量。但是,每天都没有覆盖整个世界,这导致在前几天存在度量的地方没有数据值。

我想做的是对每个栅格的值求和。但是,似乎每当无数据像素合计时,结果像素就被直接分类为无数据。我想相反:忽略所有nodata值并求和其余值。

我想到了两种解决问题的方法:

  1. 汇总栅格而忽略nodata值
  2. 将无数据像素转换为值0,然后将所有栅格相加

在此处输入图片说明

不幸的是,我找不到任何工具可以做到这一点。

谁能帮我?


我不知道结果将如何解释:毕竟,总和将不包括缺失天数的值,表明它们将根据缺失数据的数量而偏低。如果有丢失数据的任何明显的量,那么你应该考虑,而不是归咎于预测的缺失单元的值,然后进行的总和。
ub

1
感谢您的评论。我问数据的管理者,他们说他们通过对所有可用数据求和来计算平均值,然后除以该像素上可观察到的月份中的天数。
Damien 2013年

2
这与以GIS指示仅忽略所有NoData像元的栅格堆栈的局部平均值相同,这为您提供了另一种选择。顺便说一句,当缺失的观测值与值相关时,此过程仍可能存在偏差。例如,当您由于云层覆盖而丢失数据时,有理由认为在那几天土壤湿度可能(通常)比平时更高。
ub

1
好吧,我刚刚测试了单元格统计工具,并选中了“ ignore nodata”,它确实可以实现我想要的功能。我知道这种方法的缺点。但是,我的工作在空间和时间上都相当大,因此我认为这种偏见将不那么重要。无论如何,我真的没有太多的数据选择。
Damien 2013年

该比例将与偏差量无关。偏差的重要性取决于其大小和您的应用程序对其的敏感性。虽然你可能无法做有关数据什么,你必须在分析他们的过程控制。有很多方法可以对此进行改进。您可以选择随着时间进行插值,然后针对可能与土壤湿度相关的协变量进行回归,甚至在缺失的日期也可以使用。(统计数据的整个分支致力于“插补”缺失值。)
胡乱

Answers:


1

如果可以访问ArcGIS,则“ 单元统计信息”工具具有可选选项,可忽略对栅格求和,平均值,最小值,最大值的无数据。


如果您修改此答案以将“ sum”替换为“ average”,那将是正确的:请参阅问题的注释主题以了解原因。
Whuber

求和只是我问题的一部分,因为我想获得平均值。我刚刚检查了一下,像元统计工具也是不考虑nodata像素而对栅格求和的最简单方法。
Damien

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

然后,您可以用忽略的无数据值gdal_translate-a_nodata选项后面没有

-a_nodata

将指定的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
Damien

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
Antonio Falciano

我尝试了几个命令,但我确实认为gdal_calc.py存在问题。例如,我只是尝试将1添加到整个栅格(i.imgur.com/WiZG7MC.png),并且获得了此Maxrepeat错误。我不明白,我直接从OSGeo Shell运行了该命令,由于打开外壳程序(i.imgur.com/fgtMZQZ.png)出现在列表中,因此似乎已正确安装了此模块。我的安装坏了吗?
Damien

似乎是正则表达式问题...尝试使用cd命令更改工作目录,然后重试以仅具有-A test.tif
Antonio Falciano

1
它对我有用,但是我已经通过OSGeo4W安装程序安装了所有这些东西。相反,我看到您已经通过独立安装程序安装了QGIS。因此,请尝试刷新/更新您的设置。
Antonio Falciano

5

在R中:

library(raster)
s <- stack('file1', 'file2', ...)
ss <- sum(s, na.rm=TRUE)

您是否可以在此代码中添加简短说明(如果您编写了代码)或指向找到它的位置的链接,以及网站的简短摘要?
保罗

1
上面的代码首先加载栅格数据包,然后创建一个“堆栈”(具有相同范围和分辨率的3维栅格文件阵列,其中每个文件都成为该堆栈的一部分),其中包括用逗号分隔的文件名表示的文件。最后一行在堆栈的所有片上执行按单元求和s,参数na.rm=TRUE导致NA值被忽略。输出对象ssraster可以与之一起导出的对象writeRaster(请参阅参考资料?writeRaster)。(@RobertH是R raster包的创建者。)
jbaums 2014年

1

Spatial Analyst中的条件工具是一种将空值转换为零的简便方法。然后取和应该是一个瞬间。


谢谢您的回复。我遵循了这篇文章:support.esri.com/fr/knowledgebase/techarticles/detail/34932 并能够将所有空像素都转换为0。但是,我希望能够对a中的所有栅格执行此操作目录。QGIS中的“重新分类网格值”似乎能够做到这一点,但是我不知道它是如何工作的。我选择“简单表”方法,并要求将null设置为0,并且不更改其他值,但是生成的栅格范围是-0.99至0.08,而原始范围是428至3491
Damien

您可以在某处张贴原始栅格的摘录,以便我们看看吗?
til_b 2013年

2
如果右键单击该工具,则可以对任意数量的文件(即整个目录)运行批处理。
布罗克

感谢您的回答。但是,我可以使用“空间分析器/地图代数/栅格计算器”将单个文件的所有NULL都转换为0。如果我正确使用此工具,则可以批处理目录,但是自动考虑每个文件的语法是什么?(i.imgur.com/aYaUCzz.png
达明

我看了一下“空间分析器/重新分类/重新分类”工具,它确实可以实现我想要的功能。我设法使用批处理窗口以便一次处理多个文件。我有最后一个问题:如果我右键单击/填充“输出栅格”,它将为所有输入栅格复制相同的输出文件。如何使它为每个输入创建不同的输出?(i.imgur.com/jzTI2x9.png
达明

1

不久前,我遇到了同样的问题,并且设法解决了。

就像有关在QGIS中显示无数据值的注释一样:无数据值总是在地图窗口中以及使用“对象信息”工具时显示为无数据值,无论它们实际上是否具有值-9999、0,NULL等。 。因此,在将nodata值重新分类为0之后,如果进入图层设置,您将在元数据中发现nodata的值为0。

我终于找到了理想的工具GRASS r.series。在“聚合操作”设置为“最大”且未选中“传播空值”的情况下,该工具将创建一个满足您要求的图层。


0

我记得前一段时间有这个问题。作为解决方案,我认为我对栅格中的所有像元进行了+1,将栅格加在一起,然后进行了最终减法(无论您添加了多少+1)。这很粗糙,但是如果能完成工作……!

或者,使用QGIS中“处理”工具箱中的“重新分类网格值”将空值转换为零。


嗨,我尝试了多种使用“重新分类网格值”工具的方法,但均未成功。我从一个栅格开始,将所有NULL像素都转换为-9999。我尝试使用方法[0]进行重新分类,并设置“旧值= -9999”,“新值= 0.0”,“运算符:[0] =”,但是我得到的只是一个充满“ nan”的栅格像素。我究竟做错了什么?
Damien 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.