Rotación de vectoriales en GRASS-QGIS con v.transform

La rotación de archivos vectoriales es posible con la extensión CAD-Tools en QGIS. En GRASS-QGIS es posible con el módulo v.transform. Sin embargo, hay que analizar primero que es lo que hace para obtener los resultados deseados. El módulo v.transform realiza una transformación afín sobre un vectorial, es decir, un desplazamiento, escalamiento o rotación; si es el caso. En las rotaciones alrededor del eje z éstas son realizadas sobre el origen (0,0) de coordenadas, en el sentido de las agujas del reloj, por lo que para la mayoría de éstas no se preservan los valores originales de x,y, es decir, también existe translación. Por esta razón, es necesario determinar la compensación en los desplazamientos x,y para que la rotación sólo se manifieste en el eje z que se ha elegido como referencia.

Aunque sea una perogrullada decirlo, una rotación de 360º dejaría el vectorial tal como está y no sería necesario preocuparnos de las compensaciones. Sin embargo, una rotación de 180º si la requeriría. Para percatarnos de que en este caso existe rotación, además de translación, vamos a considerar un vectorial asimétrico como el de la siguiente imagen:

El punto (x, y), aproximadamente en el centro de la imagen (667773, 1049331), es la referencia para la compensación de las translaciones (x,y) y el eje de giro (en lugar del origen del sistema cartesiano de coordenadas). La matriz de rotación en el sentido antihorario es la siguiente:

por lo que la matriz de transformación para 180º (que es idéntica a la de la rotación en sentido horario) sería:

-1  0
 0 -1

Si se multiplica un vector (x1, y1) por la matriz de rotación anterior el resultado es (x2, y2) = (-x1, -y1). Por tanto, los factores de compensación a y b para restituir (-x1+a, -y1+b) = (x1, y1) serían a = 2.x1 y b =2.y1. La aplicación del comando v.transform con la siguiente sintaxis:

v.transform input=cuenca output=cuenca_rot_180 xshift=1335546 yshift=2098662 zrot=180

produce entonces la rotación deseada sobre el eje escogido (667773, 1049331):

Para una rotación de 90º en el sentido horario (tal como funciona v.transform) la matriz de transformación sería:

 0 -1
 1  0

Si se multiplica un vector (x1, y1) por la matriz de rotación anterior el resultado es (x2, y2) = (-y1, x1). Por tanto, los factores de compensación a y b para restituir (x2+a, y2+b) = (x1, y1) serían a = x1+y1 y b =y1-x1. En este caso, La aplicación del comando v.transform tendría la siguiente sintaxis:

v.transform input=cuenca output=cuenca_rot_90 xshift=1717104 yshift=381558 zrot=90

El resultado se encuentra en la siguiente imagen:

Generalizando, para cualquier rotación en el sentido de las agujas del reloj:

a = xshift = x1 – Cos α. x1 + Sen α. y1

b = yshift = y1 – Sen α. x1 – Cos α. y1

Para programar la obtención de los valores de a y b para cualquier ángulo se puede usar una hoja de cálculo. Para una rotación de 60º en el sentido horario la sintaxis de v.transform sería:

v.transform input=cuenca output=cuenca_rot_60 xshift=1242633.80297853 yshift=-53642.8819613466 zrot=60

cuyo resultado se observa, en primer plano, en la siguiente imagen:

Para no depender de la hoja de cálculo, lo ideal sería programar las rotaciones mediante un script de bash dentro del SIG; tema de otro artículo.

About these ads
Esta entrada fue publicada en GRASS, QGIS, SIG, Software Libre. Guarda el enlace permanente.

Una respuesta a Rotación de vectoriales en GRASS-QGIS con v.transform

  1. Pingback: Rotación de archivos vectoriales (*.shp) en una hoja de cálculo mediante una transformación afín |

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. 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 )

Google+ photo

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

Conectando a %s