R 使用其他多边形裁剪/剪裁复杂空间多边形数据帧的最快方法

R 使用其他多边形裁剪/剪裁复杂空间多边形数据帧的最快方法,r,performance,gis,spatial,r-raster,R,Performance,Gis,Spatial,R Raster,使用另一个(可能是复杂的)空间多边形裁剪(剪裁)复杂空间多边形数据帧的最快方法是什么?我知道两种方法(如下所示)。对于不太复杂的空间多边形数据帧,光栅方式更快,并返回一个空间多边形数据帧,如示例所示。不过,使用大型空间多边形帧时速度会变慢。对于大型SpatialPolygonsDataFrame,rgeos方式更快,但不会将SpatialPolygonsDataFrames作为默认值返回 我最近没有注意到R中的GIS开发,现在可能有更快的方法来实现这一点 示例多边形很小,以表彰人们的计算机和带宽

使用另一个(可能是复杂的)空间多边形裁剪(剪裁)复杂空间多边形数据帧的最快方法是什么?我知道两种方法(如下所示)。对于不太复杂的空间多边形数据帧,
光栅
方式更快,并返回一个空间多边形数据帧,如示例所示。不过,使用大型空间多边形帧时速度会变慢。对于大型SpatialPolygonsDataFrame,
rgeos
方式更快,但不会将SpatialPolygonsDataFrames作为默认值返回

我最近没有注意到R中的GIS开发,现在可能有更快的方法来实现这一点

示例多边形很小,以表彰人们的计算机和带宽。考虑“真实”多边形50-1000 MB。 设置:

library(rnaturalearth)
library(sp)
library(raster)
library(rgeos)

dt <- rnaturalearth::ne_countries()
clip_boundary <- sp::SpatialPolygons(list(sp::Polygons(
list(sp::Polygon(data.frame(lon = c(0, 180, 180, 0), lat = c(40, 40, 80, 80)))), ID = 1)))
光栅的
方式:

system.time({
clipped.dt <- rgeos::gIntersection(dt, clip_boundary, byid = TRUE)
ids <- sapply(slot(clipped.dt, "polygons"), function(x) slot(x, "ID"))
ids <- sapply(strsplit(ids, " "), "[", 1) 

tmp.df <- data.frame(dt@data[ids,])
names(tmp.df) <- names(dt@data)

out <- sp::SpatialPolygonsDataFrame(clipped.dt, tmp.df, match.ID = FALSE)
})

#   user  system elapsed 
#  0.069   0.002   0.074 

class(out)
# [1] "SpatialPolygonsDataFrame"
# attr(,"package")
# [1] "sp"
system.time({
  out <- raster::crop(dt, clip_boundary)
})

#   user  system elapsed 
#  0.042   0.001   0.043 

class(out)
# [1] "SpatialPolygonsDataFrame"
# attr(,"package")
# [1] "sp"

R的大部分地理空间工作现在可以使用
sf
软件包来完成

看起来它可能比光栅和sp更快

库(rnaturalearth)
图书馆(sp)
#图书馆(光栅)
#图书馆(rgeos)
图书馆(sf)
#>链接到GEOS 3.7.2、GDAL 2.4.2、项目5.2.0
图书馆(GG2)
#原始数据
dt几何
#>用户系统运行时间
#>   0.019   0.000   0.018
系统时间({
光栅中的out警告::裁剪(dt,裁剪_边界):不相同的CR
#>用户系统运行时间
#>   0.526   0.000   0.525
系统时间({

clipped.dt感谢您指出
sf
包。我没有想到。在我使用裁剪的应用程序中,形状必须以
sp
格式返回。转换使
sf
解决方案比
rgeos
解决方案稍微慢一点(我有一个数据集的系统时间:
rgeos
~7秒、
sf
~9秒和
graster
>80秒)。但是,如果已经使用
sf
对象进行操作,那么您的建议可能是目前为止最快的。在接受您的回答之前,我会将问题保留一段时间。可能有人提出了一个我们没有想到的更快的解决方案。
sp
->
sf
sp
会减慢速度。我没有意识到
sp
在你的情况下是一个要求。R通常不是很快,但你总是可以扔一台更大的计算机。我发现
sf
进行空间运算的方法确实比
sp
直观得多。祝你好运。
plot(out)