2012-01-03 10 views
8

Quindi ho un oggetto spazialpolygons in R; ma non sono sicuro del motivo per cui non riesco a recuperare lo slot "area" da esso.Ottenere il valore di uno slot per oggetti S4?

Ecco la mia sessione R:

> 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" 

risposta

16

Prima di tutto, si dovrebbe essere consapevoli del fatto che la fessura @area non è una fonte affidabile di informazioni sulla superficie reale di un oggetto SpatialPolygons*. Come indicato in ?"Polygons-class", lo slot @area viene utilizzato solo come aggiunta al tracciamento (impedendo che i poligoni più piccoli vengano dipinti da quelli più grandi) e non rispetta la proiezione né considera correttamente i buchi nei poligoni.

Per ottenere aree precise, è necessario utilizzare rgeos::gArea() per i livelli con sistemi di riferimento di coordinate proiettati o geosphere::areaPolygon() per quelli nei sistemi di riferimento di coordinate lat-long (ad esempio CRS(+proj=longlat)).

Con questi avvertimenti, il seguente mostra come è possibile ottenere il contenuto degli slot @area se lo si desidera effettivamente.


La complicazione principale è che la fessura area appartiene al poligono oggetto , non alla SpatialPolygons oggetto (di cui l'oggettopoligono è un elemento). È quindi necessario prima scavare nell'oggetto SpatialPolygons per estrarre i singoli oggetti Polygon.

Una volta fatto, è sufficiente utilizzare l'operatore @ per estrarre il contenuto dell'area.

L'esempio seguente utilizza le SpatialPolygons oggetto creato nella sezione 7 della sp package vignette (warning, pdf):

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

così per il mio caso in cui v'è solo 1 poligono, 'spacegoligoni @ poligoni [[1]] @ area' opere. –

+0

Esattamente, e felice che abbia funzionato per te. Lo aggiungerò alla risposta per completezza. –

+4

Solo per divertimento, funzionerebbe anche: 'slot (slot (Sp," poligoni ") [[1]]," area ")'. :) Puoi anche controllare i nomi degli slot con 'slotNames'. –

6

È possibile calcolare l'area con le funzioni nel pacchetto rgeos, esempi di seguito utilizzando i dati di esempio di Josh. Questo potrebbe essere più appropriato in quanto lo slot area è solo per la stampa.

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

Tutto in una volta:

gArea(SpP) 
[1] 17 

Il sistema di coordinate utilizzato dovrebbe essere considerato, questo è solo area geometrica grezzo.

Le pagine di aiuto descrivono lo slot area.

?gArea 
.... 

noti che questo valore può essere diverso dal ‘zona’ alloggiamento della classe ‘poligoni’ come questo valore non fa sottrarre l'area di fori nella geometria.

?"Polygons-class" 
... 

‘zona’: oggetto della classe ‘ "numerico"’; l'area planare totale lorda dell'elenco Poligono ma non i fori di conteggio doppio (modificati da 0,9-58 - le isole vengono sommate, i fori vengono ignorati piuttosto di quelli sottratti); questi valori sono utilizzati per fare in modo che poligoni di un'area più piccola sono tracciati dopo poligoni di una zona più grande, non rispetta la proiezione come oggetti di questa classe non hanno alcuna proiezione definito

+0

Molto buono da sapere su 'gArea' . Grazie per averlo aggiunto. –

+0

@mdsummer: ottimo suggerimento. GRAZIE! –

Problemi correlati