Câu trả lời:
st_intersection
có lẽ là cách tốt nhất Tìm mọi cách hoạt động tốt nhất để khiến một sf
đối tượng giao nhau với đầu vào của bạn. Đây là một cách sử dụng sự tiện lợi raster::extent
và pha trộn giữa cũ và mới. nc
được tạo bởi example(st_read)
:
st_intersection(nc, st_set_crs(st_as_sf(as(raster::extent(-82, -80, 35, 36), "SpatialPolygons")), st_crs(nc)))
Tôi không nghĩ rằng bạn có thể dỗ st_intersection
không cần CRS phù hợp chính xác, vì vậy hoặc đặt cả hai thành NA hoặc đảm bảo chúng giống nhau. Không có công cụ dễ dàng nào cho bbox / mức độ afaik, vì vậy sử dụng raster là cách tốt để khiến mọi thứ trở nên dễ dàng.
spex::spex
để thay thế st_as_sf(as(...))
cuộc gọi. Ngoài ra, tmaptools::crop_shape()
có thể làm điều này.
sf
bây giờ bao gồm st_crop
, xem câu trả lời của tôi để biết chi tiết.
Kể từ hôm nay , có một st_crop
chức năng trong phiên bản github của sf
( devtools::install_github("r-spatial/sf")
có lẽ trên CRAN trong tương lai gần).
Chỉ cần phát hành:
st_crop(nc, c(xmin=-82, xmax=-80, ymin=35, ymax=36))
Các vectơ phải được đặt tên với xmin xmax ymin ymax
(theo thứ tự nào).
Bạn cũng có thể sử dụng bất kỳ đối tượng nào có thể được đọc bằng st_bbox
giới hạn cắt xén, rất tiện dụng.
Một cách giải quyết khác, đối với tôi, nó nhanh hơn đối với các shapefile lớn hơn:
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()
cách tiếp cận là người dùng: 1,18, hệ thống: 0,05, trôi qua 1,23 trên tập dữ liệu của bạn. (Có lẽ môi trường của tôi khác với bạn ... không chắc chắn.)
sf
bây giờ bao gồm st_crop
, xem câu trả lời của tôi để biết chi tiết.
@ mdsumner là một giải pháp. Hoạt động nếu rasta
là RasterBrick, mức độ, bbox, v.v.
# 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)))
}
Nó sẽ loại bỏ thông tin crs của raster vì tôi không biết cách chuyển đổi raster crs () thành st_crs ()
Trên máy của tôi và cho mẫu dữ liệu của tôi, nó có hiệu suất tương đương raster::crop
với phiên bản dữ liệu SpatialLinesDataFrame.
Giải pháp của @ pbaylis chậm hơn khoảng 2,5 lần:
# Slower option.
crop.sf2 = function(sfdf, rasta) {
st_as_sf(crop(as(sfdf, "Spatial"), rasta))
}
Chỉnh sửa: Nhận xét của Sombody gợi ý spex , nơi tạo ra SpatialPolygons với các crs từ rasta, nếu nó có crs.
Mã này sử dụng cùng một phương thức như 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
chức năng có thể đáng để kiểm tra.
st_intersection
nhưng không thể tự giải quyết nó.