Jawaban:
st_intersection
mungkin cara terbaik. Temukan cara apa pun yang terbaik untuk mendapatkan sf
objek yang bersinggungan dengan input Anda. Inilah cara menggunakan kenyamanan raster::extent
dan campuran lama dan baru. nc
dibuat 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_intersection
untuk 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::spex
untuk mengganti st_as_sf(as(...))
panggilan. Juga, tmaptools::crop_shape()
bisa melakukan ini.
sf
sekarang termasuk st_crop
, lihat jawaban saya untuk detail.
Sejak hari ini , ada st_crop
fungsi 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_bbox
sebagai 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.)
sf
sekarang termasuk st_crop
, lihat jawaban saya untuk detail.
Solusi @ mdsumner sebagai fungsi. Bekerja jika rasta
RasterBrick, 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::crop
dengan 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_crop
fungsi yang mungkin perlu dicoba.
st_intersection
tetapi tidak bisa menyelesaikannya sendiri.