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보냈지 만 스스로 해결할 수 없었습니다.
Kazuhito

이제 통화 spex::spex를 교체하는 데 사용할 수 있습니다 st_as_sf(as(...)). 또한 tmaptools::crop_shape()이것을 할 수 있습니다.
AF7

1
sf에 포함되어 있습니다 st_crop. 자세한 내용은 답변을 참조하십시오.
AF7

22

오늘부터 하는 존재 st_crop의 GitHub의 버전 기능 sf( devtools::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

또 다른 해결 방법은 나를 위해 더 큰 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)

감사. raster :: crop ()과 st_as_sf () ... + 1의 조합으로 흥미로운 워크 플로입니다. 향후 버전의 sf 에서 crop ()과 같이 쉽게 액세스 할 수있는 이런 종류의 함수를 가질 수 있기를 바랍니다 . 속도와 관련하여 함수를 사용하여 system.time을 빠르게 실행하면 사용자 : 5.42, 시스템 : 0.09, 경과 5.52 , st_intersection()접근 방식은 사용자 : 1.18, 시스템 : 0.05, 데이터 세트에서 1.23 경과했습니다 . (아마도 내 환경은 당신과 다르다. 확실하지 않다.)
Kazuhito

흥미 롭습니다. st_intersection 접근법은 약 80 년대가 걸립니다.
pbaylis

sp geometry 객체에 적용될 때 raster :: crop 함수는 rgeos 함수의 래퍼 역할을합니다. 매우 편리한 래퍼이지만. GEOS API는 WKT 객체에서 작동하므로 sf 오버레이 작업의 표준이 될 것입니다.
Jeffrey Evans

1
sf는 이제 0.5-1 cran.r-project.org/web/packages/sf/news.html 에 내장 된 "공간 인덱스"기능을 가지고 있으므로 sp / rgeos보다 빠릅니다.
mdsumner

1
sf에 포함되어 있습니다 st_crop. 자세한 내용은 답변을 참조하십시오.
AF7

1

함수로서 @mdsumner의 솔루션. rastaRasterBrick, 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))
}

sf는 이제 st_crop체크 아웃 할 가치 가있는 기능을 가지고 있습니다.
cmc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.