มีฟังก์ชั่นการครอบตัดวัตถุแผนที่ 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แต่ก็แก้ปัญหาเองไม่ได้