Ответы:
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))
}
Редактировать: Комментарий Somebody предлагает 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
но не мог решить это сам.