Distancia mínima desde los centroides de una cuadrícula a un vectorial de puntos con v.distance

En un post anterior determiné la distancia mínima desde los centroides de una cuadrícula a un vectorial de puntos usando el comando de GRASS r.distance. Sin embargo, con el uso de su contraparte vectorial, v.distance, el código es algo más conciso y requiere menos esfuerzo de implementación. Se da a continuación:

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

from os import system
import grass.script as grass

system("clear")

#Extrae los centroides
grass.run_command("v.extract",
					input="cuadricula",
					output="centroidmap",
					type="centroid",
					quiet="True")


#Transforma los centroides en capa de puntos
grass.run_command("v.type",
					input="centroidmap",
					output="pointmap",
					type="centroid,point",
					quiet="True",
					overwrite="True")

#Remueve los centroides del mapaset
grass.run_command("g.remove",
					vect="centroidmap",
					quiet="True")

#Se obtiene información sobre las columnas de la cuadrícula
info= grass.read_command("v.info", 
                    flags="c", 
                    map="cuadricula",
                    quiet="True")
 
info= info.split("\n")
 
#Crear columna distancia si no existe
val = 0
 
for strings in info:
    if 'distancia' in strings:
        val = 1
        print "La columna distancia existe"
        break
 
if val == 0:
    grass.run_command("v.db.addcol", 
                        map="cuadricula", 
                        columns="distancia double precision")
 
    print "Se creó la columna distancia"

salida = grass.read_command("v.distance",
					flags="p",
					_from="pointmap",
					to="annual_precipitation3",
					upload="dist",
					column="distancia",
					quiet="True")

salida=salida.split('\n')

array = []

for i in range(1,len(salida)-1):
	temp = salida[i].split('|')
	array.append(float(temp[1]))

print "Se está escribiendo el arreglo a la tabla..."

#Introduce los valores del arreglo array en la columna distancia de la cuadricula
for i in range(len(array)):
    input="UPDATE cuadricula SET distancia=" + str(array[i]) + " WHERE cat = " + str(i+1)
    grass.write_command("db.execute", stdin = input)

#Remueve los centroides del mapaset
grass.run_command("g.remove",
					vect="pointmap",
					quiet="True")
 
print "Listo!"

Su ejecución produce resultados equivalentes a los de un post anterior; tal como se muestra a continuación:

vdistance

Sin embargo, hay que ejecutarlo desde cónsola de GRASS-QGIS si hay necesidad de crear la columna distancia en el vectorial cuadricula.

Otra imagen donde se compara con los resultados obtenidos con el uso de r.distance:

vdistance2

Se observa claramente que los resultados son equivalentes.

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

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