Какой самый быстрый способ обрезать (обрезать) сложный SpatialPolygonsDataFrame с @data
, сохраненным в R, с использованием другого, возможно, сложного, SpatialPolygon? Я знаю два пути (показано под). Способ raster
быстрее для менее сложных SpatialPolygonsDataFrames и возвращает SpatialPolygonsDataFrame, как в примере. Однако с большими SpatialPolygonsDataFrames он замедляется. Способ rgeos
быстрее для больших объектов SpatialPolygonsDataFrame, но иногда дает сбой при очень сложных геометриях и не возвращает SpatialPolygonsDataFrames по умолчанию.
В последнее время я не обращал внимания на разработку ГИС в R, и вполне возможно, что сейчас есть более быстрые способы сделать это.
Примеры полигонов малы, чтобы учитывать компьютеры людей и пропускную способность. Рассмотрим «настоящие» полигоны 50–1000 МБ.
Настройка:
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)))
Способ rgeos
:
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"
Способ raster
:
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"
Участок для ссылка (не имеет отношения к вопросу):
plot(out)