【发布时间】:2018-06-17 12:24:42
【问题描述】:
我无法在 R 上获取两个大型 SpatialPolygonsDataFrame 之间的交集。我的多边形数据代表建筑物和行政边界,我正在尝试获取它们之间的交集多边形。
我知道 raster 包中的 intersect 函数和 rgeos 包中的 gIntersection 可以完成这项工作(有一些差异),但它们不能一次处理我的所有多边形(大约 50.000 个多边形/实体)。
出于这个原因,我必须在一个循环中拆分我的计算,保存每个步骤的结果。问题是:这些功能不断填满我的物理内存,我无法清理它。我尝试使用 rm() 和 gc(),但它并没有改变任何事情。内存问题使我的 R 会话崩溃,我无法进行计算。
有没有办法在模拟期间在循环中释放 RAM?还是为了避免这个内存问题?
这里有一个可重现的例子,用于随机多边形。
library(raster)
library(sp)
library(rgeos)
#Generating 50000 points (for smaller polygons) and 150000 (for larger polygons) in a square of side 100000
size=100000
Nb_points1=50000
Nb_points2=150000
start_point=matrix(c(sample(x = 1:size,size = Nb_points1,replace = T),sample(x = 1:size,size = Nb_points1,replace = T)),ncol=2)
start_point2=matrix(c(sample(x = 1:size,size = Nb_points2,replace = T),sample(x = 1:size,size = Nb_points2,replace = T)),ncol=2)
#Defining different sides length
radius=sample(x = 1:50,size = Nb_points1,replace = T)
radius2=sample(x = 1:150,size = Nb_points2,replace = T)
#Generating list of polygons coordinates
coords=list()
for(y in 1:Nb_points1){
xmin=max(0,start_point[y,1]-radius[y])
xmax=min(size,start_point[y,1]+radius[y])
ymin=max(0,start_point[y,2]-radius[y])
ymax=min(size,start_point[y,2]+radius[y])
coords[[y]]=matrix(c(xmin,xmin,xmax,xmax,ymin,ymax,ymax,ymin),ncol=2)
}
coords2=list()
for(y in 1:Nb_points2){
xmin=max(0,start_point2[y,1]-radius2[y])
xmax=min(size,start_point2[y,1]+radius2[y])
ymin=max(0,start_point2[y,2]-radius2[y])
ymax=min(size,start_point2[y,2]+radius2[y])
coords2[[y]]=matrix(c(xmin,xmin,xmax,xmax,ymin,ymax,ymax,ymin),ncol=2)
}
#Generating 75000 polygons
Poly=SpatialPolygons(Srl = lapply(1:Nb_points1,function(y) Polygons(srl = list(Polygon(coords=coords[y],hole = F)),ID = y)),proj4string = CRS('+init=epsg:2154'))
Poly2=SpatialPolygons(Srl = lapply(1:Nb_points2,function(y)Polygons(srl = list(Polygon(coords=coords2[y],hole = F)),ID = y)),proj4string = CRS('+init=epsg:2154'))
#Union of overlapping polygons
aaa=gUnionCascaded(Poly)
bbb=gUnionCascaded(Poly2)
aaa=disaggregate(aaa)
bbb=disaggregate(bbb)
intersection=gIntersects(spgeom1 = aaa,bbb,byid = T,returnDense = F)
#Loop on the intersect function
pb <- txtProgressBar(min = 0, max = ceiling(length(aaa)/1000), style = 3)
for(j in 1:ceiling(length(aaa)/1000)){
tmp_aaa=aaa[((j-1)*1000+1):(j*1000),]
tmp_bbb=bbb[unique(unlist(intersection[((j-1)*1000+1):(j*1000)])),]
List_inter=intersect(tmp_aaa,tmp_bbb)
gc()
gc()
gc()
setTxtProgressBar(pb, j)
}
谢谢!
【问题讨论】:
-
为避免内存问题,您可以切换到
gdalUtils。 -
我不知道这个包。你能帮我吗?什么功能可以帮助我?我没有看到任何关于记忆或交叉点的信息。
-
gdalUtils是一个非常好的和有用的包,但在这里没有帮助。主要是玩光栅。您使用 raster 包,但不是在 raster 上,所以我怀疑它会有所帮助。 -
R 对于大型 GIS 的东西来说效率不高。我经常喜欢使用 R 作为基础来调用其他软件。为此,
RSAGA是我最喜欢的,其次是RQGIS,而不是更复杂的RGRASS7。都需要你安装相应的软件(可以用OSGEO4W一键搞定)。他们应该成功地完成你的任务。我现在有点忙,如果以后有机会我会发布一个例子。