Rのシンプルフィーチャオブジェクトを切り取る


20

maptools::pruneMap(lines, xlim= c(4, 10), ylim= c(10, 15))SpatialPolygonまたはSpatialLine に使用されるような、sfマップオブジェクトを切り取る機能はありますか?

私は検討してst_intersection()いますが、適切な方法があります。

回答:


17

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用の簡単なツールはありません。そのため、ラスターを使用すると、物事が簡単になります。


本当にありがとう@mdsumner、それは魅力のように働いた。何時間も費やしましたst_intersectionが、自分で解決できませんでした。
和人

これでspex::spexst_as_sf(as(...))通話を置き換えることができます。また、tmaptools::crop_shape()これを行うことができます。
AF7

1
sf今含まれていますst_crop、詳細については私の答えを参照してください。
AF7

22

今日以来st_crop、のgithubバージョンに関数がありますsfdevtools::install_github("r-spatial/sf")おそらく、近い将来CRANでも)。

ただ発行する:

st_crop(nc, c(xmin=-82, xmax=-80, ymin=35, ymax=36))

ベクトルにxmin xmax ymin ymax(どちらの順序でも)名前を付ける必要あります。

またst_bbox、トリミング限界として読み取ることができる任意のオブジェクトを使用できます。これは非常に便利です。


5

別の回避策、私にとっては、大きなシェープファイルの方が高速でした:

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)

ありがとう。興味深いワークフローであり、私からのraster :: crop()とst_as_sf()... + 1の組み合わせです。sfの将来のバージョンでcrop()のようなこの種の容易にアクセス可能な関数があればいいのにと思います。速度に関しては、関数を使用した system.timeのクイックランでは、データセットでユーザー:5.42、システム:0.09、経過5.52st_intersection()アプローチはユーザー:1.18、システム:0.05、経過1.23でした。(おそらく、私の環境はあなたのものとは異なります...確かではありません。)
Kazuhito

それは興味深いです-st_intersectionアプローチは、私にとって80年代ほどかかります。
pbaylis

raster :: crop関数は、spジオメトリオブジェクトに適用されると、rgeos関数のラッパーとして機能することに注意してください。とはいえ、非常に便利なラッパーです。GEOS APIはWKTオブジェクトで動作するため、常にsfオーバーレイ操作の標準になります。
ジェフリーエヴァンス

1
そして時間とともに変化し、sfには「空間インデックス」が0.5-1 cran.r-project.org/web/packages/sf/news.htmlに組み込まれている ため、おそらくsp / rgeosよりも高速です。
mdsumner

1
sf今含まれていますst_crop、詳細については私の答えを参照してください。
AF7

1

関数としての@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))
}

sfには、st_cropおそらくチェックアウトする価値のある機能があります。
cmc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.