我有很多栅格,我想检查它们是否完全包含在空间多边形内,完全没有空间多边形,或者与空间多边形相交(这可能意味着多边形完全在栅格内,或多边形和光栅重叠).我正在做这个检查,以便在可能的情况下节省时间密集的屏蔽.
这是一个例子:
# 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))
绘制这些:
我将分别在每个栅格中读取并检查它是否在SpatialPolygons内,没有或相交.
您认为在R中最有效的方法是什么?我有数以千计的4mb栅格,我打算并行屏蔽,并希望这种检查可以加快速度.
请注意,还有这个问题:https://gis.stackexchange.com/questions/34535/detect-whether-there-is-a-spatial-polygon-in-a-spatial-extent
但是,我不认为它给出了我正在寻找的细节.例如,所有栅格都在空间多边形的范围内,但并非所有栅格都在空间多边形内.
像rgeos(gIntersects,gContains)中的函数可能会很方便.我不确定这些是否最有效,或者我应该如何将栅格(或它的范围)转换为sp对象.
谢谢!
你也可以用gRelate
它.它返回一个DE-9IM代码,描述两个几何的内部,边界和外部组件之间的关系.
library(rgeos) x <- sapply(rlist, function(x) gsub('[^F]', 'T', gRelate(as(extent(x), 'SpatialPolygons'), poly)))
然后,您可以将字符串与感兴趣的关系进行比较.例如,我们可以定义within
,disjoint
和overlaps
如下(但请注意,其他一些交叉点对于给定的关系是可选的 - "内部" 由GEOS定义为T*F**F***
"不相交" FF*FF****
,"重叠"为T*T***T**
):
pat <- c(TFFTFFTTT='within', FFTFFTTTT='disjoint', TTTTTTTTT='overlaps') pat[x] ## TFFTFFTTT FFTFFTTTT TTTTTTTTT ## "within" "disjoint" "overlaps"
这似乎略高于更快的gContainsProperly
/ gIntersects
方法,但@ Tedward的职位是更容易理解,并与GEOS定义更加一致(虽然力量创造特定关系的定义可能是可取的).
DE-9IM字符串的元素按顺序表示:
几何体A的内部是否与几何体B的内部相交?
A的边界是否与B的内部相交?
A的外部是否与B的内部相交?
几何体A的内部是否与几何体B的边界相交?
A的边界是否与B的边界相交?
A的外部是否与B的边界相交?
几何体A的内部是否与几何体B的外部相交?
A的边界是否与B的外部相交?
A的外部是否与B的外部相交?