2017-08-25 44 views
2

我有一些大的柵格(〜110 MB每個)我想執行一些柵格計算。就本示例而言,我想對文件SNDPPT_M_sl1_1km_ll.tifSNDPPT_M_sl2_1km_ll.tif進行平均,可在this website處獲取。實際上,數學有點複雜(一些柵格的一些乘法和除法)。R-柵格數學,同時保留整數格式

兩個輸入柵格都是整數(INT1U)數據,我希望輸出也是INT1U。但是,每當我嘗試執行柵格計算時,它都會創建大小非常大的浮點格式的中間臨時文件。我正在使用一臺帶有大約7 GB的可用硬盤空間的筆記本電腦,在計算完成之前會將其填充。

# load packages 
require(raster) 

## script control 
# which property? 
prop <- "SNDPPT" 

# load layers 
r.1 <- raster(paste0("1raw/", prop, "_M_sl1_1km_ll.tif")) 
r.2 <- raster(paste0("1raw/", prop, "_M_sl2_1km_ll.tif")) 

# allocate space for output raster - this is about 100 MB (same size as input files) 
r.out <- writeRaster(r.1, 
        filename=paste0("2derived/", prop, "_M_meanTop200cm_1km_ll.tif"), 
        datatype="INT1U") 

# perform raster math calculation 
r.out <- integer(round((r.out+r.2)/2)) 

# at this point, my hard drive fills due to temporary files > 7 GB in size 

任何人是否知道一種解決方法在R 2與同時最小化或避免了非常大的中間文件整數輸入和輸出文件來執行光柵數學?

+1

我對柵格軟件包並不熟悉,但是如果r.out < - (r.out + r.2)%/%2)有效,您能否給它一個鏡頭? (它不完全是你想要的,但關閉) –

回答

2

這裏的訣竅可能是使用raster::overlay進行計算並將結果同時保存爲壓縮tiff。像這樣的東西應該工作:

library(raster) 
#> Loading required package: sp 
# load layers 
r.1 <- raster("C:/Users/LB_laptop/Downloads/SNDPPT_M_sl1_1km_ll.tif") 
r.2 <- raster("C:/Users/LB_laptop/Downloads/SNDPPT_M_sl1_1km_ll.tif") 

out <- raster::overlay(r.1, r.2, 
         fun = function(x, y) (round((x + y)/2)), 
         filename = "C:/Users/LB_laptop/Downloads/SNDPPT_out.tif", 
         datatype = "INT1U", 
         options = "COMPRESS=DEFLATE") 
> out 
class  : RasterLayer 
dimensions : 16800, 43200, 725760000 (nrow, ncol, ncell) 
resolution : 0.008333333, 0.008333333 (x, y) 
extent  : -180, 180, -56.00083, 83.99917 (xmin, xmax, ymin, ymax) 
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
data source : C:\Users\LB_laptop\Downloads\SNDPPT_out.tif 
names  : SNDPPT_out 
values  : 0, 242 (min, max) 

HTH。

+0

感謝@LoBu - 關於大於255的結果的好處。在我的情況下,所有的值都是百分比(0-100),我將它們平均,所以我知道結果永遠不會大於100,這就是爲什麼我在所有情況下都可以使用INT1U格式。所以,一旦我將函數設置爲function(x,y)(round((x + y)/ 2))',這個解決方案就非常適合我,產生與輸入大小相同的輸出柵格(〜120 MB )。 –

+1

很好。考慮到我只是編輯了答案,因爲「壓縮」選項的語法是錯誤的。 – lbusett

+0

啊,現在我明白了!我正在使用乘法而不是求和。我糾正了這個問題以反映這一點。 – lbusett