Generación de vectorial de línea a partir del centroide y vértice más alejado de polígono con Python y GRASS-Script

En un artículo precedente se presentó la manera de determinar la distancia máxima desde el centroide a los vértices de un polígono mediante Python con GRASS script. Como siempre existe la incertidumbre por saber si el script funciona de la manera esperada (especialmente si se tienen polígonos con muchos vértices) sería conveniente, con propósitos de verificación, que éste produzca simultáneamente el vectorial de línea que represente la distancia máxima entre el centroide del polígono y su vértice más alejado.

Para esto, se segregan las coordenadas x,y para el vértice con la distancia máxima y, aprovechando parte de los datos del ascii para el polígono considerado, se genera en tiempo de ejecución un archivo temporal de línea en ascii, con las coordenadas del referido vértice y el centroide, el cual es importado al ambiente de trabajo de GRASS con v.in.ascii. El script propuesto es el siguiente:

#!/usr/bin/env python
# -*- coding: utf-8

import os
from math import sqrt
import grass.script as grass

os.system ("clear")

file_input = str(raw_input ("Nombre del vectorial a procesar = ? "))

file_output = open('datos.txt', 'w')

puntos=grass.read_command("v.out.ascii", 
							input=file_input, 
							format="standard", 
							quiet="True")

puntos=puntos.split("\n")

temp=puntos

#En la posición [10][2] está el número de puntos del vectorial tipo polígono
#con split por espacio simple
nro_puntos = puntos[10].split(" ")

n = int(nro_puntos[2])

tope=11+n

#Se asignan los arreglos para coordenadas x, y, distancia
x=range(tope)
y=range(tope)
d=range(int(nro_puntos[2]))

#Se producen los arreglos de coordenadas x,y de los vértices del polígono
for i in range(11,tope):
	coor = puntos[i].split(" ")
	x[i] = float(coor[1])
	y[i] = float(coor[2])

#Se producen las coordenadas del centroide
coor_cent = puntos[tope+1].split(" ")

x_cent = float(coor_cent[1])
y_cent = float(coor_cent[2])

#Se redimensionan los arreglos de x, y para que comiencen desde cero
x=x[11:tope]
y=y[11:tope]

#Aplicación de la fórmula de la distancia a todos los vértices desde el centroide
for i in range(int(nro_puntos[2])):
	d[i] = sqrt((x_cent-x[i])*(x_cent-x[i])+(y_cent-y[i])*(y_cent-y[i]))

dist_max = max(d)

file_output.write('Las coordenadas x, y del centroide son:\n' + str(x_cent) + ' ' + str(y_cent) + '\n\n') 

file_output.write('El id y las coordenadas x, y para la distancia máxima son:\n')

for i in range(int(nro_puntos[2])):
	if d[i] is dist_max:
		x_max = x[i]
		y_max = y[i]
		file_output.write(str(i+1) + ' ' + str(x[i]) + ' ' + str(y[i]) + ' ' + str(d[i]) + "\n")

file_output.close() #Cierra el archivo temporal

print "La distancia desde el centroide al vértice más alejado es:\n\ndistancia máxima = %.2f" % dist_max, " m\n"

print "El archivo datos.txt es el que contiene las coordenadas del centroide y el id y las coordenadas del vértice para la distancia máxima."

tempfile = grass.tempfile() #Define el archivo temporal

file2 = open(tempfile, 'w')  #Abre el archivo temporal

linea=range(14)

for i in range(10):
	linea[i] = temp[i]

linea[10] = 'L 2 1' 

linea[11] = str(x_max) + ' ' + str(y_max)

linea[12] = str(x_cent) + ' ' + str(y_cent)

linea[13] = '1 1'

for i in range(14):
	print >> file2, linea[i]

file2.close() #Cierra el archivo temporal

file_output = file_input + '_dist_max'

grass.run_command("v.in.ascii", 
					format = "standard", 
					input = tempfile, 
					out = file_output, 
					quiet = "true",
					overwrite = "true")

os.system("rm " + tempfile)

que ejecutado para el polígono cuenca produce automáticamente el cuenca_dist_max; tal como se presenta en la siguiente imagen de una vista de QGIS:

Esta entrada fue publicada en Código Python, GRASS, QGIS, SIG, Software Libre. Guarda el enlace permanente.

4 respuestas a Generación de vectorial de línea a partir del centroide y vértice más alejado de polígono con Python y GRASS-Script

  1. Pingback: Desarrollo Geoespacial con Python en Linux Debian |

  2. Hola quisiera saber si en Qgis existe alguna herramienta que me permita calcular la distancia mínima de puntos a un shape de lineas. Desde ya muchas gracias por su tiempo!
    Saludos

    • Hola, Milagros

      Como tu bien sabes, en el software privativo SIG lo que más utilizan los usuarios se vende en un paquete general amplio y lo más específico se vende aparte. En el software libre lo primero se ofrece en un paquete general amplio y para lo segundo se espera que la comunidad los desarrolle en forma de plugins. Si no encuentras lo que buscas en la oferta general de QGIS entonces tienes que tratar de encontrarlo en la oferta de plugins. Si aún así no encuentras lo que buscas entonces tienes que programar. Puedes usar Python, grass.script, lenguaje R, C++ o PyQGIS (con el que se producen la mayoría de plugins de QGIS). Este último tiene más de 500 clases y miles de métodos en su documentación. En la clase QgsPoint de PyQGIS está el método (“alguna herramienta” como la llamaste tu) ‘sqrDistToSegment’ que haría lo que tu deseas. La documentación está aquí:

      http://goo.gl/pv0ntc

      Obviamente que tu no necesitas desarrollar un plugin para esto. Sólo elaborar el código con el editor de la Python Console; lo que probablemente sea más fácil que lo que está expresado en este artículo con grass.script porque el método de la clase PyQGIS ya está hecho. Sólo hay que saber como usarlo (que obviamente requiere algo de tiempo de entrenamiento).

      Nota: Ya probé el método y es bastante sencillo. Si el punto está fuera del área del rectángulo infinito que delimita el segmento entonces la distancia mínima es aquella al extremo del segmento más próximo. Si está dentro del área entonces la distancia mínima es la del segmento de recta perpendicular que intersecta al segmento.

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 )

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