Answers:
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,范围,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信息,因为我不知道如何将栅格crs()转换为st_crs()
在我的机器上以及对于我的数据样本,这具有raster::crop
与SpatialLinesDataFrame版本的数据等效的性能。
@pbaylis的解决方案慢了大约2.5倍:
# Slower option.
crop.sf2 = function(sfdf, rasta) {
st_as_sf(crop(as(sfdf, "Spatial"), rasta))
}
编辑:某人评论建议spex,如果有crs,它将从rasta产生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
但自己解决不了。