Respostas:
st_intersection
é provavelmente o melhor caminho. Encontre a melhor maneira de fazer com que um sf
objeto se cruze com sua entrada. Aqui está uma maneira de usar a conveniência raster::extent
e uma mistura de antigo e novo. nc
é criado por example(st_read)
:
st_intersection(nc, st_set_crs(st_as_sf(as(raster::extent(-82, -80, 35, 36), "SpatialPolygons")), st_crs(nc)))
Eu não acho que você pode convencer st_intersection
a não precisar de um CRS correspondente exato; portanto, defina-os como NA ou verifique se são iguais. Não há ferramentas fáceis para o bbox / extension afaik, portanto, usar o raster é uma boa maneira de facilitar as coisas.
spex::spex
para substituir a st_as_sf(as(...))
chamada. Além disso, tmaptools::crop_shape()
pode fazer isso.
sf
agora inclui st_crop
, veja minha resposta para detalhes.
Desde hoje , existe uma st_crop
função na versão github de sf
( devtools::install_github("r-spatial/sf")
, provavelmente também no CRAN no futuro próximo).
Basta emitir:
st_crop(nc, c(xmin=-82, xmax=-80, ymin=35, ymax=36))
O vetor deve ser nomeado com xmin xmax ymin ymax
(em qualquer ordem).
Você também pode usar qualquer objeto que possa ser lido st_bbox
como limites de corte, o que é muito útil.
Outra solução alternativa, para mim, foi mais rápida para arquivos de forma maiores:
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()
abordagem foi user: 1,18, sistema: 0,05, decorrido 1,23 no seu conjunto de dados. (Provavelmente o meu ambiente é diferente com o seu ... não tenho certeza.)
sf
agora inclui st_crop
, veja minha resposta para detalhes.
A solução do @ mdsumner como uma função. Funciona se rasta
for um RasterBrick, extensão, 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)))
}
Ele joga fora as informações crs da varredura, porque não sei como converter uma varredura crs () em st_crs ()
Na minha máquina e para minha amostra de dados, isso tem desempenho equivalente ao de raster::crop
uma versão SpatialLinesDataFrame dos dados.
A solução do @ pbaylis é cerca de 2,5 vezes mais lenta:
# Slower option.
crop.sf2 = function(sfdf, rasta) {
st_as_sf(crop(as(sfdf, "Spatial"), rasta))
}
Edit: Somebodies comment sugere spex , que produz SpatialPolygons com os crs do rasta, se ele tiver um crs.
Este código usa o mesmo 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
função que provavelmente vale a pena conferir.
st_intersection
mas não consegui resolver sozinho.