Yanıtlar:
st_intersection
muhtemelen en iyi yoldur. Bir sf
nesnenin girdinizle kesişmesini sağlamak için en iyi yolu bulun . İşte raster::extent
eski ve yeninin rahatlığını ve bir karışımını kullanmanın bir yolu . nc
tarafından oluşturuldu example(st_read)
:
st_intersection(nc, st_set_crs(st_as_sf(as(raster::extent(-82, -80, 35, 36), "SpatialPolygons")), st_crs(nc)))
st_intersection
Tam eşleşen bir CRS'ye ihtiyaç duymayacağınızı sanmıyorum , bu yüzden ikisini de NA olarak ayarlayın veya aynı olduklarından emin olun. Bbox / ölçüde afaik için kolay bir araç yoktur, bu nedenle raster kullanmak işleri kolaylaştırmak için iyi bir yoldur.
spex::spex
değiştirmek için kullanabilirsiniz st_as_sf(as(...))
. Ayrıca, tmaptools::crop_shape()
bunu yapabilir.
sf
şimdi, st_crop
ayrıntılar için cevabım bakın.
Bugünden berist_crop
, github versiyonunda bir fonksiyon var sf
( devtools::install_github("r-spatial/sf")
muhtemelen yakın gelecekte CRAN'da da).
Sadece sorun:
st_crop(nc, c(xmin=-82, xmax=-80, ymin=35, ymax=36))
Vektör gerekir ile adlandırılabilir xmin xmax ymin ymax
(hangisi sırayla).
st_bbox
Kırpma sınırları olarak okunabilen herhangi bir nesneyi de kullanabilirsiniz , bu da çok kullanışlıdır.
Başka bir çözüm, benim için daha büyük şekil dosyaları için daha hızlıydı:
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()
yaklaşım kullanıcı: 1.18, sistem: 0.05, veri kümenizde 1.23'ü geçti . (Muhtemelen
sf
şimdi, st_crop
ayrıntılar için cevabım bakın.
@ mdsumner'ın bir işlevi olarak çözümü. Works eğer rasta
bir RasterBrick, kapsamı, BBOX vb
# 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)))
}
Raster crs bilgilerini atar çünkü raster crs () st_crs () dönüştürmek nasıl bilmiyorum
raster::crop
Makinemde ve veri örneğimde bu, verilerin bir SpatialLinesDataFrame sürümüyle eşdeğer performansa sahiptir .
@ pbaylis'in çözümü yaklaşık 2,5 kat daha yavaştır:
# Slower option.
crop.sf2 = function(sfdf, rasta) {
st_as_sf(crop(as(sfdf, "Spatial"), rasta))
}
Düzenleme: Somebodies comment anlaşılacağı Spex bir CR'leri varsa, rasta gelen crs ile SpatialPolygons üretir.
Bu kod spex ile aynı yöntemi kullanır:
# 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
muhtemelen kontrol edilmeye değer bir işleve sahiptir.
st_intersection
ama kendim çözemedim.