【问题标题】:R sample a raster with square polygonsR对带有正方形多边形的栅格进行采样
【发布时间】:2017-11-16 19:40:00
【问题描述】:

我想通过创建小栅格 100x100 单元格来采样大栅格。 我不知道该怎么做,所以欢迎任何想法

我的实际线索:

library(raster)
library(spatstat)
library(polyCub)

r <- raster(ncol=1000,nrow=1000) # create empty raster
r[] <- 1:(1000*1000)             # Raster for testing
e <- extent(r)                   # get extend
# coerce to a SpatialPolygons object
p <- as(e, 'SpatialPolygons')  


nc <- as.owin.SpatialPolygons(p) #polyCub
pts <- rpoint(50, win = nc)
plot(pts)

现在我需要在我的 50 个点周围生成 100x100 单元格正方形,我想使用这些正方形裁剪 r 并单独堆叠每个小栅格...

【问题讨论】:

  • 我不清楚您的目标:给定的输入是raster 包格式的大栅格和ppp 格式spatstat 的一些(50)个给定点,然后你想在每个点周围提取 100x100 的栅格单元吗?单独堆叠每个小栅格是什么意思?
  • 还必须考虑边缘情况:例如当一个点靠近栅格边界并且栅格不包含围绕它的 100x100 网格时会发生什么?
  • 抱歉耽搁了,i) 你完全明白我在找什么!在每个点周围提取一个 100x100 的栅格单元。对我来说,最好的输出将是光栅堆栈。 ii) 我不知道(还)拥有管理光栅边界附近的点。

标签: r polygon raster sampling spatstat


【解决方案1】:


@adrian-baddeley 的回答基本上包含了做什么 你要。如果您只是想要一个包含小 im 对象的列表 您只需将 im 对象通过 owin 对象子集到 100x100 框 提取相关区域。这是一个例子(点数较少 避免过度绘制)

library(raster)
library(spatstat)
library(maptools)

r <- raster(ncol=1000,nrow=1000) # create empty raster
r[] <- 1:(1000*1000)             # Raster for testing
e <- extent(r)                   # get extend
# coerce to a SpatialPolygons object
p <- as(e, 'SpatialPolygons')  

nc <- as.owin.SpatialPolygons(p)
set.seed(42)
pts <- rpoint(7, win = nc)

rim <- as.im.RasterLayer(r)
Box <- owin(c(-50,50) * rim$xstep, c(-50,50) * rim$ystep)

以下是大小为 100x100 的 im 对象列表

imlist <- solapply(seq_len(npoints(pts)),
                   function(i) rim[shift(Box, pts[i])])

这是该区域中im 对象和顶部点的图

plot(pts)
for(i in imlist) plot(i, add = TRUE)
plot(pts, pch = 19, add = TRUE)

您可以使用

转换为栅格图层列表
rasterList <- lapply(imlist, as, Class = "RasterLayer")

PS:以下是im对象的原始大小列表 NA 如果您需要该格式,请在 100x100 框外

imlist <- solapply(seq_len(npoints(pts)),
                   function(i) rim[shift(Box, pts[i]), drop = FALSE])

【讨论】:

    【解决方案2】:

    如果要使用spatstat,则需要将光栅对象r 转换为spatstat 支持的im 类对象。您可以在 maptools 包中进行此转换。将此图像对象称为rim。然后你可以这样做

    Box <- owin(c(-50,50) * rim$xstep, c(-50,50) * rim$ystep)
    BoxesUnion <- MinkowskiSum(pts, Box)
    W <- intersect.owin(as.mask(rim), BoxesUnion)
    

    这将为您提供被正方形覆盖的栅格子集。 如果您想保持正方形分开,请执行以下操作

    M <- as.mask(rim)
    BoxList <- solapply(seq_len(npoints(pts)), 
                          function(i) intersect.owin(M, shift(Box, pts[i])))
    

    那么BoxList 是各个子栅格的列表。

    【讨论】:

    • 如果我理解你的建议,BoxList 是一个窗口列表!听起来不错 !现在我不明白如何使用这些窗口来掩盖初始光栅或im...我对owin 对象不满意。
    猜你喜欢
    • 2014-08-21
    • 2020-11-12
    • 1970-01-01
    • 2011-07-26
    • 2021-08-15
    • 1970-01-01
    • 2021-01-20
    • 2020-08-19
    • 2015-09-27
    相关资源
    最近更新 更多