ครอบตัดคุณลักษณะวัตถุอย่างง่ายใน R


20

มีฟังก์ชั่นการครอบตัดวัตถุแผนที่ sf คล้ายกับที่maptools::pruneMap(lines, xlim= c(4, 10), ylim= c(10, 15))ใช้สำหรับ SpatialPolygon หรือ SpatialLine หรือไม่

ฉันกำลังพิจารณา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 / ขอบเขต afaik ดังนั้นการใช้แรสเตอร์จึงเป็นวิธีที่ดีในการทำให้สิ่งต่าง ๆ เป็นเรื่องง่าย


ขอบคุณ @mdsumner มากมันใช้งานได้อย่างมีเสน่ห์ ฉันใช้เวลาหลายชั่วโมงst_intersectionแต่ก็แก้ปัญหาเองไม่ได้
Kazuhito

ตอนนี้คุณสามารถใช้spex::spexเพื่อแทนที่การst_as_sf(as(...))โทร นอกจากนี้tmaptools::crop_shape()สามารถทำได้
AF7

1
sfตอนนี้รวมถึงst_cropดูคำตอบของฉันสำหรับรายละเอียด
AF7

23

ตั้งแต่วันนี้มี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

วิธีแก้ปัญหาอื่นสำหรับฉันมันเร็วขึ้นสำหรับรูปร่างที่ใหญ่กว่า:

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 จากฉัน ฉันหวังว่าเราสามารถมีชนิดของฟังก์ชั่นเข้าถึงได้อย่างง่ายดายเช่นนี้พืช () ในรุ่นอนาคตของเอสเอฟ สำหรับความเร็วนั้นการรัน system.time อย่างรวดเร็วพร้อมกับฟังก์ชั่นของคุณคือรายงานผู้ใช้: 5.42, ระบบ: 0.09, ผ่านไป 5.52ในขณะที่st_intersection()วิธีการคือผู้ใช้: 1.18, ระบบ: 0.05, ผ่านไป 1.23บนชุดข้อมูลของคุณ (อาจเป็นเพราะสภาพแวดล้อมของฉันแตกต่างกับของคุณ ... ไม่แน่ใจ)
Kazuhito

นั่นน่าสนใจ - วิธี st_intersection ใช้เวลาประมาณ 80s สำหรับฉัน
pbaylis

โปรดทราบว่าฟังก์ชันครอบตัด raster :: เมื่อนำไปใช้กับวัตถุรูปทรงเรขาคณิต sp ทำหน้าที่ห่อหุ้มสำหรับฟังก์ชัน rgeos แม้ว่าเสื้อคลุมที่สะดวกมาก GEOS API ทำงานบนวัตถุ WKT ดังนั้นจะคงเป็นมาตรฐานสำหรับการปฏิบัติการซ้อนทับของเอสเอฟ
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 เป็นฟังก์ชั่น ทำงานได้ถ้า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))
}

sf ตอนนี้มีst_cropฟังก์ชั่นที่น่าจะน่าลองใช้
cmc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.