2012-01-03 7 views
8

Así que tengo un objeto spatialpolygons en R; pero no estoy seguro de por qué no puedo recuperar el espacio de "área".Obteniendo el valor de una ranura de objetos S4?

Aquí es mi R sesión:

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

Respuesta

16

primer lugar, usted debe ser consciente de que la ranura @area no es una fuente fiable de información sobre el área real de un objeto SpatialPolygons*. Como se indica en ?"Polygons-class", la ranura @area se usa solo como un complemento para el trazado (lo que evita que los polígonos pequeños se pinten con los más grandes) y no respeta la proyección ni cuenta correctamente de agujeros en los polígonos.

Para obtener áreas precisas, en su lugar debe usar rgeos::gArea() para las capas de coordenadas proyectadas con sistemas de referencia o geosphere::areaPolygon() para aquellos en los sistemas de coordenadas de referencia lat-larga (es decir CRS(+proj=longlat)).

Con esas advertencias fuera del camino, a continuación se muestra cómo se puede obtener el contenido de las ranuras @area si de hecho las desea.


La principal complicación es que la ranura zona pertenece al polígono objeto , no a la SpatialPolygons objeto (de la que el objetopolígono es un elemento). Por lo tanto, primero debe profundizar en el objeto SpatialPolygons para extraer al objeto individual Polygon.

Una vez hecho esto, puede usar el operador @ para extraer el contenido de la ranura de área.

El siguiente ejemplo utiliza la SpatialPolygons objeto creado en la Sección 7 de la 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

así que para mi caso donde hay solo 1 polígono, 'spatialpolygons @ polygons [[1]] @ area' funciona. –

+0

Exactamente, y me alegro de que funcionó para usted. Lo agregaré a la respuesta para completarlo. –

+4

Solo por diversión, esto también funcionaría: 'ranura (ranura (Sp," polígonos ") [[1]]," área ")'. :) También puedes buscar nombres de tragamonedas con 'slotNames'. –

6

Puede calcular el área con funciones en el paquete rgeos ejemplos a continuación, utilizando datos de ejemplo de Josh. Esto podría ser más apropiado ya que la ranura area es meramente para trazado.

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

Todos a la vez:

gArea(SpP) 
[1] 17 

El sistema de coordenadas en uso debe ser considerado, esto es sólo prima área geométrica.

Las páginas de ayuda hablan sobre la ranura area.

?gArea 
.... 

Tenga en cuenta que este valor puede ser diferente de la ranura ‘zona’ de la clase ‘’ polígonos como este valor no restar el área de cualquier agujero en la geometría.

?"Polygons-class" 
... 

‘zona’: Objeto de la clase ‘ "numérico"’; el área planar total bruta de la lista de polígonos pero no los agujeros de doble conteo (cambiado de 0.9-58 - las islas se suman, los agujeros se ignoran más bien que que los restados); Estos valores se utilizan para asegurarse de que polígonos de un área más pequeña se trazan después de polígonos de un área grande, no respeta proyección como objetos de esta clase tienen ninguna proyección define

+0

Muy bueno saber sobre 'gArea' . Gracias por agregar eso. –

+0

@mdsummer: consejo increíble. ¡GRACIAS! –

Cuestiones relacionadas