首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R光栅覆盖函数. landsat堆栈的误差

R光栅覆盖函数. landsat堆栈的误差
EN

Stack Overflow用户
提问于 2017-05-31 22:48:13
回答 2查看 304关注 0票数 3

在R中,我遇到了一个不寻常的问题,我们试图用另一层的值填充多云像素。我可以让它和堆栈一起工作,如下所示-

代码语言:javascript
复制
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)

但是我试着用光栅堆栈做同样的事情,我得到了错误:

代码语言:javascript
复制
Error in as.character(x) : 
 cannot coerce type 'closure' to vector of type 'character'

守则:

代码语言:javascript
复制
# 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()输出:

代码语言:javascript
复制
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)

更新:我试着重采样数据--仍然不能工作。

代码语言:javascript
复制
cloud_free_resam <- resample(cloud_free_data, masked_data)
cover <- cover(masked_data, cloud_free_resam)

错误:

代码语言:javascript
复制
Error in as.character(x) : 
  cannot coerce type 'closure' to vector of type 'character'

我还试图在两层进行裁剪--相同的错误。

代码语言:javascript
复制
# 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)

获取数据:(警告:317 to下载-解包到~1gb) https://ndownloader.figshare.com/files/8561230

有什么想法会导致这个特定数据集的错误吗?我肯定我们错过了一些非常基本的but...what?提前谢谢你。

莉亚

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-31 21:55:12

这是个窃听器。覆盖两个多层的栅格*对象不能写入磁盘。在简单的示例中,可以通过设置

代码语言:javascript
复制
rasterOptions(todisk=TRUE)

我已经修正了第2-6.1版(即将出版)

票数 1
EN

Stack Overflow用户

发布于 2017-06-01 17:28:20

我认为这与将对象转换为rasterBrick和写入临时文件的光栅有关。即,masked_data <- mask(cloudy_scene, mask = cloud_mask)

使用Spacedman的裁剪创建了一个“内存中”的rasterBrick对象,这些对象不依赖于访问文件;在这种情况下,该示例没有错误。

但是使用整个范围(或在进程结束时裁剪),光栅写入和访问(临时)文件,就会发生错误。

作为一个临时修复,可能是显式地将图像分割成内存大小的块,屏蔽/覆盖,然后用mosaic重新标记。

这两个对象的范围也略有不同,因此应该加以修正。另外,通过显式地设置带名、max值和值<0到NA也是避免问题的好主意。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44295842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档