替换R中每个栅格砖带中的特定值

时间:2017-05-30 15:51:23

标签: r normalization r-raster

我使用brick()将多波段(20层)栅格作为RasterBrick加载到R中。 我的计划是使用此线程中提出的方法将每个波段从0归一化为1:https://stats.stackexchange.com/questions/70801/how-to-normalize-data-to-0-1-range

这里有一些示例代码可视化我的问题:

for(j in 1:nlayers(tif)){
  min <- cellStats(tif[[j]],'min')
  max <- cellStats(tif[[j]],'max')
  for(i in 1:ncell(tif)){
    tif[i][j] <- (tif[i][j]-min)/(max-min)    
  }
}

&#34; TIF&#34;包含栅格砖。 &#34; J&#34;是&#34; tif&#34;的当前层,而&#34; i&#34;是[[i]]层的当前单元格。 我认为其余部分非常直接。 现在的问题是,在没有完成的情况下,需要花费数小时来替换特定频段中的单个值。为什么没有完成需要这么长时间?

干杯, 启

2 个答案:

答案 0 :(得分:2)

您可以使用layers函数阅读所有stack,然后使用以下函数对其进行标准化:

s <- stack("Some Raster Layers")
snorm <- (s - minValue(s)) / (maxValue(s)- minValue(s))

答案 1 :(得分:2)

您的方法效率非常低,因为您一次一个地循环遍历每个单元格。对于较大的栅格,这需要永远。

您可以使用Geo-sp答案中的方法(如果您的光栅较大,我也不建议这样做)或使用clusterR功能:

norm <- function(x){(x-min)/(max-min)}

for(j in 1:nlayers(tif)){

  cat(paste("Currently processing layer:", j,"/",nlayers(tif), "\n"))

  min <- cellStats(tif[[j]],'min')
  max <- cellStats(tif[[j]],'max')

  #initialize cluster
  #number of cores to use for clusterR function (max recommended: ncores - 1)
  beginCluster(3)

  #normalize
  tif[[j]] <- clusterR(tif[[j]], calc, args=list(fun=norm), export=c('min',"max"))

  #end cluster
  endCluster()
}