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)