r 栅格覆盖函数 - landsat 堆栈错误
r raster cover function - error with landsat stacks
我 运行 遇到了 R 中覆盖函数的异常问题。我们正在尝试用另一层的值填充多云像素。我可以按如下方式使其与堆栈一起正常工作 -
library(raster)
r1 <- raster(ncols=36, nrows=18)
r1[] <- 1:ncell(r1)
r1b <- r1a <- r1
r1_stack <- stack(r1, r1a, r1b)
r2 <- setValues(r1, runif(ncell(r1)))
r2b <- r2a <- r2
r_stack <- stack(r2, r2a, r2b)
r_stack[r_stack < 0.5] <- NA
r3 <- cover(r_stack, r1_stack)
但后来我尝试用光栅堆栈做同样的事情,但我得到了错误:
Error in as.character(x) :
cannot coerce type 'closure' to vector of type 'character'
代码:
# get all tifs
LS5_032_032_2008_09_21 <- list.files("LT050340302008090301T1-SC20170526100900/",
pattern = glob2rx("*band*.tif$"), full.names = T)
# stack bands
cloudy_scene <- stack(LS5_032_032_2008_09_21)
# import cloud mask
cloud_mask <- raster('LT050340302008090301T1-SC20170526100900/LT05_L1TP_034030_20080903_20160905_01_T1_sr_cloud_qa.tif')
# mask data
masked_data <- mask(cloudy_scene, mask = cloud_mask, maskvalue=0, inverse=TRUE)
####### get cloud free data
# get files
LS5_2008_09_19 <- list.files("LT050340302008091901T1-SC20170526101124/",
pattern = glob2rx("*band*.tif$"), full.names = T)
# subset and stack cloud free bands
cloud_free_data <- stack(LS5_2008_09_19)
# use cover function to assign NA pixels to corresponding pixels in other scene
cover <- cover(masked_data, cloud_free_data)
TRACEBACK() 输出:
9: toupper(format)
8: .defaultExtension(format)
7: .getExtension(filename, filetype)
6: .local(x, filename, ...)
5: writeStart(outRaster, filename = filename, format = format, datatype = datatype,
overwrite = overwrite)
4: writeStart(outRaster, filename = filename, format = format, datatype = datatype,
overwrite = overwrite)
3: .local(x, y, ...)
2: cover(masked_data, cloud_free_data)
1: cover(masked_data, cloud_free_data)
更新:我尝试对数据重新采样 - 仍然无效
cloud_free_resam <- resample(cloud_free_data, masked_data)
cover <- cover(masked_data, cloud_free_resam)
错误:
Error in as.character(x) :
cannot coerce type 'closure' to vector of type 'character'
我也尝试裁剪两个图层 - 同样的错误
# find intersection boundary
crop_extent <- intersect(extent(cloud_free_data), extent(masked_data))
cloud_free_data <- crop(cloud_free_data, crop_extent)
masked_data <- crop(masked_data, crop_extent)
# use cover function to assign NA pixels to corresponding pixels in other scene
cover <- cover(masked_data, cloud_free_data)
获取数据:(警告:317mb 下载 - 解压至 ~1gb)
https://ndownloader.figshare.com/files/8561230
知道是什么导致了这个特定数据集的错误吗?
我敢肯定我们错过了一些非常基本的东西,但是……什么?
提前谢谢你。
利亚
我认为这与将对象转换为 rasterBrick 并将光栅写入临时文件有关。即,masked_data <- mask(cloudy_scene, mask = cloud_mask)
使用 Spacedman 的裁剪创建一个 'in memory' 不依赖于访问文件的 rasterBrick 对象;在这种情况下,该示例可以正常工作。
但是使用完整范围(或在过程结束时裁剪),栅格写入和访问(临时)文件并发生错误。
也许临时解决方法是将图像显式拆分为内存大小的块,mask/cover,然后用 mosaic
重新拼接。
两个对象的范围也略有不同,因此应该修复。通常,通过显式设置波段名称、最小值-最大值和值 < 0 到 NA 来避免问题也是一个好主意。
这是一个错误。覆盖两个多层 Raster* 对象无法写入磁盘。这可以通过设置
在简单示例中看到
rasterOptions(todisk=TRUE)
我已在版本 2-6.1(即将发布)中修复此问题
我 运行 遇到了 R 中覆盖函数的异常问题。我们正在尝试用另一层的值填充多云像素。我可以按如下方式使其与堆栈一起正常工作 -
library(raster)
r1 <- raster(ncols=36, nrows=18)
r1[] <- 1:ncell(r1)
r1b <- r1a <- r1
r1_stack <- stack(r1, r1a, r1b)
r2 <- setValues(r1, runif(ncell(r1)))
r2b <- r2a <- r2
r_stack <- stack(r2, r2a, r2b)
r_stack[r_stack < 0.5] <- NA
r3 <- cover(r_stack, r1_stack)
但后来我尝试用光栅堆栈做同样的事情,但我得到了错误:
Error in as.character(x) :
cannot coerce type 'closure' to vector of type 'character'
代码:
# get all tifs
LS5_032_032_2008_09_21 <- list.files("LT050340302008090301T1-SC20170526100900/",
pattern = glob2rx("*band*.tif$"), full.names = T)
# stack bands
cloudy_scene <- stack(LS5_032_032_2008_09_21)
# import cloud mask
cloud_mask <- raster('LT050340302008090301T1-SC20170526100900/LT05_L1TP_034030_20080903_20160905_01_T1_sr_cloud_qa.tif')
# mask data
masked_data <- mask(cloudy_scene, mask = cloud_mask, maskvalue=0, inverse=TRUE)
####### get cloud free data
# get files
LS5_2008_09_19 <- list.files("LT050340302008091901T1-SC20170526101124/",
pattern = glob2rx("*band*.tif$"), full.names = T)
# subset and stack cloud free bands
cloud_free_data <- stack(LS5_2008_09_19)
# use cover function to assign NA pixels to corresponding pixels in other scene
cover <- cover(masked_data, cloud_free_data)
TRACEBACK() 输出:
9: toupper(format)
8: .defaultExtension(format)
7: .getExtension(filename, filetype)
6: .local(x, filename, ...)
5: writeStart(outRaster, filename = filename, format = format, datatype = datatype,
overwrite = overwrite)
4: writeStart(outRaster, filename = filename, format = format, datatype = datatype,
overwrite = overwrite)
3: .local(x, y, ...)
2: cover(masked_data, cloud_free_data)
1: cover(masked_data, cloud_free_data)
更新:我尝试对数据重新采样 - 仍然无效
cloud_free_resam <- resample(cloud_free_data, masked_data)
cover <- cover(masked_data, cloud_free_resam)
错误:
Error in as.character(x) :
cannot coerce type 'closure' to vector of type 'character'
我也尝试裁剪两个图层 - 同样的错误
# find intersection boundary
crop_extent <- intersect(extent(cloud_free_data), extent(masked_data))
cloud_free_data <- crop(cloud_free_data, crop_extent)
masked_data <- crop(masked_data, crop_extent)
# use cover function to assign NA pixels to corresponding pixels in other scene
cover <- cover(masked_data, cloud_free_data)
获取数据:(警告:317mb 下载 - 解压至 ~1gb) https://ndownloader.figshare.com/files/8561230
知道是什么导致了这个特定数据集的错误吗? 我敢肯定我们错过了一些非常基本的东西,但是……什么? 提前谢谢你。
利亚
我认为这与将对象转换为 rasterBrick 并将光栅写入临时文件有关。即,masked_data <- mask(cloudy_scene, mask = cloud_mask)
使用 Spacedman 的裁剪创建一个 'in memory' 不依赖于访问文件的 rasterBrick 对象;在这种情况下,该示例可以正常工作。
但是使用完整范围(或在过程结束时裁剪),栅格写入和访问(临时)文件并发生错误。
也许临时解决方法是将图像显式拆分为内存大小的块,mask/cover,然后用 mosaic
重新拼接。
两个对象的范围也略有不同,因此应该修复。通常,通过显式设置波段名称、最小值-最大值和值 < 0 到 NA 来避免问题也是一个好主意。
这是一个错误。覆盖两个多层 Raster* 对象无法写入磁盘。这可以通过设置
在简单示例中看到rasterOptions(todisk=TRUE)
我已在版本 2-6.1(即将发布)中修复此问题