回答:
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
、詳細については私の答えを参照してください。
別の回避策、私にとっては、大きなシェープファイルの方が高速でした:
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()をst_crs()に変換する方法がわからないため、ラスターのcrs情報を破棄します。
私のマシンとデータサンプルraster::crop
では、SpatialLinesDataFrameバージョンのデータと同等のパフォーマンスが得られます。
@pbaylisのソリューションは約2.5倍遅くなります。
# Slower option.
crop.sf2 = function(sfdf, rasta) {
st_as_sf(crop(as(sfdf, "Spatial"), rasta))
}
編集:Somebodiesコメントはspexを示唆しています。これは、crsがある場合、ラスタから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
が、自分で解決できませんでした。