Yanıtlar:
st_intersectionmuhtemelen en iyi yoldur. Bir sfnesnenin girdinizle kesişmesini sağlamak için en iyi yolu bulun . İşte raster::extenteski ve yeninin rahatlığını ve bir karışımını kullanmanın bir yolu . nctarafı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_intersectionTam 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::spexdeğiştirmek için kullanabilirsiniz st_as_sf(as(...)). Ayrıca, tmaptools::crop_shape()bunu yapabilir.
sfşimdi, st_cropayrı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_bboxKı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_cropayrıntılar için cevabım bakın.
@ mdsumner'ın bir işlevi olarak çözümü. Works eğer rastabir 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::cropMakinemde 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_cropmuhtemelen kontrol edilmeye değer bir işleve sahiptir.
st_intersectionama kendim çözemedim.