आर में सरल सरल वस्तु ऑब्जेक्ट


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एक सटीक मिलान सीआरएस की आवश्यकता नहीं कर सकते हैं , इसलिए दोनों को NA पर सेट करें या सुनिश्चित करें कि वे समान हैं। बॉक्स / हद एफॉइक के लिए कोई आसान उपकरण नहीं है, इसलिए रास्टर का उपयोग चीजों को आसान-ईश बनाने के लिए अच्छा तरीका है।


बहुत बहुत धन्यवाद @mdsumner, यह एक आकर्षण की तरह काम किया। मैंने घंटों बिताए st_intersectionलेकिन खुद इसे हल नहीं कर सका।
कज़ुहितो

अब आप कॉल spex::spexको बदलने के लिए उपयोग कर सकते हैं st_as_sf(as(...))। इसके अलावा, tmaptools::crop_shape()यह कर सकते हैं।
AF7

1
sfअब इसमें शामिल हैं st_crop, विवरण के लिए मेरा उत्तर देखें।
AF7

23

आज के बाद , ( शायद निकट भविष्य में भी CRAN पर) st_cropके github संस्करण में एक समारोह है ।sfdevtools::install_github("r-spatial/sf")

बस मुद्दा:

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)

धन्यवाद। यह दिलचस्प वर्कफ़्लो है, रास्टर का संयोजन :: फसल () और st_as_sf () ... + 1 मुझसे। काश, हम भविष्य में एसएफ के भविष्य के संस्करणों (जैसे) में फसल की तरह आसानी से उपलब्ध हो सकें । गति के रूप में, आपके फ़ंक्शन के साथ system.time का एक त्वरित रन उपयोगकर्ता को सूचित करता है : 5.42, सिस्टम: 0.09, बीता हुआ 5.52 , जबकि st_intersection()दृष्टिकोण उपयोगकर्ता था : 1.18, सिस्टम: 0.05, आपके डेटासेट पर 1.23 समाप्त हो गया। (संभवतः मेरा वातावरण आपके साथ अलग है ... निश्चित नहीं है।)
कज़ुहितो

यह दिलचस्प है - st_intersection दृष्टिकोण मेरे लिए लगभग 80s लेता है।
pbaylis

ध्यान रखें कि रेखापुंज :: फसल कार्य, जब ज्यामिति वस्तुओं को लागू करने के लिए लागू किया जाता है, तो रेगेस कार्यों के लिए एक आवरण कार्य करता है। अलबेत, एक बहुत सुविधाजनक आवरण। GEOS API WKT ऑब्जेक्ट्स पर काम करता है, इसलिए हमेशा sf ओवरले ऑपरेशन के लिए एक मानक होगा।
जेफरी इवांस

1
और यह समय के साथ बदलता है, sf के पास अब "स्थानिक अनुक्रमण" है, जो अंतर्निहित 0.5-1 cran.r-project.org/web/packages/sf/news.html में है, इसलिए शायद अब sp / rgeos से तेज़ है।
मॉडसमर

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 के समान विधि का उपयोग करता है:

# 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फंक्शन है जो शायद चेक आउट करने लायक है।
सेमी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.