Відповіді:
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 / масштабу afaik, тому використання растрових є хорошим способом полегшити роботу.
spex::spex
для заміни st_as_sf(as(...))
дзвінка. Також tmaptools::crop_shape()
може це зробити.
sf
Тепер включає st_crop
, див детальну інформацію про мою відповідь
Оскільки сьогодні існує 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
як обмеження обрізання, що дуже зручно.
Ще одне вирішення, для мене це було швидше для великих форм файлів:
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 , який виробляє SpatialPolygons з crs з раста, якщо він має crs.
Цей код використовує той самий метод, що і 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
але не міг вирішити це сам.