如何为光栅图像设置唯一ID?

问题描述 投票:0回答:2

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

我想对时间序列执行此操作`

r raster
2个回答
0
投票

您可以使用

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)

0
投票

栅格数据集示例

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 以了解方向。

© www.soinside.com 2019 - 2024. All rights reserved.