我希望这不是太微不足道,但我真的无法找到答案,而且对于这个话题来说我太新了,无法想出替代方案。所以这就是问题:
我有两个shapefile x和y代表Sentinel2卫星图像的不同处理级别。 x包含大约1.300.000个多边形/完全覆盖图像的分段,没有任何其他重要信息 y包含大约500个多边形,代表图像的无云区域(也覆盖了大部分图像,除了少数"云洞")以及有关4列中使用图像的信息(传感器,时间......)
我试图将图像信息添加到x中的位置x被y覆盖。很简单?我只是找不到一种方法,可以在不花费数天的情况下实现它。
我将x作为一个简单的特征{sf}读取,因为使用shapefile / readOGR读取它需要很长时间。 我用y尝试了不同的东西
当我尝试合并(x,y)时,我只能拿一个sf,因为合并并不支持两个sf' s。 合并x(作为sf)和y(作为shp)给出了错误"不能分配大小为13.0 Gb的矢量"
所以我尝试了sf :: st_join(x,y),它支持两个变量为sf,但现在还没有完成28小时
对于10.000段子集,sf :: st_intersect(x,y)花费了大约9分钟,因此对于整个片段来说可能不会快得多。
可以将x子集化为几个小块解决整个事情还是有另一个简单的解决方案?我可以对我的工作区做些什么来使合并工作,或者根本没有加入那些多边形的快捷方式?
提前多多感谢,我希望我的描述不会太模糊!
我的小工作站:
赢得7 64位 8 GB RAM intel i7-4790 @ 3,6 GHz干杯, 的Matthias
答案 0 :(得分:2)
我经常遇到这种问题,正如@ manotheshark2所说的那样,我更喜欢在一个循环中处理我的矢量图层。以下是我的建议:
加载您的数据
library(raster)
library(rgdal)
x <- readOGR('C:/', 'sentinelCovers')
y <- readOGR('C:/', 'cloudHoles')
指定y ID以识别哪些x多边形与y多边形相交并在x表中创建列
x$xyID <- NA # Answer col
y$yID <- 1:nrow(y@data) # ID col
运行一个子循环x
for (posX in 1:nrow(x@data)){
pol.x <- x[posX, ]
intX <- raster::intersect(pol.x, y)
# x$xyID[posX] <- intX@data$yID ## Run this if there's unique y polygons
# x$xyID[posX] <- paste0(intX@data$yID, collapse = ',') ## Run this if there's multiple y polygons
}
您可以检查是否更好地在x o y层上运行循环
x$xyID <- NA # Answer col
x$xID <- 1:nrow(x@data) # ID Col
for (posY in 1:nrow(y@data)){
pol.y <- y[posY, ]
intY <- tryCatch(raster::intersect(pol.y, x), finally = 'NULL')
if (is.null(intY)) next
x$xyID[x@data$xID %in% intY@data$xID] <- pol.y$yID
}