我正在使用ArcGIS 10.2.2来确定多个区域的区域统计信息。如果值栅格中有任何NoData,则我希望区域结果为“ NoData”,正如工具说明所宣传的那样。此工具说明指出:
数据—在任何特定区域内,只有在输入值栅格中具有值的像元才会用于确定该区域的输出值。在统计计算中将忽略“值”栅格中的NoData像元。
NODATA —在任何特定区域中,如果在“
”值栅格中存在任何NoData像元,则认为这不足信息以
对该区域中的所有像元进行统计计算;
因此,整个区域将在输出栅格上接收NoData值。
请看我在这张照片中的设置:
我正在将NODATA选项与具有一个NoData像素的值栅格一起使用,因此希望得到的区域值(区域61154)设置为“ NoData”。取而代之的是,我得到的值是12.74(在图像中四舍五入为13),这在两个层次上使我感到困惑:第一,我期望'NoData',第二,从数学上来说,得出的12.74的值是不可能的,因为均值不能更大比值栅格中的最大值(在这种情况下为10)大。
如果我使用DATA选项,则得到的值约为9.1,这很有意义。我们在不同的数据集,计算机和ArcGIS版本上对此进行了测试。
我在这里缺少什么?
编辑/附加注释:我刚刚注意到,“ Count”属性对于该特定区域也是错误的。在该区域中确实有421个像元,但该工具仅计数297。计算421减去297得出124-奇怪的是,这是NoData像素所在的“位置”,如果一个从左上到下数的像素就在区域中。该工具可能会导致单元计数错误(太低),这可能解释了平均值的增加。
编辑:这是指向我正在使用的数据的链接。
编辑:Dan Patterson和我在ESRI论坛上进行了一些进一步的调试。
#1 楼
存在一个似乎与您所遇到的错误相对应的错误-该错误已注册为BUG-000084883-在区域统计中作为表工具{和Zonal Statistics工具}使用的“忽略计算中的NoData”选项在选中时不可用,产生错误结果。在10.3和10.2.2中会发生,但在10.1中不会发生。您是否尝试过此版本的工具?
评论
尽管我个人不知道如何运行该工具的较旧版本,但这听起来是个好方法。有人知道在哪里指向我尝试这种解决方法吗?
–UdderlyAstray
15年8月18日在17:52
谢谢@GISGe。您在哪里找到的?是否存在记录此错误的链接?
– G-向导
15年8月18日在21:24
@ G-wizard-我已经在我的答案中添加了链接。作为Esri国际人员,我可以访问比您看到的更为详细的描述,这就是我可以告诉您的错误,该错误也适用于区域统计工具,而在10.1中找不到。
–GISGe
15年8月19日在6:03
@UdderlyAstray-如果要运行该工具的旧版本,则必须安装该旧版本的ArcGIS。
–GISGe
15年8月19日在6:04
再次感谢@GISGe,因为这是我正在寻找的东西(已正式确认错误),所以我将此答案标记为正确的答案,尽管其他人也通过测试进行了确认。
– G-向导
15年8月19日在18:02
#2 楼
这是一个错误。单元格计数出了点大错。
正确的平均值(9.0452380952381)乘以正确的非空单元格数(420)除以297(即报告的单元格数)按工具)得出12.7912457912458。这是工具报告的平均值错误。
我自己的玩具尺寸网格测试的结果:
评论
我确认我对10.3,NODATA和“ MEAN”也有相同的问题
– radouxju
15年8月17日在10:49
谢谢双方确认。但是,除了均值的差异外,我以为结果实际上不应该是任何值,而应该是“ NODATA”是错误的吗?该工具的描述使我相信这一点。说:“ NODATA-在任何特定区域内,如果值栅格中存在任何NoData像元,则认为没有足够的信息来对该区域中的所有像元执行统计计算;因此,整个区域将接收NoData值在输出栅格上。”由于有一个像素带有“ NODATA”,因此区域统计也应为“ NODATA”。
– G-向导
15年8月17日在15:17
@ G-wizard,您是正确的,如工具说明中所述。有点类似于#DIV / 0!在Excel中。
–c0ba1t
15年8月17日在16:01
#3 楼
与另一个答案类似,将栅格数据移动到NumPy掩码数组中以计算统计信息。假设两个重叠的栅格具有相同的形状,这很简单:import numpy as np
zones = arcpy.RasterToNumPyArray("zones")
value = np.ma.masked_equal(arcpy.RasterToNumPyArray("value"),
arcpy.Raster("value").noDataValue)
print("Zone\tCount\tNoData\tMean")
for z in np.unique(zones):
sel = (zones == z)
print z, sel.sum(), value.mask[sel].sum(), value[sel].mean()
显示:
Zone Count NoData Mean
61131 53 0 8.92452830189
61154 421 1 9.04523809524
61207 1 0 8.0
61317 35 0 7.2
61644 644 0 7.90838509317
61677 12 0 7.41666666667
61789 7 0 9.0
61871 193 0 7.98445595855
187472 349 0 8.5787965616
评论
是的,它确实会产生一些疯狂的东西。在我的情况下,范围为(16,86)的栅格的MEAN = 537。不好笑该栅格中使用什么值表示NoData?
@Jezibelle:好问题,在哪里可以找到可靠的答案?如果我导出为Ascii,则为-9999。如果我从上下文菜单中使用导出功能,则导出对话框的“ NoData as:”字段将预先填充2147483647。这会引发一个标志吗?
它会在属性表中显示为一行
我在帖子末尾做了另一个编辑,在这里我链接到ESRI论坛上的类似帖子。确认错误(扭曲)。与计算“所有”统计信息相比,计算“ MEAN”只会产生不同的结果/更糟糕的结果。