Jawaban:
st_intersectionmungkin cara terbaik. Temukan cara apa pun yang terbaik untuk mendapatkan sfobjek yang bersinggungan dengan input Anda. Inilah cara menggunakan kenyamanan raster::extentdan campuran lama dan baru. ncdibuat oleh example(st_read):
st_intersection(nc, st_set_crs(st_as_sf(as(raster::extent(-82, -80, 35, 36), "SpatialPolygons")), st_crs(nc)))
Saya tidak berpikir Anda bisa membujuk st_intersectionuntuk tidak membutuhkan CRS yang cocok, jadi atur keduanya menjadi NA atau pastikan keduanya sama. Tidak ada alat yang mudah untuk bbox / afaik tingkat, jadi menggunakan raster adalah cara yang baik untuk membuat semuanya menjadi mudah.
spex::spexuntuk mengganti st_as_sf(as(...))panggilan. Juga, tmaptools::crop_shape()bisa melakukan ini.
sfsekarang termasuk st_crop, lihat jawaban saya untuk detail.
Sejak hari ini , ada st_cropfungsi dalam versi github sf( devtools::install_github("r-spatial/sf"), mungkin pada CRAN dalam waktu dekat juga).
Hanya masalah:
st_crop(nc, c(xmin=-82, xmax=-80, ymin=35, ymax=36))
Vektor harus dinamai dengan xmin xmax ymin ymax(dalam urutan apa pun).
Anda juga dapat menggunakan objek apa pun yang dapat dibaca st_bboxsebagai batas pemangkasan, yang sangat berguna.
Solusi lain, bagi saya lebih cepat untuk shapefile yang lebih besar:
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()pendekatan adalah pengguna: 1,18, sistem: 0,05, berlalu 1,23 pada dataset Anda. (Mungkin lingkungan saya berbeda dengan lingkungan Anda ... tidak yakin.)
sfsekarang termasuk st_crop, lihat jawaban saya untuk detail.
Solusi @ mdsumner sebagai fungsi. Bekerja jika rastaRasterBrick, luas, bbox, dll.
# 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)))
}
Itu membuang informasi crs dari raster karena saya tidak tahu bagaimana mengubah raster crs () menjadi st_crs ()
Di mesin saya dan untuk sampel data saya ini memiliki kinerja setara raster::cropdengan versi data SpatialLinesDataFrame.
Solusi @ pbaylis sekitar 2,5 kali lebih lambat:
# Slower option.
crop.sf2 = function(sfdf, rasta) {
st_as_sf(crop(as(sfdf, "Spatial"), rasta))
}
Sunting: Komentar Somebodies menyarankan spex , yang menghasilkan SpatialPolygons dengan cr dari rasta, jika memiliki crs.
Kode ini menggunakan metode yang sama dengan 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_cropfungsi yang mungkin perlu dicoba.
st_intersectiontetapi tidak bisa menyelesaikannya sendiri.