R 两个简单特征{sf}上的空间连接超过1 mil。尽可能快地输入

R 两个简单特征{sf}上的空间连接超过1 mil。尽可能快地输入,r,join,shapefile,rgdal,sf,R,Join,Shapefile,Rgdal,Sf,我希望这不是太琐碎,但我真的找不到答案,而且我对这个话题太陌生,自己也没办法想出替代方案。问题是: 我有两个形状文件x和y,它们代表Sentinel2卫星图像的不同处理级别。 x包含约1.300.000个完全覆盖图像的多边形/段,无需任何其他重要信息。 y包含约500个多边形,表示图像的无云区域(也包括除少数“云孔”外的大部分图像),以及4列(传感器、时间…)中所用图像的信息 我正在尝试将图像信息添加到x中x被y覆盖的位置。很简单?我就是找不到不花几天时间就能实现的方法 我将x作为一个简单的特性

我希望这不是太琐碎,但我真的找不到答案,而且我对这个话题太陌生,自己也没办法想出替代方案。问题是:

我有两个形状文件x和y,它们代表Sentinel2卫星图像的不同处理级别。 x包含约1.300.000个完全覆盖图像的多边形/段,无需任何其他重要信息。
y包含约500个多边形,表示图像的无云区域(也包括除少数“云孔”外的大部分图像),以及4列(传感器、时间…)中所用图像的信息

我正在尝试将图像信息添加到x中x被y覆盖的位置。很简单?我就是找不到不花几天时间就能实现的方法

我将x作为一个简单的特性{sf}来读取,因为使用shapefile/readOGR读取它需要很长时间。 我试过不同的方法

当我尝试合并(x,y)时,我只能接受一个sf,因为合并不支持两个sf。 合并x(作为sf)和y(作为shp)会产生错误“无法分配大小为13.0 Gb的向量”

所以我尝试了
sf::st_join(x,y)
,它支持两个变量都是sf,但现在28小时都没有完成

sf::st_intersect(x,y)
花了大约9分钟制作一个10.000段的子集,所以整个片段的速度可能不会快很多

将x细分为几个较小的部分可以解决整个问题,还是有另一个简单的解决方案?我可以对我的工作区做些什么来让合并生效吗?或者根本没有捷径来连接那么多的多边形

提前谢谢,我希望我的描述不要太模糊

我的小工作站:
win 7 64位
8GB内存

英特尔i7-4790@3,6 GHz

我经常面临此类问题,作为@manotheshark2 afirms,我更喜欢在向量层的子循环中工作。以下是我的建议:

加载数据

library(raster)
library(rgdal)
x <- readOGR('C:/', 'sentinelCovers')
y <- readOGR('C:/', 'cloudHoles')
库(光栅)
图书馆(rgdal)

您可能希望通过子集更新shapefile。存在y的子集x,然后将所需信息保存到x中。不过,如果您展示示例数据和所需的输出,则会更容易。感谢您的回答和帮助!在x上运行循环会返回x$xyID[pos.x]中的“错误”哦,对不起。我的代码有一个错误。请通过
posX
更改
pos.x
。关于y层循环中的错误,可能有一些我还没有考虑的数据异常。如果数据不是很重,也许我可以检查它以查找错误。代码在哪个迭代中停止?例如,关于
sf::st_intersection()
函数你说得对。它比光栅函数快,谢谢!!使用这个函数,x和y应该使用
x加载
x$xyID <- NA # Answer col
y$yID <- 1:nrow(y@data) # ID col
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$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
}