R 检测光栅是否位于空间多边形对象内、外或相交

R 检测光栅是否位于空间多边形对象内、外或相交,r,sp,r-raster,R,Sp,R Raster,我有许多光栅,我想检查它们是否完全包含在空间多边形内,是否完全不包含空间多边形,是否与空间多边形相交(这可能意味着多边形完全位于光栅内,或者多边形和光栅重叠)。我做这项检查是为了尽可能避免时间密集型掩蔽 以下是一个例子: # create 3 example rasters r <- raster() r[] <- rnorm(n = ncell(r)) e1 <- extent(c(45,55,45,

我有许多光栅,我想检查它们是否完全包含在空间多边形内,是否完全不包含空间多边形,是否与空间多边形相交(这可能意味着多边形完全位于光栅内,或者多边形和光栅重叠)。我做这项检查是为了尽可能避免时间密集型掩蔽

以下是一个例子:

                                      # create 3 example rasters
r <- raster()
r[] <- rnorm(n = ncell(r))
e1 <- extent(c(45,55,45,50))
r1 <- crop(r,e1)
e2 <- extent(c(20,25,25,30))
r2 <- crop(r,e2)
e3 <- extent(c(38,55,57,65))
r3 <- crop(r,e3)


                                        #create SpatialPolygons

x <- c(40,60)
y <- c(40,60)
m <- expand.grid(x,y)
m <- m[c(1,2,4,3),]
p1 <- Polygon(m)
p1 <- Polygons(list(p1),1)

x <- c(10,15)
y <- c(10,15)
m <- expand.grid(x,y)
m <- m[c(1,2,4,3),]
p2 <- Polygon(m)
p2 <- Polygons(list(p2),2)

x <- c(30,45)
y <- c(70,80)
m <- expand.grid(x,y)
m <- m[c(1,2,4,3),]
p3 <- Polygon(m)
p3 <- Polygons(list(p3),3)


poly <- SpatialPolygons(list(p1,p2,p3))
#创建3个光栅示例

r这是我解决问题的方法:

library(rgeos)
rlist <- list(r1,r2,r3)

lapply(rlist, function(raster) {
  ei <- as(extent(raster), "SpatialPolygons")
  if (gContainsProperly(poly, ei)) {
    print ("fully within")
  } else if (gIntersects(poly, ei)) {
    print ("intersects")
  } else {
    print ("fully without")
  }
})
库(rgeos)

rlist您也可以为此使用
gRelate
。它返回一个代码,描述两个几何图形的内部、边界和外部组件之间的关系

library(rgeos)
x <- sapply(rlist, function(x) 
  gsub('[^F]', 'T', gRelate(as(extent(x), 'SpatialPolygons'), poly)))
它似乎比@Tedward稍快一些,但是@Tedward更容易理解,更符合GEOS的定义(尽管创建特定关系定义的能力可能是可取的)


DE-9IM字符串的元素按顺序表示:

  • 几何图形A的内部是否与几何图形B的内部相交
  • A的边界与B的内部相交吗
  • A的外部与B的内部相交吗
  • 几何体A的内部是否与几何体B的边界相交
  • A的边界与B的边界相交吗
  • A的外部与B的边界相交吗
  • 几何图形A的内部是否与几何图形B的外部相交
  • A的边界与B的外部相交吗
  • A的外部是否与B的外部相交

  • 通过删除
    print
    调用和
    proj4string
    分配,您将节省一点时间。谢谢,print调用只是占位符。我将调用一些其他函数。proj4string赋值的调用很好。(我的意思是你可以直接使用,例如,
    'fully-in'
    ,而不是
    print('fully-in')
    ,但是如果它们只是占位符,不用担心)明白了,很高兴知道。多谢!谢谢你对格雷特的解释。灵活性非常有用,值得了解。
    pat <- c(TFFTFFTTT='within', FFTFFTTTT='disjoint', TTTTTTTTT='overlaps')
    pat[x]
    
    ##  TFFTFFTTT  FFTFFTTTT  TTTTTTTTT 
    ##   "within" "disjoint"  "overlaps"