archivo

PyQGIS

qgis01Sigo haciendo pruebas con PyQGIS, este sería el cuarto post sobre este tema, explicando poco a poco como programar para diversos programas SIG paso a paso.

Os voy a enseñar un pequeño código que explica como acceder a las entidades de una forma muy sencilla. Tan solo necesitáis tener abierto QGIS, con una capa de tipo polígono (para poder usar la función área) y ya podréis ejecutarlo.

·

Si quieres ponerte al día aún puedes consultar mis otros post:

from qgis.core import *

#Capa activa
vl = qgis.utils.iface.mapCanvas().currentLayer() 

#Entidades
iter = layer.getFeatures()

for feature in iter:
    #Indice del campo
    idx = layer.fieldNameIndex("PARQUES_ID")

    #id, nombre, area
    print int(feature.attributes()[idx]),
    print feature.attributes()[4],
    print feature.geometry().area()

pyqgis-entidades01

gmailpythonsimple

Merodeando por Internet encontré una página con contenido muy interesante “Pythin, GIS and Stuff”, en ella vi un código que ya había pensado en buscar y es la opción de poder enviar un email con los resultados a nuestra cuenta desde el propio script. Y esto se hace de una forma muy sencilla. He simplificado un poco el de su web para que podáis pegar y copiar directamente sea cual sea la plataforma que vais a usar (en su web ejemplo de uso con ArcGIS).

Al ser una librería de Python, este código funciona desde cualquier sitio donde lo ejecutes, puedes agregarlo a scripts de OGR/GDAL desde editores externos,o a tus scripts en gvSIG, PyQGIS o ArcPy. En todos funciona perfectamente por lo que he podido probar.

Lo único que necesitamos introducir es la información una cuenta Gmail, la contraseña, y la cuenta destinatario. (Cuidado si le mandáis a alguien el script con eliminar la contraseña).

La función aceptará dos variables, el mensaje (una variable tipo string) y una variable booleana (True/False) por si queremos modificar el contenido de alguna forma, en este caso solo indica un supuesto de si se han procesado bien o mal los cálculos, cambiando el encabezado del email.

·

pythonemail

·

Además se ha añadido que la variable se cargue con los datos de un txt que hallamos podido crear. Esto se puede eliminar, solamente dejando que se asigne el valor de una variable string normal, asignar directamente a strResult un valor.

Copiando y pegando este bloque de código solamente deberéis de usarlo llamandolo de la forma:

sendResultEmail(strResult, success)

·

import smtplib

def sendResultEmail(msgContents, success_TF):
    '''sendResultEmail(msgContents, success_TF)'''

    #Info
    to = 'email@gmail.com'
    send_username = 'email@gmail.com'
    send_password = '*****'
    smtpserver = smtplib.SMTP("smtp.gmail.com",587)

    if success_TF:
        subject = 'Resultados de la prueba de email: script SUCCESS.'
    else:
        subject = 'Resultados de la prueba de email: script FAILURE.'
    smtpserver.ehlo()
    smtpserver.starttls()
    smtpserver.ehlo
    smtpserver.login(send_username, send_password)
    header = 'To:' + to + '\n' + 'From: ' + send_username + '\n' + 'Subject:' + subject + '\n'
    msg = header + '\nArcpy results: \n' + msgContents + '\n'
    smtpserver.sendmail(send_username, to, msg)
    smtpserver.close()

outTxt = "c:/gvsig/uni/dataInfo.txt"
txtFile = open(outTxt, "r")
strResult = txtFile.read()
txtFile.close()
success = True

sendResultEmail(strResult, success)

pyqgisCargarCapas01Hoy miramos el siguiente apartado sobre PyQGIS, programación Python en QGIS, sobre como cargar capas con PyQGIS. Este apartado es referente al segundo tema del PyQGIS Cookbook “Loading Layers”. Si te has perdido los dos post anteriores puedes buscarlos aquí.

Solo voy a poner los ejemplos básicos de como cargar un shape, un archivo csv y una imagen raster, y añadirlos a la vista. En la web podéis encontrar como acceder a más tipos de capas como WMS, WFS, SQL, etc. Por ahora vamos a lo sencillo.

Como cualquier script primero debemos de comenzar por importar la librería de QGIS con la linea:

from qgis.core import *

Ahora si queremos cargar una capa vectorial, indicaremos la capa que queremos y el formato de capa vectorial con el que lo queremos leer que es “ogr”, capaz de leer la mayoría de capas vectoriales (layer).

layer = QgsVectorLayer(“C:\gvsig\castilla-leon\embalses.shp”, “Embalses OGR” , “ogr”)

Para agregar un fichero del tipo csv como capa, debemos hacerlo de la siguiente manera: primero hay que indicar donde se encuentra el csv, como es un fichero tenemos que indicarlo primero con file:/// y luego la ruta, quedando así: file:///ruta/completa/hasta/fichero.csv sino dará error si no escribirmos el file. Además debemos indicar cual es el delimitador entre palabras, cual es la columna X y la columna Y, cargamos la capa (vlayer) con QgsVectorLayer(). En mi caso se queda así:

uri = “file:///C:/gvsig/tornados.csv?delimiter=%s&xField=%s&yField=%s” % (“,”, “X”, “Y”)
vlayer = QgsVectorLayer(uri, “Tornados CSV”, “delimitedtext”)

pyqgisCargarCapas02

Para cargar los raster, hay un problema en como lo explica en la página porque si escribes el código como indica da un error de que no encuentra el comando QFileInfo(). Esto sucede porque hay que importar primero las librerías que nos permiten esto. Si queremos seguir trabajando con el raster deberíamos de importar también la librería gdal

from PyQt4.QtCore import *
from PyQt4.QtGui import *

Así que queda de la siguiente manera, el raster de prueba me lo descargue de aquíCon esto lo que hacemos es indicar donde se encuentra nuestro raster (tif), accedemos a la info del archivo (fileInfo) que QGIS pueda leer, a su nombre (baseName), y cargamos por último la capa raster pasando la información (rlayer)

fileName = “C:\gvsig\donana.tif”
fileInfo = QFileInfo(fileName)
baseName = fileInfo.baseName()
rlayer = QgsRasterLayer(fileName, baseName)

Y por último agregamos las capas cargadas a nuestro mapa:

QgsMapLayerRegistry.instance().addMapLayer(layer)
QgsMapLayerRegistry.instance().addMapLayer(vlayer)
QgsMapLayerRegistry.instance().addMapLayer(rlayer)

El script final para agregar estás tres capa queda así:

from qgis.core import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *

#Vector
layer = QgsVectorLayer("C:\gvsig\castilla-leon\embalses.shp"
  , "Embalses OGR", "ogr")
if not layer.isValid():
  print "Layer failed to load!"

#CSV
uri = "file:///C:/gvsig/tornado.csv?delimiter=%s&xField=%s&yField=%s"
   % (",", "X", "Y")
vlayer = QgsVectorLayer(uri, "Tornados CSV", "delimitedtext")

#Raster
fileName = "C:\gvsig\donana.tif"
fileInfo = QFileInfo(fileName)
baseName = fileInfo.baseName()
rlayer = QgsRasterLayer(fileName, baseName)
if not rlayer.isValid():
  print "Layer failed to load!"

#Add layer
QgsMapLayerRegistry.instance().addMapLayer(layer)
QgsMapLayerRegistry.instance().addMapLayer(vlayer)
QgsMapLayerRegistry.instance().addMapLayer(rlayer)

print "End"

Y esto es todo por ahora, con esto conseguimos cargar 3 capas en nuestro proyecto.

Manual basado en la guía de “PyQGIS Cookbook”, más información en su web.

Recordaros que ahora podéis seguir Másquesig también en la página de Facebook.

qgis103

Seguimos paso a paso hasta llegar a nuestro primer script con PyQGIS. Vamos a ver como acceder y ver las opciones más básicas.

Y la verdad es que no tiene ninguna complicación, viene incorporado con QGIS 2.0 e incluye un editor del estilo Composer  que tiene gvSIG. Para los que no lo tengáis instalado aún QGIS, podéis entrar en su web y elegir la distribución que utilicéis.

·

qgis101

La instalación muy sencilla. A la hora de elegir que queremos, me parece que aparecen 3 datasets de ejemplos, yo los activé para luego

echarles un ojo. La capacidad total que demanda sin datasets es 800mb, con datasets 1,2gb (aunque el tercero no me lo descarga).

Ya podemos abrir “QGIS Desktop 2.0.1”. Como ya dije la ventaja es que ya viene instalado la consola de Python, asi que simplemente vamos al menú de Complementos o Plugins – Consola Python y se nos abrirá la consola que estamos acostumbrados.

pyqgis203Para llegar al editor, tan solo hacemos click derecho sobre la consola, “Mostrar Editor”. Este editor es el que comente que es muy parecido al Composer de gvSIG, con unos comandos básicos sin complicaciones, muy intuitivo, además colorea el código que lo hace más fácil de leer y recomienda las funciones disponibles.

Si agregamos alguna capa que tengamos al proyecto podremos hacer nuestro primer sciript, que lo que hará sera saludar y decirnos la capa activa. Hacemos click en el Editor en la pestaña nuevo y introducimos el siguiente código:

from qgis.core import *
import qgis.utils

print "Hola desde QGIS"
aLayer = qgis.utils.iface.activeLayer()
print "La capa activa es: ", aLayer.name()
print "Entidades: ", aLayer.featureCount()

Guardamos el código, elegimos la carpeta donde queremos guardar el script, y para lanzarlo le damos al botón de Play que se encuentra abajo. El resultado tendría que ser algo así:

pyqgis204

Muy fácil ¿verdad? Con esto ya tendríamos nuestro primer script en QGIS. Paso a paso!

Como curiosidad, este mismo script en gvSIG sería:

from gvsig import *

def main():
  print "Hola desde gvSIG"
  aLayer = currentLayer()
  print "La capa activa es: ", aLayer.name
  print "Entidades: ", aLayer.features().getCount()

qgis03

Llevaba ya tiempo queriendo publicar contenido sobre programación en otras plataformas, así que uno de los propósitos del año nuevo es empezar a publicar algún que otro post sobre programación en QGIS, que estoy seguro que alguno lo utilizareis y viene pegando fuerte desde su última versión. Eso sí, aún no tengo ni idea, así que publicaré según vaya aprendiendo cosas nuevas.

Y como todo lo que se empieza, lo primero que se hace es buscar información por Internet, así que lo primero que he encontrado es la documentación que dispone la web oficial de QGIS sobre el tema de programación, en principio utilizaré la última versión de QGIS 2.0 Dufour, y aparece el manual de usuario de QGIS y la guía del desarrollador de PyQGIS:

Creo que para empezar será suficiente con la documentación oficial, si alguno conoce mejor material soy todo oídos y acepto todo tipo de recomendaciones.Próximo post, primeros pasos para ejecutar nuestro primer script en PyQGIS.