【问题标题】:Calculate area covered by pixels in several rasters计算几个栅格中像素覆盖的面积
【发布时间】:2017-12-14 07:29:39
【问题描述】:

我有一个包含 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、周期和月份。

这是我现在的代码:

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)    
}

【问题讨论】:

  • 总的来说,你应该使用length而不是sum

标签: r raster


【解决方案1】:

这会有所帮助

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

【讨论】:

  • 谢谢。输出来自一个循环,其中每个栅格都有年和月。如何将所有这些合并到一个数据框中?
  • 我想如果您发布所有数据以及预期的输出,这将有助于您获得最终答案。到目前为止你尝试过什么?
【解决方案2】:

示例数据

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)
}

【讨论】:

  • 感谢您的帮助。我不确定我是否愿意走这条路,因为每个栅格都有一个关联变量,即rcpLs &lt;- c("rcp26", "rcp45", "rcp60", "rcp85")periodLs &lt;- c("2020_2049", "2040_2069")。我会使用im &lt;- cbind(RCP=rep(rcp,times=nrow(b)), PERIOD=rep(period,times=nrow(b)), MONTH=rep(mth,times=nrow(b)), b) 将这些变量附加到最终数据框中。我希望这会根据上述字段连续写入每个栅格,但它不起作用。我哪里错了?
猜你喜欢
  • 2017-09-23
  • 2022-10-07
  • 2018-10-25
  • 2021-01-25
  • 1970-01-01
  • 2020-05-06
  • 2018-05-16
  • 1970-01-01
  • 2016-12-13
相关资源
最近更新 更多