2017-05-31 94 views
3

我遇到了一個與R中的覆蓋函數不同尋常的問題。我們試圖用另一個圖層中的值填充陰影像素。我可以讓它工作得很好用棧如下 -r柵格覆蓋函數 - 與landsat堆棧錯誤

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) 

回溯()輸出:

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

任何想法可能會導致此特定數據集的此錯誤? 我確定我們錯過了一些非常基本的東西,但是......什麼? 預先感謝您。

利亞

+0

Works爲我固定這一點,如果我裁剪一切由'E =程度限定在很小程度上(可見(例如:450000,470000,4750000,4780000)',例如:'cloud_free_data < - 裁剪(堆棧(LS5_2008_09_19 [5:10]),e)',我的個人電腦在完整的數據上糟糕透頂,我沒有讓它跑到完成/錯誤。 – Spacedman

+0

在您的錯誤後,traceback()會說什麼?你可以編輯這個問題嗎? – Spacedman

+0

@Spacedman我有一種感覺,它與沒有數據的區域中的重疊像素有關,但我不確定。我會嘗試作物和追蹤 –

回答

1

這是一個錯誤。具有兩個多層Raster *對象的封面不能寫入磁盤。這可以在簡單的例子中通過設置

rasterOptions(todisk=TRUE) 

我已經在版本2-6.1(即將出版)

+0

謝謝@RobertH我會尋找更新! –

1

我認爲這是當對象被轉換爲rasterBrick並寫入到一個臨時文件光柵做。即masked_data <- mask(cloudy_scene, mask = cloud_mask)

使用Spacedman的裁剪會創建一個'內存中'的rasterBrick對象,它不依賴於訪問文件;在這種情況下,這個例子沒有錯誤。

但是使用完整範圍(或在進程結束時裁剪),光柵寫入和訪問(臨時)文件併發生錯誤。

也許作爲一個臨時的解決辦法是明確地將圖像分割成內存大小的塊,掩碼/覆蓋,然後與mosaic重新排列。

兩個對象的範圍也略有不同,所以應該修復。通過明確設置樂隊名稱,最小最大值和值NA來避免問題,通常也是一個不錯的主意。

+0

謝謝!程度問題是一個問題。我嘗試了同樣的裁剪,但沒有解決錯誤。我會嘗試使用柵格磚方法,看看它是否有幫助,但我仍然認爲它可能與像素重疊有關 - landsat場景不是方形的,而是範圍是「矩形」的,因此場景中有許多沒有數據像素可能會導致問題。我會嘗試更多的東西... –

+0

不!因爲我懷疑它與磚塊和堆棧無關。我仍然認爲這是與像素重疊/丟失數據有關。 –