r语言 - 如何在for循环中添加额外的光栅,可以组合成一个完整的数据集



我有一个栅格,按颜色(1-6)描绘了2050年的全球土地类型预测。我将其裁剪为全球海草分布(cmu)的多边形数据集。我运行了一个for循环来计算每个土地类型(1)的面积。水,2。森林,3。城市4。贫瘠的,5。农田,6.草地)存在于海草多边形上。我如何添加额外的全球土地类型栅格(例如2060年,2070年,2100年)到我的df。区域数据框架,这样我就可以分析/绘制土地覆盖类型如何随时间变化的图表?(NB。这段代码仅针对澳大利亚进行过滤,因为全球需要很长时间,我想测试工作流)

##CALCULATE AREA OF RASTER CLASSES###
library(terra)
library(sf)
library(tidyverse)
cmu <- st_read('units-attributes-wgs84L2.gpkg')
land <- rast('7landtypes/SSP1_RCP19/global_SSP1_RCP19_2050.tif')
plot(land)
cmu2 <- filter(cmu, TERRITORY1 == 'Australia') %>% st_transform("+proj=cea +lat_ts=30 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs")
land.sub <- crop(land, vect(cmu2))
tmp <- list() # tmp object for storing results of loop as a list
system.time(
for(i in 1:nrow(cmu2)){#loop through cmus and calculate area of diff. land classes
s <- cmu2[i,] # subset a polygon from the cmu dataset
rs <- crop(land.sub, vect(s), mask = TRUE)
if(is.na(minmax(rs)[2]) == FALSE){
tmp[[i]] <- data.frame(class = unname(values(rs)),
area_ha = unname(values(cellSize(rs, unit="ha")))) %>% 
filter(!is.na(class)) %>% 
group_by(class) %>% 
summarise(area_ha = sum(area_ha, na.rm = T)) %>% 
mutate(unit_ID = st_drop_geometry(s)[,1],
raster = names (rs))
}else{
next
} 
} 
)
df.area <- do.call(rbind, tmp)
head(df.area)
# save
write.csv(df.area, 'land-class-area-cmu-2050.csv', row.names = F)

回答这样的问题是不可能的,但你可能可以这样做,如下所示。

示例数据

library(terra)
cmu <- vect(system.file("ex/lux.shp", package="terra"))
land <- rast(system.file("ex/elev.tif", package="terra"))
解决方案

area <- cellSize(land)
zones <- rasterize(cmu, area, "ID_2")
z <- zonal(area, zones, sum, na.rm=TRUE)

最新更新