2012-01-03 14 views
8

तो मेरे पास आर में एक spatialpolygons वस्तु है; लेकिन मुझे यकीन नहीं है कि मैं इससे "क्षेत्र" स्लॉट पुनर्प्राप्त करने में असमर्थ क्यों हूं।एस 4 ऑब्जेक्ट्स का स्लॉट का मूल्य प्राप्त करना?

> spatialpolygons 
An object of class "SpatialPolygons" 
Slot "polygons": 
[[1]] 
An object of class "Polygons" 
Slot "Polygons": 
[[1]] 
An object of class "Polygon" 
Slot "labpt": 
[1] 20.50516 57.72918 

Slot "area": 
[1] 36.85484 

Slot "hole": 
[1] FALSE 

Slot "ringDir": 
[1] 1 

Slot "coords": 
     [,1]  [,2] 
[1,] 16.48438 59.73633 
[2,] 22.59277 61.14258 
[3,] 24.74609 55.03418 
[4,] 17.49512 55.12207 
[5,] 16.48438 59.73633 



Slot "plotOrder": 
[1] 1 

Slot "labpt": 
[1] 20.50516 57.72918 

Slot "ID": 
[1] "myMultiPolygons" 

Slot "area": 
[1] 36.85484 



Slot "plotOrder": 
[1] 1 

Slot "bbox": 
     min  max 
x 16.48438 24.74609 
y 55.03418 61.14258 

Slot "proj4string": 
CRS arguments: 
+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 

> [email protected] 
     min  max 
x 16.48438 24.74609 
y 55.03418 61.14258 
> [email protected] 
Error: no slot of name "area" for this object of class "SpatialPolygons" 
> slotNames(spatialpolygons) 
[1] "polygons" "plotOrder" "bbox"  "proj4string" 
> names(spatialpolygons) 
[1] "myMultiPolygons" 

उत्तर

16

सबसे पहले, आप जानते हैं कि @area स्लॉट एक SpatialPolygons* वस्तु के वास्तविक क्षेत्र के बारे में जानकारी का एक विश्वसनीय स्रोत नहीं है किया जाना चाहिए:

यहाँ मेरी आर सत्र है। जैसा कि ?"Polygons-class" में उल्लेख किया गया है, @area स्लॉट का उपयोग केवल साजिश के लिए एक सहायक के रूप में किया जाता है (छोटे बहुभुजों को बड़े पैमाने पर चित्रित करने से रोकना) और बहुभुज में छेद के लिए प्रक्षेपण या उचित खाते का सम्मान नहीं करता है।

सटीक क्षेत्रों को प्राप्त करने के लिए, आपको अनुमानित समन्वय संदर्भ प्रणाली या geosphere::areaPolygon() के साथ परतों के लिए rgeos::gArea() का उपयोग करना चाहिए, जो लंबे समय तक समन्वय संदर्भ प्रणाली (यानी CRS(+proj=longlat)) में हैं।

उन चेतावनियों के साथ, निम्नलिखित दिखाता है कि आप @area स्लॉट की सामग्री कैसे प्राप्त कर सकते हैं यदि आप वास्तव में उन्हें चाहते हैं।


मुख्य उलझन है कि क्षेत्र स्लॉट, बहुभुज वस्तु के अंतर्गत आता है SpatialPolygons वस्तु (जिनमें से बहुभुज वस्तु एक तत्व है) करने के लिए नहीं है। इस प्रकार आपको पहले स्पैटलियल पॉलीगन्स ऑब्जेक्ट को पॉलीगॉन ऑब्जेक्ट (ओं) में निकालने के लिए ऑब्जेक्ट करने की आवश्यकता है।

एक ऐसा करने के लिए, आप क्षेत्र स्लॉट की सामग्री निकालने के लिए केवल @ ऑपरेटर का उपयोग कर सकते हैं।

निम्न उदाहरण SpatialPolygons वस्तु sp package vignette (warning, pdf) की धारा 7 में बनाया का उपयोग करता है:

require(sp) 
# Example pasted in from Section 7 of the sp vignette 
Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2))) 
Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2))) 
Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5))) 
Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE) 
Srs1 = Polygons(list(Sr1), "s1") 
Srs2 = Polygons(list(Sr2), "s2") 
Srs3 = Polygons(list(Sr3, Sr4), "s3/4") 
SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3) 

# To extract the area of the first (or in your case only) Polygon 
[email protected][[1]]@area 
# [1] 5.5 

# Extract the areas of all three component Polygons 
sapply([email protected], function(x) [email protected]) 
# [1] 5.5 1.5 10.0 

## For areas, rgeos::gArea() or geosphere::areaPolygons() are generally more appropriate 
## (Note, for instance, that it properly accounts for the hole in the 3rd polygon.) 
rgeos::gArea(SpP, byid=TRUE) 
# s1 s2 s3/4 
# 5.5 1.5 9.0 
+0

तो जहां है केवल 1 बहुभुज, 'spatialpolygons @ बहुभुज [[1]] @ क्षेत्र' काम करता है। –

+0

बिल्कुल, और खुशी है कि यह आपके लिए काम करता है। मैं इसे पूर्णता के उत्तर में जोड़ दूंगा। –

+4

बस मस्ती के लिए, यह भी काम करेगा: 'स्लॉट (स्लॉट (एसपी, "बहुभुज") [[1]], "क्षेत्र") '। :) आप 'स्लॉटनाम' के साथ स्लॉट नामों की भी जांच कर सकते हैं। –

6

आप rgeos पैकेज में काम करता है, जोश उदाहरण डेटा का उपयोग कर नीचे दिए गए उदाहरणों के साथ क्षेत्रफल की गणना कर सकते हैं। यह अधिक उचित हो सकता है क्योंकि area स्लॉट केवल साजिश के लिए है।

library(rgeos) 
gArea(SpP[1,]) 
## [1] 5.5 
gArea(SpP[2,]) 
##[1] 1.5 
gArea(SpP[3,]) 
## [1] 10 

सभी एक ही बार में:

gArea(SpP) 
[1] 17 

उपयोग में समन्वय प्रणाली विचार किया जाना चाहिए, यह सिर्फ कच्चे ज्यामितीय क्षेत्र है।

सहायता पृष्ठ area स्लॉट पर चर्चा करते हैं।

?gArea 
.... 

ध्यान दें कि यह मूल्य 'क्षेत्र' 'बहुभुज' वर्ग के इस मूल्य ज्यामिति में किसी भी छेद के क्षेत्र घटाना नहीं है के रूप में स्लॉट से अलग हो सकता।

?"Polygons-class" 
... 

'क्षेत्र': वर्ग के ' "सांख्यिक"' वस्तु; पॉलीगॉन सूची के सकल कुल प्लानर क्षेत्र लेकिन डबल-गिनती छेद नहीं (0-0.9-58 से बदल दिया गया है - द्वीपों को सारांशित किया गया है, छेद को घटाए जाने से पहले अनदेखा किया जाता है); इन मूल्यों प्रक्षेपण सम्मान नहीं करता है, यह सुनिश्चित करें कि एक छोटे क्षेत्र के बहुभुज एक बड़े क्षेत्र के बहुभुज के बाद साजिश रची है बनाने के लिए उपयोग किया जाता है के रूप में इस वर्ग की वस्तुओं कोई प्रक्षेपण मेरे मामले के लिए परिभाषित

+0

'garea' के बारे में जानना बहुत अच्छा है । इसे जोड़ने के लिए धन्यवाद। –

+0

@mdsummer: कमाल की नोक। धन्यवाद! –

संबंधित मुद्दे