替换R中每个光栅砖带中的特定值
Replace specific value in each band of raster brick in R
我使用 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)
}
}
"tif" 包含光栅块。 "j"是"tif"的当前层,而"i"是[[i]]层的当前单元格。
我认为剩下的就很简单了。
现在的问题是,需要数小时才能完成替换特定波段中的单个值。为什么这么久还没有完成?
干杯,
凯
您可以使用 stack
函数读取所有 layers
,然后使用以下函数对其进行归一化:
s <- stack("Some Raster Layers")
snorm <- (s - minValue(s)) / (maxValue(s)- minValue(s))
您的方法非常低效,因为您一次只循环遍历每个单元格一次。对于较大的栅格,这需要很长时间。
您可以使用 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()
}
我使用 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)
}
}
"tif" 包含光栅块。 "j"是"tif"的当前层,而"i"是[[i]]层的当前单元格。 我认为剩下的就很简单了。 现在的问题是,需要数小时才能完成替换特定波段中的单个值。为什么这么久还没有完成?
干杯, 凯
您可以使用 stack
函数读取所有 layers
,然后使用以下函数对其进行归一化:
s <- stack("Some Raster Layers")
snorm <- (s - minValue(s)) / (maxValue(s)- minValue(s))
您的方法非常低效,因为您一次只循环遍历每个单元格一次。对于较大的栅格,这需要很长时间。
您可以使用 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()
}