检测栅格是否在SpatialPolygons对象内,没有或相交

时间:2016-01-08 21:35:17

标签: r sp r-raster

我有很多栅格,我想检查它们是否完全包含在空间多边形内,完全没有空间多边形,或者与空间多边形相交(这可能意味着多边形完全在栅格内,或者多边形和栅格重叠)。我正在做这个检查,以便在可能的情况下节省时间密集的掩蔽。

以下是一个例子:

                                      # 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))

绘制这些:

three rasters and three polygons

我将分别在每个栅格中读取并检查它是否在SpatialPolygons内,没有或相交。

您认为在R中最有效的方法是什么?我有数以千计的4mb栅格,我打算并行屏蔽,并希望这种检查可以加快速度。

注意,还有这个问题:https://gis.stackexchange.com/questions/34535/detect-whether-there-is-a-spatial-polygon-in-a-spatial-extent

但是,我不认为它给出了我正在寻找的细节。例如,所有栅格都位于空间多边形的范围内,但并非所有栅格都位于空间多边形内。

像rgeos(gIntersects,gContains)中的函数可能会很方便。我不确定这些是否最有效,或者我应该如何将栅格(或它的范围)转换为sp对象。

谢谢!

2 个答案:

答案 0 :(得分:7)

您也可以使用gRelate。它返回一个DE-9IM代码,描述两个几何的内部,边界和外部组件之间的关系。

library(rgeos)
x <- sapply(rlist, function(x) 
  gsub('[^F]', 'T', gRelate(as(extent(x), 'SpatialPolygons'), poly)))

然后,您可以将字符串与感兴趣的关系进行比较。例如,我们可以按如下方式定义withindisjointoverlaps(但请注意,对于给定的关系,其他一些交叉点是可选的 - “在...内”defined by GEOS为{{{}} 1}},“不相交”为T*F**F***,“重叠”为FF*FF****):

T*T***T**

它似乎比the gContainsProperly/gIntersects approach略快,但@Tedward的post更容易理解,并且更符合GEOS定义(尽管可能需要创建特定关系定义的权力)。

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

  1. 几何体A的内部是否与几何体B的内部相交?
  2. A的边界是否与B的内部相交?
  3. A的外部是否与B的内部相交?
  4. 几何体A的内部是否与几何体B的边界相交?
  5. A的边界是否与B的边界相交?
  6. A的外部是否与B的边界相交?
  7. 几何体A的内部是否与几何体B的外部相交?
  8. A的边界是否与B的外部相交?
  9. A的外部是否与B的外部相交?

答案 1 :(得分:3)

这就是我为解决问题所做的工作:

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")
  }
})

如果您知道更有效的解决方案,请告诉我。