2012-08-30 13 views
14

El paquete sp proporciona varias clases para diferentes conceptos espaciales (puntos, líneas, polígonos). Para algunas clases, acceder a las coordenadas de las funciones es sencillo, p. . Todos los ejemplos fueron tomados de las respectivas páginas de ayuda de clase.Extraiga las coordenadas de características de SpatialPolygons y otras clases de sp

l1 = cbind(c(1,2,3),c(3,2,2)) 
l1a = cbind(l1[,1]+.05,l1[,2]+.05) 
l2 = cbind(c(1,2,3),c(1,1.5,1)) 
Sl1 = Line(l1) 
Sl1a = Line(l1a) 
Sl2 = Line(l2) 
S1 = Lines(list(Sl1, Sl1a), ID="a") 
S2 = Lines(list(Sl2), ID="b") 
Sl = SpatialLines(list(S1,S2)) 
coordinates(Sl) 
# [prints a list of two with corresponding segments] 

Para SpatialPolygons, coordinates() rendimientos centros de polígonos como se demuestra a continuación.

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) 
coordinates(SpP) 
     [,1]  [,2] 
[1,] 2.696970 3.545455 
[2,] 3.666667 2.333333 
[3,] 6.133333 3.933333 

¿Existe alguna función práctica en los paquetes comunes que extraiga las coordenadas de las funciones? He creado una función para SpatialPolygons, pero estoy buscando algo que haya sido mejor probado y consistente, tal vez incluso en la mayoría de las clases sp.

getEdges <- function(x) { 
    stopifnot(class(x) == "SpatialPolygons") 
    lapply([email protected], function(y) { 
       [email protected][[1]]@coords 
      }) 
} 
getEdges(SpP) 
# [returns a list of three, coordinates in a matrix] 
+1

Te recomiendo el libro muy bueno: "Análisis de datos espaciales aplicados con R" en la serie "Uso R ! " -> http://www.springerlink.com/content/978-0-387-78171-6#section=147788&page=1 – Pop

+0

En general, no es aconsejable usar '@ property' para extraer cosas. Esta es la organización interna del objeto, que puede cambiar sin previo aviso. –

Respuesta

14

La mejor manera que se me ocurre es utilizar la función de fortifyggplot2. fortify es una función genérica que tiene métodos para convertir objetos R genéricos (por ejemplo, lm, etc.) en un data.frame que ggplot2 puede usar para trazar. Una lista completa da:

> ggplot2:::fortify. 
ggplot2:::fortify.cld                 
ggplot2:::fortify.confint.glht               
ggplot2:::fortify.data.frame                
ggplot2:::fortify.default                
ggplot2:::fortify.glht                 
ggplot2:::fortify.Line 
ggplot2:::fortify.Lines 
ggplot2:::fortify.lm 
ggplot2:::fortify.map 
ggplot2:::fortify.NULL 
ggplot2:::fortify.Polygon 
ggplot2:::fortify.Polygons 
ggplot2:::fortify.SpatialLinesDataFrame 
ggplot2:::fortify.SpatialPolygons 
ggplot2:::fortify.SpatialPolygonsDataFrame 
ggplot2:::fortify.summary.glht 

Se puede ver esto incluye una función para fortifySpatialPolygons* objetos. Usando su ejemplo de datos:

> obj = fortify(SpP) 
    long lat order hole piece group id 
1  2 2  1 FALSE  1 s1.1 s1 
2  1 4  2 FALSE  1 s1.1 s1 
3  4 5  3 FALSE  1 s1.1 s1 
4  4 3  4 FALSE  1 s1.1 s1 
5  2 2  5 FALSE  1 s1.1 s1 
6  5 2  1 FALSE  1 s2.1 s2 
7  2 2  2 FALSE  1 s2.1 s2 
8  4 3  3 FALSE  1 s2.1 s2 
9  5 2  4 FALSE  1 s2.1 s2 
10 4 5  1 FALSE  1 s3/4.1 s3/4 
11 10 5  2 FALSE  1 s3/4.1 s3/4 
12 5 2  3 FALSE  1 s3/4.1 s3/4 
13 4 3  4 FALSE  1 s3/4.1 s3/4 
14 4 5  5 FALSE  1 s3/4.1 s3/4 
15 5 4  6 TRUE  2 s3/4.2 s3/4 
16 5 3  7 TRUE  2 s3/4.2 s3/4 
17 6 3  8 TRUE  2 s3/4.2 s3/4 
18 6 4  9 TRUE  2 s3/4.2 s3/4 
19 5 4 10 TRUE  2 s3/4.2 s3/4 

y trazando el resultado:

require(ggplot2); theme_set(theme_bw()) 
ggplot(aes(x = long, y = lat, group = group), data = obj) + geom_path() 

enter image description here

Cuestiones relacionadas