Cómo incorporar código externo desarrollado por el usuario en un script de python

En un artículo reciente referí cómo ejecutar grass.script en python sin necesidad de iniciar GRASS-QGIS. Hoy se va a desarrollar la manera de cómo incorporar código externo desarrollado por el usuario en un script de python. El procedimiento que se pretende implementar con grass.script, desde cónsola de bash y sin necesidad de abrir QGIS, está referido a obtener las coordenadas x,y,z de un vectorial de puntos (cuenca_puntos) cuyo acceso está garantizado a través de la información que se encuentra en el .grassrc6. El procedimiento lo definí como una función (getCoorVectPoint) a la cual se le pasan dos parámetros (número de puntos y nombre del vectorial). Lo coloqué en el archivo grassMyFunctions.py que se encuentra a continuación:

import grass.script as grass
import numpy as np
from StringIO import StringIO

def getCoorVectPoint(n,name_map):

	#Obtencion de las coordenadas x,y,z para todos los puntos
	puntos = grass.read_command("v.to.db", 
								flags="p", 
								map=name_map, 
								type="point", 
								option="coor", 
								units="meters", 
								quiet="True")

	puntos=np.genfromtxt(StringIO(puntos), delimiter="|")

	puntos=puntos[range(n),1:4]

	return puntos

El procedimiento se invoca en el programa principal de la siguiente manera:

#! /usr/bin/env python
import os

os.system("clear")

from grassMyFunctions import getCoorVectPoint #compendio de mis funciones

def main():

	#numero de puntos

	n = 15

	name_map="cuenca_puntos"

	p=getCoorVectPoint(n, name_map)

	print (p)

if __name__ == "__main__": main()

Su ejecución, en cónsola de bash, produce la siguiente salida:

la cual es la esperada. De ahora en adelante se puede seguir incorporando procedimientos en grassMyFunctions.py y mejorar los existentes.

Por otra parte, con sólo modificar ligeramente el programa principal incorporando el módulo shapely.geometry, sin modificar mi archivo de procedimientos, puedo determinar el área del polígono que circunscriben tales puntos sin necesidad de obtener explícitamente el shapefile tipo polígono. Este es el código:

#! /usr/bin/env python
import os
from shapely.geometry import Polygon

os.system("clear")

from grassMyFunctions import getCoorVectPoint #compendio de mis funciones

def main():

	#numero de puntos

	n = 15

	name_map="cuenca_puntos"

	p=getCoorVectPoint(n, name_map)

	poligono = Polygon(p)

	print "Area = ", poligono.area

if __name__ == "__main__": main()

y esta su salida:

Area =  6891084687.89
zeito@debian:~$
Esta entrada fue publicada en Código Python, GRASS, 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