空间连接两个简单的特征{sf}超过1密耳。条目尽快

时间:2017-04-05 11:53:41

标签: r join shapefile rgdal sf

我希望这不是太微不足道,但我真的无法找到答案,而且对于这个话题来说我太新了,无法想出替代方案。所以这就是问题:

我有两个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

1 个答案:

答案 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
}