Respuestas:
st_intersection
Es probablemente la mejor manera. Encuentre la forma que funcione mejor para lograr que un sf
objeto se cruce con su entrada. Aquí hay una manera de usar la comodidad raster::extent
y una combinación de lo antiguo y lo nuevo. nc
es creado por example(st_read)
:
st_intersection(nc, st_set_crs(st_as_sf(as(raster::extent(-82, -80, 35, 36), "SpatialPolygons")), st_crs(nc)))
No creo que pueda convencer st_intersection
para que no necesite un CRS que coincida exactamente, por lo tanto, establezca ambos en NA o asegúrese de que sean iguales. No hay herramientas fáciles para bbox / extensión afaik, por lo que usar raster es una buena manera de facilitar las cosas.
spex::spex
para reemplazar la st_as_sf(as(...))
llamada. Además, tmaptools::crop_shape()
puede hacer esto.
sf
ahora incluye st_crop
, mira mi respuesta para más detalles.
Desde hoy , hay una st_crop
función en la versión de github de sf
( devtools::install_github("r-spatial/sf")
, probablemente en CRAN en el futuro cercano también).
Solo emite:
st_crop(nc, c(xmin=-82, xmax=-80, ymin=35, ymax=36))
El vector debe ser nombrado con xmin xmax ymin ymax
(en cualquier orden).
También puede usar cualquier objeto que pueda leerse st_bbox
como límite de recorte, lo cual es muy útil.
Otra solución, para mí fue más rápido para archivos de forma más grandes:
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()
enfoque fue usuario: 1.18, sistema: 0.05, transcurrió 1.23 en su conjunto de datos. (Probablemente mi entorno es diferente al suyo ... no estoy seguro.)
sf
ahora incluye st_crop
, mira mi respuesta para más detalles.
La solución de @ mdsumner como función. Funciona si rasta
es un RasterBrick, extensión, bbox, etc.
# 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)))
}
Descarta la información crs del ráster porque no sé cómo convertir un ráster crs () en un st_crs ()
En mi máquina y para mi muestra de datos, esto tiene un rendimiento equivalente al raster::crop
de una versión SpatialLinesDataFrame de los datos.
La solución de @ pbaylis es aproximadamente 2.5 veces más lenta:
# Slower option.
crop.sf2 = function(sfdf, rasta) {
st_as_sf(crop(as(sfdf, "Spatial"), rasta))
}
Editar: el comentario de Somebodies sugiere spex , que produce SpatialPolygons con los crs del rasta, si tiene un crs.
Este código usa el mismo método que 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
función que probablemente valga la pena revisar.
st_intersection
pero no pude resolverlo yo mismo.