มีฟังก์ชั่นการครอบตัดวัตถุแผนที่ sf คล้ายกับที่maptools::pruneMap(lines, xlim= c(4, 10), ylim= c(10, 15))
ใช้สำหรับ SpatialPolygon หรือ SpatialLine หรือไม่
ฉันกำลังพิจารณาst_intersection()
แต่อาจมีวิธีที่เหมาะสม
มีฟังก์ชั่นการครอบตัดวัตถุแผนที่ sf คล้ายกับที่maptools::pruneMap(lines, xlim= c(4, 10), ylim= c(10, 15))
ใช้สำหรับ SpatialPolygon หรือ SpatialLine หรือไม่
ฉันกำลังพิจารณาst_intersection()
แต่อาจมีวิธีที่เหมาะสม
คำตอบ:
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 ของแรสเตอร์เพราะฉันไม่รู้วิธีแปลง raster 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 จาก rasta ถ้ามี 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
แต่ก็แก้ปัญหาเองไม่ได้