Risposte:
st_intersection
è probabilmente il modo migliore. Trova il modo migliore per far sf
intersecare un oggetto con il tuo input. Ecco un modo per usare la convenienza raster::extent
e un mix di vecchio e nuovo. nc
è creato da example(st_read)
:
st_intersection(nc, st_set_crs(st_as_sf(as(raster::extent(-82, -80, 35, 36), "SpatialPolygons")), st_crs(nc)))
Non penso che tu possa convincerti st_intersection
a non aver bisogno di un CRS di corrispondenza esatta, quindi imposta entrambi su NA o assicurati che siano uguali. Non ci sono strumenti facili per bbox / extension afaik, quindi usare raster è un buon modo per rendere le cose facili.
spex::spex
per sostituire la st_as_sf(as(...))
chiamata. Inoltre, tmaptools::crop_shape()
puoi farlo.
sf
ora include st_crop
, vedere la mia risposta per i dettagli.
Da oggi esiste una st_crop
funzione nella versione github di sf
( devtools::install_github("r-spatial/sf")
, probabilmente anche su CRAN nel prossimo futuro).
Emetti solo:
st_crop(nc, c(xmin=-82, xmax=-80, ymin=35, ymax=36))
Il vettore deve essere nominato con xmin xmax ymin ymax
(in qualunque ordine).
Puoi anche usare qualsiasi oggetto che può essere letto st_bbox
come limite di ritaglio, il che è molto utile.
Un'altra soluzione alternativa, per me è stato più veloce per gli shapefile più grandi:
library(sf)
library(raster)
library(rgeos)
library(ggplot2)
# Load National Forest shapefile
# https://data.fs.usda.gov/geodata/edw/edw_resources/shp/S_USA.AdministrativeForest.zip
nf.poly <- st_read("S_USA.AdministrativeForest"), "S_USA.AdministrativeForest")
crop_custom <- function(poly.sf) {
poly.sp <- as(poly.sf, "Spatial")
poly.sp.crop <- crop(poly.sp, extent(c(-82, -80, 35, 36)))
st_as_sf(poly.sp.crop)
}
cropped <- crop_custom(nf.poly)
st_intersection()
approccio era utente: 1.18, sistema: 0.05, trascorso 1.23 sul tuo set di dati. (Probabilmente il mio ambiente è diverso dal tuo ... non sono sicuro.)
sf
ora include st_crop
, vedere la mia risposta per i dettagli.
La soluzione di @ mdsumner in funzione. Funziona se rasta
è un RasterBrick, un ext, un bbox, ecc.
# Crop a Simple Features Data Frame to the extent of a raster
crop.sf = function(sfdf, rasta) {
st_intersection(sfdf, st_set_crs(st_as_sf(as(extent(rasta), "SpatialPolygons")), st_crs(sfdf)))
}
Elimina le informazioni crs del raster perché non so come convertire un crs raster () in uno st_crs ()
Sulla mia macchina e per il mio campione di dati questo ha prestazioni equivalenti a quelle raster::crop
con una versione SpatialLinesDataFrame dei dati.
La soluzione di @ pbaylis è circa 2,5 volte più lenta:
# Slower option.
crop.sf2 = function(sfdf, rasta) {
st_as_sf(crop(as(sfdf, "Spatial"), rasta))
}
Modifica: il commento di Somebodies suggerisce spex , che produce SpatialPolygons con i crs della rasta, se ha un crs.
Questo codice utilizza lo stesso metodo di spex:
# Crop a Simple Features Data Frame to the extent of a raster
crop.sf3 <- function(sfdf, rasta) {
# Get extent and crs
ext.sp <- as(extent(rasta), "SpatialPolygons")
crs(ext.sp) <- crs(rasta)
# crop
st_intersection(sfdf, st_as_sf(ext.sp))
}
st_crop
funzione che probabilmente vale la pena provare.
st_intersection
ma non sono riuscito a risolverlo da solo.