【发布时间】:2017-04-01 04:31:30
【问题描述】:
图胜于言,请关注
我拥有的是
- 一个 RasterLayer 对象(此处填充随机值仅用于说明目的,实际值无关紧要)
- 一个包含大量多边形的 SpatialPolygons 对象
您可以使用以下代码重新创建我用于图像的示例数据:
library(sp)
library(raster)
library(rgeos)
# create example raster
r <- raster(nrows=10, ncol=15, xmn=0, ymn=0)
values(r) <- sample(x=1:1000, size=150)
# create example (Spatial) Polygons
p1 <- Polygon(coords=matrix(c(50, 100, 100, 50, 50, 15, 15, 35, 35, 15), nrow=5, ncol=2), hole=FALSE)
p2 <- Polygon(coords=matrix(c(77, 123, 111, 77, 43, 57, 66, 43), nrow=4, ncol=2), hole=FALSE)
p3 <- Polygon(coords=matrix(c(110, 125, 125, 110, 67, 75, 80, 67), nrow=4, ncol=2), hole=FALSE)
lots.of.polygons <- SpatialPolygons(list(Polygons(list(p1, p2, p3), 1)))
crs(lots.of.polygons) <- crs(r) # copy crs from raster to polygons (please ignore any potential problems related to projections etc. for now)
# plot both
plot(r) #values in this raster for illustration purposes only
plot(lots.of.polygons, add=TRUE)
对于栅格中的每个像元,我想知道其中有多少被一个或多个多边形覆盖。或者实际上:栅格单元内所有多边形的面积,没有问题单元之外的区域。如果有多个多边形与一个单元格重叠,我只需要它们的组合区域。
以下代码可以满足我的要求,但需要一个多星期才能运行实际数据集:
# empty the example raster (don't need the values):
values(r) <- NA
# copy of r that will hold the results
r.results <- r
for (i in 1:ncell(r)){
r.cell <- r # fresh copy of the empty raster
r.cell[i] <- 1 # set the ith cell to 1
p <- rasterToPolygons(r.cell) # create a polygon that represents the i-th raster cell
cropped.polygons <- gIntersection(p, lots.of.polygons) # intersection of i-th raster cell and all SpatialPolygons
if (is.null(cropped.polygons)) {
r.results[i] <- NA # if there's no polygon intersecting this raster cell, just return NA ...
} else{
r.results[i] <- gArea(cropped.polygons) # ... otherwise return the area
}
}
plot(r.results)
plot(lots.of.polygons, add=TRUE)
我可以通过使用sapply 而不是for-loop 来加快速度,但瓶颈似乎在其他地方。整个方法感觉很尴尬,我想知道我是否遗漏了一些明显的东西。起初我认为rasterize() 应该能够轻松做到这一点,但我不知道在fun= 参数中放入什么。有任何想法吗?
【问题讨论】:
-
请注意[对于多边形,如果多边形覆盖栅格像元的中心,则会传输值。 ](cran.rstudio.com/web/packages/raster/raster.pdf)。您可以使用
foreach循环来使用您的多个内核(如果可用)。