我是 R 新手。我想为光栅图像(240 m 分辨率)中的每个像素设置唯一 ID,然后分解 t0 30 m 分辨率。
我尝试了这段代码,但不起作用。
` ndvi<-list.files(pattern = glob2rx("ndvi.tif$"), full.names=FALSE)
create_ids <-function(raster){
df<-as.data.frame(raster, xy=TRUE)
df<- df%>%
mutate(ID = paste(x, y, sep="-")) %>%
select(ID, layer)
return(df)
}
disaggregate <-function(raster,res){
cols <- ncol(raster) * (res(raster) / res)
rows<-nrow(raster) * (res(raster)/res)
grid<-expand.grid(x=1:cols, y-1:rows)
df<-cbind(grid, raster::extract(raster, raster::xyFromCell(raster, grid), cells = TRUE))
return (df)
}
output_res <-30
for (i in ndvi){
r<-raster(i)
#create IDs
ids<-create_ids(r)
#将 ID 写入文件 write.csv(ids, str_replace(file, ".tif", "_ids.csv"))
#分解 分解 <-disaggregfate_raster(r,30)
#加入ID 分解<-left_join(disagg, ids, by=c("layer"="ID"))
#写入分解栅格 输出文件<-str_replace(i, ".tif", "_disagg.tif")
your text
writeRaster(disagg, outfile)
}
我想对时间序列执行此操作`
您可以使用
terra
包获得所需的输出。特别是,subst
和disagg
函数是负责执行关键步骤的函数。这是一个带有虚拟栅格的示例。
library(terra)
# Create dummy raster in UTM 15 N
im <- rast(matrix(1:25000000, nrow = 5000, ncol = 5000),
crs = "EPSG:32615")
# Aggregate values to get 240 m pixels
im <- aggregate(im, fact = 240)
# Check resolution
res(im)
# Substitute values with id values, 1 to xcells * ycells * zbands
im <- subst(im,
from = values(im),
to = seq(1,dim(im)[1] * dim(im)[2] * dim(im)[3], 1))
plot(im)
# Disaggregate to desired resolution ) 240 / 8 = 30
im2 <- disagg(im, fact = 8, method = "near")
# Check resolution
res(im2)
# Check values
values(im2)
# Plot
plot(im2)
栅格数据集示例
library(terra)
x <- rast(xmin=0, xmax=2400, ymin=0, ymax=2400, res=240)
指定手机号码
y <- init(x, "cell")
ncell(y)
#[1] 100
minmax(y)
# lyr.1
#min 1
#max 100
分解
z <- disagg(y, 8)
res(r)
[1] 30 30
这些是标准操作,有自定义功能。请参阅 `?terra::terra 和 https://rspatial.org/spatial/index.html 以了解方向。