2017-03-01 6 views
0

래스터 벽돌로 반복하는 것에 대해 많은 질문이 있습니다. 그러나 그 중 어느 것도 제가 찾고있는 답변/조언이 없습니다.래스터 벽돌로 반복하기

큰 (17.2GB, 7901 개 레이어) netcdf 파일을 RRasterBrick으로 가져 왔습니다.

> KK10Brick 
class  : RasterBrick 
dimensions : 2160, 4320, 9331200, 7901 (nrow, ncol, ncell, nlayers) 
resolution : 0.08333333, 0.08333333 (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 : D:\LandUse\KK10.nc 
names  : X8000, X7999, X7998, X7997, X7996, X7995, X7994, X7993, X7992, X7991, X7990, X7989, X7988, X7987, X7986, ... 
z-value  : 100, 8000 (min, max) 
varname  : land_use 

파일의 각 레이어는 1 년을 나타내며 브릭의 각 픽셀에 대한 시간 이동 평균을 만들어야합니다. 변수가 범주 형 (land_use)으로 보일지라도 실제로는 % 커버입니다.

30 년 이동 평균을 만들고 싶습니다. 슬라이딩 윈도우는 10 년입니다. 예 : 첫 번째 창은 레이어 1:30에서 평균 값의 래스터를 생성하고 다음 창은 레이어 11:40 ... 7871:7901에서 평균값의 다른 래스터를 생성합니다.

for 루프는 아마도 for 루프를 수행하는 가장 좋은 방법 일 것이라고 생각했지만 여기에 올바른 경로를 따라 갔는지 확실하지 않습니다.

for (i in 1:7901){ 
subsetLayers <- code to subset relevant layers 
out <- stackApply(KK10Brick, indices = subsetLayers, fun = "mean", na.rm = TRUE, filename = paste("./Output/", "meanLU_window_", i, ".tif", sep = "")) 
rm(out)} 

내가 막힌 곳에서는 subsetLayers의 시퀀스를 생성하는 코드를 작성하고 있습니다. 어떤 도움이라도 대단히 감사 할 것입니다.

EDIT.

library(raster) 
exBrick <- brick(nrow = 180, ncol = 360, nl = 100) 
values(exBrick) <- runif(ncell(exBrick) * nlayers(exBrick)) 
crs(exBrick) <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0" 
exBrick 
+0

@dww 샘플 래스터 벽돌에 대한 코드를 일부 추가했습니다. – KaanKaant

답변

1

이것은 예제 데이터에서도 작동합니다. 나는 그것이 속도와 RAM 사용량면에서 매우 큰 netcdf 데이터로 얼마나 잘 확장 될지 확신하지 못합니다 - 큰 데이터에서 작동하는지 알려주세요. 경우 RAM 사용량에

starts = seq(1, nlayers(exBrick)-30, 10) 
nout = length(starts) 
out = brick(nrow = 180, ncol = 360, nl = nout) 
values(out) = NA 
crs(out) = "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0" 

for (i in 1:nout) { 
    start = starts[i] 
    out[[i]] = mean(exBrick[[start:(start+30)]]) 
} 

, 우리는 한 번에 디스크에 각 결과 층, 하나의 래스터를 저장하여 몇 가지 속도의 비용으로 RAM을 절약 할 수 있습니다 결과를 저장할 수있는 큰 벽돌을 할당에서 제한 요소입니다 :

for (i in starts) { 
    out = mean(exBrick[[i:(i+30)]]) 
    writeRaster(out, filename=paste0("out",i,".grd"), overwrite=TRUE) 
} 
+0

고마워. 실제 데이터 세트와 동일한 수의 행/열/레이어를 가진 래스터에 NA 값을 할당하려면 27.5GB RAM이 필요합니다. ~ 200GB RAM이있는 컴퓨터에 액세스 할 수 있으므로 앞으로 며칠 이내에 어떻게되는지 알려 드리겠습니다. – KaanKaant

+0

@KaanKaant 결과에 할당 할 래스터 벽돌은 원본 데이터의 1/10 밖에되지 않습니다. 따라서 3GB보다 작아야합니다. 또한 한 번에 한 레이어 씩 결과를 저장하여 램 사용량을 줄이는 방법을 보여주는 편집을 추가했습니다. – dww