답변:
st_intersection
아마도 가장 좋은 방법 일 것입니다. sf
객체가 입력과 교차 하는 데 가장 적합한 방법을 찾으십시오 . 다음은 편리 raster::extent
하고 오래된 것과 새로운 것을 혼합 하여 사용하는 방법 입니다. nc
만든 사람 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
이 정확히 일치하는 CRS를 필요로하지 않기 위해 동축 할 수 있다고 생각하지 않으므로 둘 다 NA로 설정하거나 동일하게하십시오. bbox / extent afaik를위한 쉬운 도구가 없기 때문에 래스터를 사용하면 작업을보다 쉽게 만들 수 있습니다.
spex::spex
를 교체하는 데 사용할 수 있습니다 st_as_sf(as(...))
. 또한 tmaptools::crop_shape()
이것을 할 수 있습니다.
sf
에 포함되어 있습니다 st_crop
. 자세한 내용은 답변을 참조하십시오.
또 다른 해결 방법은 나를 위해 더 큰 shapefile이 더 빠르다는 것입니다.
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()
접근 방식은 사용자 : 1.18, 시스템 : 0.05, 데이터 세트에서 1.23 경과했습니다 . (아마도 내 환경은 당신과 다르다. 확실하지 않다.)
sf
에 포함되어 있습니다 st_crop
. 자세한 내용은 답변을 참조하십시오.
함수로서 @mdsumner의 솔루션. rasta
RasterBrick, extent, bbox 등 이면 작동합니다 .
# 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)))
}
래스터 crs ()를 st_crs ()로 변환하는 방법을 모르기 때문에 래스터의 crs 정보를 버립니다.
내 컴퓨터와 내 데이터 샘플의 raster::crop
경우 SpatialLinesDataFrame 버전의 데이터와 동일한 성능을 제공 합니다.
@pbaylis의 솔루션은 약 2.5 배 느립니다.
# Slower option.
crop.sf2 = function(sfdf, rasta) {
st_as_sf(crop(as(sfdf, "Spatial"), rasta))
}
편집 : 누군가의 의견은 spex을 제안 합니다 . 이것은 ras에서 crs가있는 경우 SpatialPolygons를 생성합니다.
이 코드는 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
체크 아웃 할 가치 가있는 기능을 가지고 있습니다.
st_intersection
보냈지 만 스스로 해결할 수 없었습니다.