Odpowiedzi:
st_intersection
jest prawdopodobnie najlepszym sposobem. Znajdź sposób, który działa najlepiej, aby sf
obiekt przecinał się z wprowadzonymi danymi. Oto sposób korzystania z wygody raster::extent
i połączenia starego i nowego. nc
jest tworzony przez example(st_read)
:
st_intersection(nc, st_set_crs(st_as_sf(as(raster::extent(-82, -80, 35, 36), "SpatialPolygons")), st_crs(nc)))
Nie sądzę, abyś mógł się przekonać, st_intersection
aby nie potrzebować dokładnie pasującego CRS, więc albo ustaw je na NA, albo upewnij się, że są takie same. Nie ma łatwych narzędzi do bbox / scope afaik, więc użycie rastra jest dobrym sposobem na uproszczenie.
spex::spex
aby zastąpić st_as_sf(as(...))
połączenie. Również tmaptools::crop_shape()
mogę to zrobić.
sf
zawiera teraz st_crop
, zobacz moją odpowiedź, aby uzyskać szczegółowe informacje.
Od dzisiaj istnieje st_crop
funkcja w wersji github sf
( devtools::install_github("r-spatial/sf")
prawdopodobnie na CRAN również w najbliższej przyszłości).
Wystarczy wydać:
st_crop(nc, c(xmin=-82, xmax=-80, ymin=35, ymax=36))
Wektor musi być nazwany za pomocą xmin xmax ymin ymax
(w dowolnej kolejności).
Możesz także użyć dowolnego obiektu, który można odczytać, st_bbox
jako ograniczenia kadrowania, co jest bardzo przydatne.
Kolejne obejście, dla mnie było szybsze dla większych plików kształtów:
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()
podejście było użytkownikiem: 1,18, system: 0,05, minęło 1,23 w zbiorze danych. (Prawdopodobnie moje środowisko różni się od twojego ... nie jestem pewien.)
sf
zawiera teraz st_crop
, zobacz moją odpowiedź, aby uzyskać szczegółowe informacje.
@ Rozwiązanie mdsumner jako funkcja. Działa, jeśli rasta
jest to RasterBrick, zakres, bbox itp.
# 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)))
}
Wyrzuca informacje CRS o rastrze, ponieważ nie wiem jak przekonwertować CRS raster () na st_crs ()
Na moim komputerze i dla mojej próbki danych ma to wydajność równoważną raster::crop
z wersją danych SpatialLinesDataFrame.
Rozwiązanie @ pbaylis jest około 2,5 razy wolniejsze:
# Slower option.
crop.sf2 = function(sfdf, rasta) {
st_as_sf(crop(as(sfdf, "Spatial"), rasta))
}
Edycja: Komentarz Somebodies sugeruje spex , który tworzy SpatialPolygons z crs z rasta, jeśli ma crs.
Ten kod używa tej samej metody co 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
funkcję, którą prawdopodobnie warto sprawdzić.
st_intersection
ale sam nie mogłem tego rozwiązać.