【问题标题】:raster in R: Subset a raster image given a pixel sizeR中的光栅:给定像素大小的子集光栅图像
【发布时间】:2020-03-27 04:38:56
【问题描述】:

在给定坐标中心点和所需的 x 和 y 大小(以像素为单位)的情况下,我想对光栅图像进行子集化。在我的例子中:

library(raster)  
set.seed(5)

##Create a raster
r <- raster(ncol=10, nrow=10, crs="+proj=utm +zone=1 +datum=WGS84", xmn=0, xmx=50, ymn=0, ymx=50)
s1 <- stack(lapply(1:4, function(i) setValues(r, runif(ncell(r)))))

# Create 10 random points in the raster
pts <- data.frame(pts=sampleRandom(s1, 10, xy=TRUE)[,1:2], status=rep(c("A","B"),5))

现在,我想创建 10 个新图像,它们将是大小的子集(X 子集图像的所需宽度 = 5 像素,Y 子集图像的所需宽度 = 5 像素),中心点为 (pts$x , pts$y),具有相同的像素大小。最后,将每个图像保存为 GeoTIFF:

for(i in 1:length(pts)){
  writeRaster(r[[i]],filename=paste(pts,"_",i,sep=""),
              format="GTiff",datatype="FLT4S",overwrite=TRUE)
}

这可能吗?

【问题讨论】:

    标签: r raster r-raster rgdal


    【解决方案1】:

    嘿,我可以通过在您的点周围创建方形缓冲区来做到这一点,该缓冲区大到足以捕获 5 x 5 的栅格。然后我使用这些缓冲区来剪辑您的栅格。这是我的 cmets 代码:

    library(raster)  
    library(rgeos)
    set.seed(5)
    
    ##Create a raster
    r <- raster(ncol=10, nrow=10, crs="+proj=utm +zone=1 +datum=WGS84", xmn=0, xmx=50, ymn=0, ymx=50)
    s1 <- stack(lapply(1:4, function(i) setValues(r, runif(ncell(r)))))
    
    # Create 10 random points in the raster
    pts <- data.frame(pts=sampleRandom(s1, 10, xy=TRUE)[,1:2], status=rep(c("A","B"),5))
    pts_points = SpatialPointsDataFrame(pts[,1:2], data.frame(pts[,3]))
    
    ## Creating square buffers around your points
    pts_buffer = gBuffer(pts_points, byid = TRUE, capStyle = "SQUARE", width = 12.5)
    
    
    ## looping through all your points
    for (i in 1:nrow(pts_buffer)){
      square = pts_buffer[i,]
      val = square@data$pts...3. ## Gets the value of the point ("A" or "B")
    
      ## Contains a stack of raster clipped for the current point for the raster stack
      clipped = mask(s1, square) 
    
      ## Export the clipped raster here
    }
    

    缓冲区的宽度为 12.5,以确保创建 5 x 5 的栅格。要更改栅格的子集大小,只需更改缓冲区的宽度!

    这是缓冲区点在栅格顶部的样子:

    在代码中,我们遍历每个正方形并将光栅裁剪到该区域,这是光栅堆栈被其中一个区域裁剪后的样子:

    如果这有帮助,或者有什么需要澄清的,请告诉我!

    【讨论】:

      猜你喜欢
      • 2022-10-07
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      • 2021-06-14
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      相关资源
      最近更新 更多