Feedback: Cómo introducir valores a través de PyQGIS

PyQGIS es la librería de QGIS para ejecutar código Python. QGIS elige Python por ser uno de los lenguajes favoritos para scripting.

Con PyQGIS podemos automatizar tareas GIS: listar el numero de registros de las capas, realizar geoprocesamiento, añadir y borrar elementos de una capa o tabla, crear geometrías nuevas o exportar un mapa a PDF.

Dentro de los trabajos de automatización de procesos que realizamos en QGIS 3 con Python, la posibilidad de interactuar con el usuario, eleva a un grado superior los beneficios de la programación.

Nos referimos con esto a permitir que sea el ejecutor de nuestros scripts el que decida, por ejemplo, una ruta de salida para sus resultados, un tamaño de celda, el nombre de la capa con la que va a realizar un proceso, etc…

En este tutorial vamos a mostrar cómo introducir valores en QGIS 3 con PyQGIS.

Para los desarrolladores de Python esta opción es de uso frecuente y se resuelve a través de la función raw_input().

raw_input

Como ves su funcionamiento es muy sencillo, permitiendo que el valor introducido por el usuario se almacene en una variable y forme parte del proceso.

Sin embargo, tras varias pruebas hemos comprobado que esta función da error en la consola de Python de QGIS, y así viene registrada la incidencia que podemos ver en este enlace http://hub.qgis.org/issues/9894

fallo_consola

En este mismo enlace en el que queda registrado el BUG Jürgen Fischer nos aporta una solución: Se trata del uso de la Clase QInputDialog(),de PyQT, cuyo funcionamiento es muy similar al raw_input(). En este enlace puedes consultar su API http://pyqt.sourceforge.net/Docs/PyQt4/qinputdialog.html

En el siguiente ejemplo podemos ver cómo a través de su uso, el usuario introduce como valor el nombre de una capa para añadirla la interfaz de QGIS:

"""Carga la capa cuyo nombre introduce el usuario"""""

##importa librerias convencionales
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from qgis.core import *
from qgis.gui import *
from qgis.utils import *

##importa librerias especifica

from PyQt5.QtWidgets import QInputDialog
##recoge en una variable con formato de lista el nombre que introduce el usuario

nombre = QInputDialog.getText(None, 'NOMBRE DE LA CAPA', 'Introduce el nombre sin extension')

##utiliza el primer objeto de la lista, que es el nombre de la capa
capa = r'C:/CURSO_PYQGIS/CAPAS/'+nombre [0]+'.shp'
print (capa)

##carga la capa
layer = QgsVectorLayer(capa,'capa','ogr')

QgsProject.instance().addMapLayer(layer)

El nombre de la capa que el usuario ha introducido queda recogido dentro del programa en una variable de tipo lista. El ejemplo busca la capa dentro de un directorio específico.

Introducimos el nombre de la capa, aceptamos y el código continua ejecutándose para añadir la capa a la ToC de QGIS:

En el artículo Primeros pasos con PyQGIS te explicamos cómo añadir shapefiles, GeoPackage o tablas de PostGIS a la interfaz de QGIS 3.

Por supuesto también existe la posibilidad de interactuar con el usuario a través de un formulario, utilizando Qt designer.

Qt_designer

Qt designer permite diseñar un cuadro de diálogo completo con la posibilidad de insertar combos, check boxes, botones, imágenes, etc…

Si quieres aprender a programar en Python para QGIS, inscríbete ya a nuestro curso online de PyQGIS.

Let’s connect!

Date de alta en nuestra newsletter y te enviaremos GRATIS el ebook que te ayudará a impulsar tu perfil GIS:
Vitaminas MappingGIS

Tan solo una vez al mes recibirás las últimas novedades del sector GIS y de nuestros cursos

4 comentarios en «Feedback: Cómo introducir valores a través de PyQGIS»

  1. Buenos días.
    Felicidades por el blog.

    Siguiendo con el tema de la introducción de datos, ¿sería posible usar el valor introducido por el usuario como nombre de una nueva capa temporal?

    Gracias.

    • fectivamente Rafael,

      Ese sería uno de los posibles usos que podríamos darle a esta utilidad. Ten en cuenta que el dato que obtenemos desde el cuadro de dialogo con el usuario tiene formato de lista, simplemente tendríamos que convertir esta lista en un string y utilizarlo en el parámetro requerido, en este caso, en el lugar del nombre de la capa.

      En estas líneas que te adjuntamos tienes el ejemplo de cómo crear una capa virtual de puntos y cargarla en la leyenda con el nombre introducido por el usuario.

      ##importa librerias convencionales
      from PyQt4.QtCore import *
      from PyQt4.QtGui import *
      from qgis.core import *
      from qgis.gui import *
      from qgis.utils import *

      ##importa librerias especifica

      from PyQt4.QtGui import QInputDialog

      ##recoge en una variable con formato de lista el nombre que introduce el usuario

      nombre = QInputDialog.getText(None, ‘NOMBRE DE LA CAPA’, ‘Introduce el nombre’)

      ##crea una capa virtual de puntos con ese nombre y la carga en la leyenda
      mem_layer_ptos = QgsVectorLayer(«Point?crs=epsg:4326&field=id:integer»»&field=nombre:string&index=yes», str( nombre) [3:len (nombre)-10] , «memory»)
      QgsMapLayerRegistry.instance().addMapLayer(mem_layer_ptos)

      Te recomendamos nuestro curso de PyQGIS en el que aprenderás esta muchas más cosas útiles!

  2. Hola buenos dias; he estado trabajando un poquito de Python para QGIS tratando de crear plugins y he tenido buenos resultados con temas secillos; pero tengo una duda: si yo tuviera datos en mi Base de Datos en una tabla que tenga características especiales de una finca, pero que no esten en una tabla geoespacial sera posible conectarme a la base de datos sin pasar por un geoserver; podría ejemplo utilizando un web service no geoespacial para traer esos datos al plugin y calificar algunos aspectos de la capa espacial, ¿qué tan factible es esto o que vía se debería tomar? gracias por cualquier respuesta que me de alguna pista.

    • Hola ALonzo,
      El tema es complejo, y no se si te he entendido bien, pero puedes agregar la tabla espacial a QGIS y trabajar con esa tabla como si de una capa normal se tratase y así utilizar los datos en el plugin. Saludos

Los comentarios están cerrados.