ApproxNA在大型栅格堆栈中产生不同且不正确的结果

时间:2017-07-12 19:42:05

标签: r interpolation raster r-raster

我正在尝试确认R Raster包的最新版本(2.5-8)中的函数approxNA中是否存在错误或至少无法解释的行为更改。 稍后注意:正确的答案被视为下面的答案字符串中的注释,建议现在已发布的包更新

我在下面有一个可重复的小例子。 最初的症状是,在一年之久的每日eMODIS砖上,大约NAAC命令的输出似乎与输入相同 - 它有很多很多没有插值的NA值...但当我切换回一个包的旧版本(2.3-12)和旧版本的R(3.3.1,Bug-in-your-hair)它返回正确的插值结果。我尝试将栅格数据类型设置为INT2S并且没有设置特定的栅格数据类型。

我检查了文档,以防有什么理由期望结果有所不同,但正确运行的旧软件包版本与无法正常运行的新软件包版本之间的文档没有任何更改。

在我可重复的示例中,错误较少​​,但只能从绘图视图(包含在示例中)中看到它们。在这些图中,您可以看到多个图层的北部部分具有应该已插值的剩余NA值。

我正在使用带有R-Studio接口的光栅2.5-8运行64位Windows 7和64位R 3.3.2,但我也在R-console上测试了相同的结果和不同的具有相同配置的计算机,并在32位R中进行测试,结果相同。

触发器似乎是第一层或最后一层中存在NA值,但错误发生在第一层或最后一层中没有NA值的单元格中:例如,左上角的单元格仅在图层中丢失在原始堆栈中为2,因此对于从第1层到第3层的那些单元应该是非常简单的插值。

几个月前我确实按照R说明提交了错误报告,但我不确定该联系信息是否正确,或者是否已经进入垃圾邮件文件夹。

我也很满意答案,建议找到解决方法的方向,只要它不会太慢并使用常规维护的常用软件包或软件包。

我似乎无法正确标记它们,但下面的方式是

示例输入块的图

好输出砖的情节

糟糕输出砖的情节

感谢您的任何建议。

##### start  Reproducible example

library(raster)
# make a large raster, it must be quite big to have a problem
r <- raster(ncols=8142, nrows=3285)
# make six rasters to stack, use different ranges to better see the interpolation results
r1 <- setValues(r, round(10 * runif(ncell(r)),0))
r2 <- setValues(r, NA)
r3 <- setValues(r, round(100 * runif(ncell(r)),0))
r4 <- setValues(r, round(1000 * runif(ncell(r)),0))
r5 <- setValues(r, round(50 * runif(ncell(r)),0))
r6 <- setValues(r, round(100 * runif(ncell(r)),0))

# insert some NA values
r1[100:600,] <- NA
r3[,1500:1950] <- NA
r5[,400:800] <- NA
r6[2500:2900,] <- NA

# insert some constant values to make it easier to see if interpolation is working
r4[300:500,] <- 750
r6[300:400,] <- 20
r6[400:500,] <- 100
# make a stack
s <- stack(r1,r2,r3,r4,r5,r6)

# see what the pre-interpolation stack looks like
#plot(s)
plot(s, col = colorRampPalette(c("royalblue","springgreen","yellow","red"))(255))

# interpolate, this takes a while
x2 <- approxNA(s, method = "linear", rule=2)

# see what the post interpolation looks like, there should be filled in values for all
# parts of all layers but instead it’s retaining many of the NA values
#plot(x2)
plot(x2, col = colorRampPalette(c("royalblue","springgreen","yellow","red"))(255))


## End reproducible example

Plot of the input to the approxNa command Plot of the good output to the old approxNa command - sorry for the small labels. Plot of the bad output to the new approxNa command

1 个答案:

答案 0 :(得分:1)

我无法重现这个问题。我稍微简化了一下这个例子

library(raster)
r <- raster(ncols=81, nrows=32)
r1 <- setValues(r, 1)
r2 <- setValues(r, NA)
r3 <- setValues(r, 3)
r4 <- setValues(r, 4)
r5 <- setValues(r, 5)
r6 <- setValues(r, 6)

# insert some NA values
r1[1:6,] <- NA
r3[,15:19] <- NA
r5[,4:8] <- NA
r6[25:29,] <- NA

# make a stack
s <- stack(r1,r2,r3,r4,r5,r6)

# see what the pre-interpolation stack looks like
spplot(s)

# in memory
x1 <- approxNA(s, method = "linear", rule=2)
spplot(x1)

# to disk (that is, simulate a large raster
rasterOptions(todisk=TRUE)
x2 <- approxNA(s, method = "linear", rule=2)
rasterOptions(todisk=FALSE)
spplot(x2)

我没有看到差异。 x1x2似乎相同

x2 - x1
#class       : RasterBrick 
#dimensions  : 32, 81, 2592, 6  (nrow, ncol, ncell, nlayers)
#resolution  : 4.444444, 5.625  (x, y)
#extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
#data source : in memory01_223851_3440_81523.grd 
#names       : layer.1, layer.2, layer.3, layer.4, layer.5, layer.6 
#min values  :       0,       0,       0,       0,       0,       0 
#max values  :       0,       0,       0,       0,       0,       0