Rotando objetos espaciales en R

La rotación de estructuras geométricas, lo cual es válido también para objetos espaciales proyectados, es posible con la función Rotate de la librería DescTools en R. La librería es una colección de herramientas y contenedores para describir y manipular datos de manera eficiente.

En la descripción de la documentación se señala que se requiere la colección de puntos de la geometría, el centro de rotación y el ángulo de rotación (en radianes). Si no se especifica un centro de rotación se asume el centroide del conjunto de puntos y si tampoco se especifica un ángulo el valor por defecto es pi/3 (60 º).

Para probar la librería se va a usar el shapefile ‘single_polygon.shp’ el cual se va a rotar 30 grados (pi/6) alrededor de su centroide.

Para ello:

setwd('c:/Users/Usuario/pyqgis_data/')
library(raster)
s_pol <- shapefile('single_polygon.shp') 

El objeto s_pol es un SpatialPolygonsDataFrame con un sólo feature del cual se requiere las coordenadas de todos sus nodos. El método geom de la librería raster permite seleccionar fácilmente estos valores mediante la secuencia siguiente de comandos:

geom <- as.data.frame(geom(s_pol))
points <- cbind(geom$x, geom$y)
points

          [,1]    [,2]
 [1,] 348394.8 4479815
 [2,] 348404.9 4479903
 [3,] 348518.2 4479898
 [4,] 348643.7 4479951
 [5,] 348729.6 4479922
 [6,] 348777.9 4479870
 [7,] 348894.6 4479872
 [8,] 348912.7 4479751
 [9,] 348842.3 4479667
[10,] 348724.2 4479644
[11,] 348614.2 4479733
[12,] 348394.8 4479815

Para rotar el conjunto de puntos 30 º:

library(DescTools)
rot30_points <- Rotate(points, theta=pi/6)

El objeto rot30_points es del tipo lista y de ella pueden seleccionarse fácilmente las coordenadas del objeto rotado para ser convertidas nuevamente en un objeto SpatialPolygonsDataFrame. Por tanto:

pol <- Polygon(cbind(rot30_points$x, rot30_points$y))
p1 <- Polygons(list(pol), 1)
SP1 <- SpatialPolygons(list(p1))
df <- data.frame(ID = 1)
SPDF1 <- SpatialPolygonsDataFrame(SP1, df)
projection(SPDF1) <- projection(s_pol)

La visualización de ambos polígonos para corroborar la rotación (que es en sentido antihorario) puede observarse a continuación con los comandos siguientes:

plot(s_pol, axes=T, col='blue')
plot(SPDF1, add=T, col='dark green')

que resulta en:

R9

La rotación en el sentido horario se logra simplemente haciendo negativo el valor de theta en Rotate.

Anuncios
Esta entrada fue publicada en Lenguaje R. Guarda el enlace permanente.

Una respuesta a Rotando objetos espaciales en R

  1. Pingback: Rotando objetos espaciales en R con el método elide de maptools | El Blog de José Guerrero

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s