计算几个栅格中像素所覆盖的区域

时间:2017-12-14 07:29:39

标签: r raster

我列出了96个分类栅格(每个栅格都有一个关联的变量,即rcp,周期和月份),值为1-16,我想计算每个栅格中每个类别所覆盖的区域如果栅格中不存在该类别,则返回NA。

这是我现在创建的功能

a <- function(x){
rs <- x #categorical raster
b <- getValues(area(x, weights=FALSE))
b <- aggregate(b, by=list(getValues(x)), sum, na.rm=T)
b <- as.data.frame(b)
names(b) <- c("CLASS","AREA")
return(b)
}

这样做的问题是它只返回一个数据框,其中只包含现有的栅格值而没有丢失的值。见下文:

  CLASS       AREA
1     1 145084.052
2     5  39425.336
3     6  37912.591
4    10  10089.541
5    11   3150.571
6    15   1451.912
7    16   4289.296

如何返回包含所有类别(1-16)的数据框?并将所有输出合并为一个?列名应为rcp,period和month。

以下是我的代码:

mthLs <- c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")
rcpLs <- c("rcp26", "rcp45", "rcp60", "rcp85")
periodLs <- c("2020_2049", "2040_2069")

for(rcp in rcpLs){
  rcpDir <- paste0(iDir, "/", rcp)
     for(period in periodLs){
         for (mth in 1:12) {
          rs <- raster(paste0(iDir, "/", rcp, "/", period, "/cng_", mth, ".tif", sep=""))
          b <- a(rs) #using function above
         }
       im <- cbind(RCP=rep(rcp,times=nrow(b)), PERIOD=rep(period,times=nrow(b)), MONTH=rep(mth,times=nrow(b)), b)

      } 
  write.csv(im, paste(oDir, "/output.csv", sep=""), quote=T, row.names=F)    
}

2 个答案:

答案 0 :(得分:0)

这可能会有所帮助

txt <- 
"CLASS,REA
1,145084.052
5,39425.336
6,37912.591
10,10089.541
11,3150.571
15,1451.912
16,4289.296"

b <- read.csv(textConnection(txt),sep =  ",")

classes <- 1:16

merge(data.frame(CLASS = classes), b, by='CLASS', all.x=T)

结果:

   CLASS        REA
1      1 145084.052
2      2         NA
3      3         NA
4      4         NA
5      5  39425.336
6      6  37912.591
7      7         NA
8      8         NA
9      9         NA
10    10  10089.541
11    11   3150.571
12    12         NA
13    13         NA
14    14         NA
15    15   1451.912
16    16   4289.296

答案 1 :(得分:0)

当您提出R问题时,请提供一些示例数据。

library(raster)
r <- raster(nc=5, nr=5)
set.seed(20171214)
r1 <- setValues(r, sample(16, ncell(r), replace=TRUE))
r2 <- setValues(r, sample(16, ncell(r), replace=TRUE))
r3 <- setValues(r, sample(16, ncell(r), replace=TRUE))

如果您可以制作RasterStack(RasterLayers具有相同的范围和分辨率),您可以这样做:

s <- stack(r1,r2,r3)
x <- freq(s)

m <- data.frame(value=1:16)
for (i in 1:length(x)) {
    y <- x[[i]]
    colnames(y)[2] <- paste0("v", i)
    m <- merge(m, y, all.x=TRUE)
}

m
#   value v1 v2 v3
#1      1  3  2  1
#2      2 NA  3 NA
#3      3  2  2  1
#4      4  1  3  2
#5      5  1 NA  2
#6      6  1  3  3
#7      7 NA  3  4
# ... 

或者,如果没有RasterStack,则创建一个RasterLayer对象列表,例如与

# z <- lapply(filenames, raster)

但是对于这个例子,我们可以手动完成:

z <- list(r1, r2, r3)

m <- data.frame(value=1:16)
for (i in 1:length(z)) {
    y <- freq(z[[i]])  
    colnames(y)[2] <- paste0("v", i)
    m <- merge(m, y, all.x=TRUE)
}

或者 - 也许最简单 - 带有文件名ff

的矢量
m <- data.frame(value=1:16)
for (i in 1:length(ff)) {
    y <- freq(raster(ff[i]))  
    colnames(y)[2] <- paste0("v", i)
    m <- merge(m, y, all.x=TRUE)
}