R में बहुभुज आकार का उपयोग करके रेखापुंज से रेखापुंज निकालें


13

मैं आर पैकेज के लिए नया हूँ और आरस्टर का उपयोग कर रहा हूँ। मुझे मौजूदा रैस्टर फ़ाइल से पॉलीगॉन निकालने में समस्या है। अगर मैं उपयोग करता हूं

extract(raster, poly_shape)

रेखापुंज पर कार्य यह हमेशा डेटा के साथ एक सूची बनाता है। मैं वास्तव में चाहता हूं कि एक और रेखापुंज फ़ाइल निकाली जाए जिसे मैं आर्कगिस के साथ फिर से लोड कर सकूं। थोड़ा और पढ़ने के बाद मुझे लगता है कि फसल का कार्य वही है जिसकी मुझे वास्तव में आवश्यकता है। लेकिन जब मैं इस फ़ंक्शन का उपयोग करने का प्रयास करता हूं

crop(raster, poly_shape)

मुझे यह त्रुटि मिलती है:

Error in .local(x, y, ...) : extents do not overlap
In addition: Warning message:
In intersect(extent(x), extent(y)) : Objects do not overlap

फ़ाइलें raster और poly_shape दोनों फ़ंक्शन के लिए समान हैं। क्या आप बता सकते हैं कि यहां क्या गलत हो सकता है? क्या यह भी सही है कि फसल कार्य एक और रेखापुंज बनाता है और सूची नहीं?

संपादित करें : हद () फ़ंक्शन मेरे लिए काम नहीं करता है। मुझे अब भी वही त्रुटि मिलती है। लेकिन मुझे यकीन है कि 2 डेटासेट ओवरलैप हैं! उसके साथ

extract(raster, poly_shape)

मुझे इससे सही डेटा मिलता है। बस एक सूची के रूप में और एक रेखापुंज के रूप में नहीं, जैसे कि मैं यह करना चाहता हूं। मैंने पहले आर्कगिस में डेटासेट लोड किया था और वे बहुत अच्छी तरह से फिट थे इसलिए मैंने प्रोजेक्शन की जांच नहीं की। अब मैंने कोशिश की

projection(raster) # "+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs"
projection(poly_shape) # "+proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs"

और आप देख सकते हैं कि अनुमान फिट नहीं हैं। निकालने का कार्य सही तरीके से फ़ाइलों को स्वचालित रूप से बदलने में सक्षम प्रतीत होता है। मुझे पता है कि क्योंकि मैंने निम्नलिखित किया है:

  • मैं बहुभुज का सटीक हिस्सा काटता हूं जिसे मैंने आरजीसीआईएस में भी आर में निकाला था
  • मैंने निकाले गए आर बहुभुज (सूची) के सभी मूल्यों की राशि की गणना की
  • मैंने उन सभी रैस्टर कोशिकाओं के योग की गणना की, जिन्हें मैंने आर्कगिस में काटा

2 का एक ही परिणाम है, इसलिए मुझे लगता है कि निष्कर्ष यह होना चाहिए कि निकालने का कार्य सही था। अब मेरे पास 2 विकल्प हैं जो मुझे लगता है:

  1. मुझे फिर से निकाली गई सूची से एक रेखापुंज प्राप्त करने का एक तरीका चाहिए या
  2. 2 डेटासेट (रेखापुंज + पॉली_शैप) को एक ही आपत्ति का उपयोग करने की आवश्यकता होती है और फसल कार्य करना चाहिए

आप यहां क्या करने का सुझाव देंगे?


क्या होगा अगर यह एक 4 बैंड rgbi रेखापुंज है? बैंड अब तक खो रहे हैं ...
डोरिस

GIS SE में आपका स्वागत है! एक नए उपयोगकर्ता के रूप में, कृपया लघु भ्रमण अवश्य करें । फिर अतिरिक्त जानकारी और संदर्भ प्रदान करने के लिए अपने उत्तर को संपादित करने पर विचार करें। देखिए मैं एक अच्छा उत्तर कैसे लिखूं? अधिक जानकारी के लिए।
एंडी

यदि आपके पास कोई नया प्रश्न है, तो कृपया प्रश्न पूछें बटन पर क्लिक करके पूछें । इस प्रश्न का लिंक शामिल करें यदि यह संदर्भ प्रदान करने में मदद करता है। - समीक्षा से
एरिक

जवाबों:


19

निकालने का कार्य ठीक वैसा ही व्यवहार कर रहा है जैसा उसे करना चाहिए। आप बहुभुज की सीमा का उपयोग करने के लिए फसल फ़ंक्शन को बाध्य कर सकते हैं और फिर बहुभुज क्षेत्र का प्रतिनिधित्व करने वाले सटीक रेखापुंज को वापस करने के लिए ऑब्जेक्ट को मुखौटा कर सकते हैं। यदि आप त्रुटि प्राप्त करना जारी रखते हैं तो इसका मतलब है कि आपका डेटा, वास्तव में, ओवरलैप नहीं है।

कृपया ध्यान रखें कि आर "प्रदर्शन पर" प्रक्षेपण नहीं करता है, इसलिए अपने अनुमानों की जांच करें। आप जाँच सकते हैं कि क्या आपके विस्तार "हद ()" फ़ंक्शन का उपयोग करते हुए ओवरलैप करते हैं।

यहां बहुभुज सीमा का उपयोग करके क्रॉप करने का एक उदाहरण है, जिसके परिणामस्वरूप "रैस्टराइज़्ड" बहुभुज का उपयोग करके रिस्टर को मास्क किया जाता है।

# Add required packages
require(raster)
require(rgeos)
require(sp)

# Create some data using meuse 
data(meuse)
  coordinates(meuse) <- ~x+y
    proj4string(meuse) <- CRS("+init=epsg:28992")
data(meuse.grid)
  coordinates(meuse.grid) = ~x+y
    proj4string(meuse.grid) <- CRS("+init=epsg:28992")
      gridded(meuse.grid) = TRUE    
        r <- raster(meuse.grid) 
          r[] <- runif(ncell(r))

# Create a polygon
f <- gBuffer(meuse[10,], byid=FALSE, id=NULL, width=250, 
                         joinStyle="ROUND", quadsegs=10)   

# Plot full raster and polygon                       
plot(r)
  plot(f,add=T)

# Crop using extent, rasterize polygon and finally, create poly-raster
#          **** This is the code that you are after ****  
cr <- crop(r, extent(f), snap="out")                    
  fr <- rasterize(f, cr)   
    lr <- mask(x=cr, mask=fr)

# Plot results
plot(lr)
  plot(f,add=T)

4
अर्क () मक्खी की अस्वीकृति पर प्रदर्शन करता है , लेकिन फसल () नहीं करता है। यह कुछ भ्रम का कारण हो सकता है
mdsumner

@ जेफरी की फसल () और मुखौटा () केवल बहुभुज के आयताकार extents के अनुसार रेखापुंज को क्लिप करता है यह बहुभुज की सीमा के भीतर से इसे क्लिप नहीं करता है। कोई भी विचार क्या कमांड दिए गए बहुभुज की सीमा के भीतर रेखापुंज को क्लिप कर सकता है?
सीएसथ

1
@ चिन्तन शेठ, बहुभुज के भीतर मुखौटे के लिए आपको बहुभुज के मानों का प्रतिनिधित्व करने के लिए एक रास्टर होना चाहिए। यही कारण है कि आप सबसेट बहुभुज को फिर से व्यवस्थित करते हैं और फिर इसे मुखौटा करते हैं। फसल का कदम रैस्टर की सीमा को उसी तरह कम करना है जैसे कि सबसेट बहुभुज, जो अतीत में, अगर छोड़ दिया जाता है, तो एक हद तक बेमेल त्रुटि होती है।
जेफरी इवांस

spTransformसे spपैकेज (है कि कभी कभी अपने आप अन्य स्थानिक आर संकुल से भरा हुआ है) पुनः प्रक्षेपण के लिए अनुमति देता है, ताकि दोनों फ़ाइलों को एक ही प्रक्षेपण जैसे में हैं। good_poly=spTransform(spolygon, CRSobj=crs(raster_file))
user3386170

@ user3386170, हुह? निश्चित नहीं है कि आपको क्या मिल रहा है। यह सवाल ऐसे समय में हुआ जब रैस्टर पैकेज ने अपने कार्यों के दौरान "फ्लाई प्रोजेक्शन पर" जोड़ा। इन कार्यों को पहले अनुमान में त्रुटि आई थी जब अनुमानों का मिलान नहीं हुआ था, लेकिन यह पोस्ट 2014 से था। आपको sp :: spTransform () का उपयोग करते समय हमेशा rgdal लोड करने के बारे में पता होना चाहिए, क्योंकि यह दृश्यों के पीछे अतिरिक्त, महत्वपूर्ण, कार्यक्षमता जोड़ता है।
जेफरी इवांस

8

वास्तव में मैंने जो खोजा था वह mask()फ़ंक्शन था ।

mask(raster, poly_shape)

त्रुटियों के बिना काम करता है और जो मैंने खोजा था उसे वापस करता है।


2
अपने डेटा को फिर से शुरू करें ताकि यह एक ही प्रक्षेपण स्थान पर हो। यहां तक ​​कि आर्कजीआईएस में, जहां मक्खी प्रक्षेपण स्वचालित है, विभिन्न अनुमानों में विश्लेषण करने के लिए बहुत बुरा अभ्यास है। विभिन्न अनुमानों में डेटा के साथ, आप डेटा को सामान्य एक्स्टेंट साझा नहीं करेंगे, जो कि आपको प्राप्त होने वाली त्रुटि है।
जेफरी इवांस

रैस्टर क्रॉप करने के लिए बस हद तक जाने के लिए प्रोजेक्टएक्स्टेंट () का उपयोग करें।
mdsumner

साइट के क्यू एंड ए प्रारूप को फिट करने के लिए इसे प्रश्न के मुख्य निकाय में एक संपादित / अद्यतन के रूप में रखा जाना चाहिए (और फिर उत्तर में एक टिप्पणी जोड़ें यह "उत्तर" में है ताकि उन्हें पता चल जाए कि यह देखने के लिए अधिक है)।
मैट विल्की

@mattwilkie प्रारूप को ठीक नहीं करने के लिए क्षमा करें, लेकिन मेरा पाठ यहां टिप्पणी के रूप में पोस्ट करने के लिए बहुत लंबा था। @JeffreyEvans मैंने निम्नलिखित प्रयास किया: projection(raster) = projection(poly_shape)और दूसरा तरीका projection(poly_shape) = projection(raster)लेकिन दोनों ही तरीके एक ही त्रुटि उत्पन्न करते हैं Error in .local(x, y, ...) : extents do not overlap In addition: Warning message: In intersect(extent(x), extent(y)) : Objects do not overlap:। क्या कोई तरीका है कि मैं यह कैसे देख सकता हूं कि अर्क () फ़ंक्शन का उपयोग करके मक्खी पर किस प्रक्षेपण का उपयोग किया जाता है (क्योंकि यह स्पष्ट रूप से काम करता है)?
लार्स

1
वास्तव में मैंने जो खोजा था वह मुखौटा () फ़ंक्शन था। mask(raster, poly_shape)त्रुटियों के बिना काम करता है और जो मैंने खोजा था उसे वापस करता है।
लार्स

-1

एक्स्टेंट ठीक काम करता है ... मुझे लगता है कि आपकी सीमा के Xmin, Xmax, Ymin, और Ymax आपके रेखापुंज के X और Y से भिन्न हैं - अर्थात वे इसके विपरीत सेट हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.