
Primera aproximación al uso de las funciones propias con python

En este artículo voy a explicar un poco las primeras aproximaciones con Python para QGIS utilizando el nuevo editor de funciones. Una de las herramientas que ha incorporado QGIS desde su versión 2.8 ha sido el editor de funciones propias con Python.
Como bien es sabido, QGIS dispone de una poderosa API para realizar tanto plugins como scripts con este lenguaje. Esta API, en mi opinión, a pesar de ser muy poderosa, resultaba algo inaccesible para un usuario no experimentado, ya que tendía que acceder a ella a través de la consola de Python, lo cuál es bastante incómodo.
Como digo, a partir de esta versión de QGIS, el usuario puede obtener una interfaz algo más amigable para empezar a programar pequeñas funciones con Python.
Pero…¿Qué son las pequeñas funciones? Si no estás experimentado con temas de programación o de scripting, tal vez no sepas ni por dónde empezar, por eso vamos a ver una pequeña aproximación a esta funcionalidad a través de algunos casos prácticos.
Para comenzar se me ocurre un pequeño CASO PRÁCTICO: A partir de una tabla de parcelas de las cuales tenemos el precio de venta, queremos calcular el precio del metro cuadrado. Una vez calculado, queremos colorear los «caros» en rojo y los «baratos» en verde. Fácil, ¿No? Después podremos etiquetar las parcelas con su precio por metro cuadrado.
Como puedes intuir, no sólo habrá una manera de hacerlo, es más, no es una tarea muy difícil para realizar con el selector de expresiones, o con la calculadora de campos. Este es sólo un pequeño ejemplo de cómo empezar con las funciones de Python, pero también hay otra ventaja, y es que podemos acceder a las funciones desde cualquier ámbito de QGIS que nos permita el uso de expresiones. Por tanto, podremos usar la función para etiquetar, para colorear, y para calcular campos. Con el ahorro de esfuerzo que supone.
Vamos a ver cómo empezar a trabajar con funciones:
Importar una tabla de precios.

Primero debemos importar la tabla de precios a nuestro proyecto. Suponemos que podremos conectarnos vía Postgres, pero por el momento vamos a hacerlo con una tabla en local. Este es el aspecto que tendrá la tabla, sólo mostrará el ID de la parcela, y su precio catastral.
Una vez tenemos la tabla cargada, vamos a hacer nuestra pequeña función que calcule el precio del metro cuadrado. Simple, ¿no?. Para ello vamos al editor de expresiones, y vamos a la pestaña de funciones. Aquí es donde vamos a trabajar a partir de ahora.

Para explicar el editor de funciones por encima, sólo hay que saber que permite realizar pequeñas funciones con códigos que vas a usar a menudo. El resultado lo verás en la pestaña de funciones ya existentes, como la de calcular área, las condicionales, etc.
En mi caso la he llamado «Geomarketing» por si quiero agrupar en un futuro otras funciones similares. Bien, el código de la función es el siguiente:

Realmente sólo estamos trabajando con una línea, explicado, la sintaxis de Python sería:
- Es la cabecera de la función, en ella le indicas, el número de argumentos que quieres que reciba la función, en este caso se ha dejado en auto, para que coja los argumentos que se le pasan automáticamente, y luego se le especifica el grupo con el que quieres que aparezca en el menú, como he dicho, lo he llamado Geomarketing.
- def es la palabra que usa Python para definir funciones, calculaPrecio es el nombre como quieres llamar a la función, y las tres palabras dentro del paréntesis son los parámetros. Los parámetros son los valores que le pasas a la función, y con los que trabajará. Es importante saber que el editor de funciones de QGIS siempre necesita el parámetro feature, para referirse a todos los campos de la tabla, y el parámetro parent, que usa para mostrar los errores, por lo que serán obligatorios. Por tanto, como se puede intuir, yo sólo le estoy pasando el parámetro precio.
- Este es el cuerpo de la función. Lo primero que hay que ver es el indentado de la línea, si te has aproximado a Python ya, sabrás que trabaja con indentados, por tanto, todo lo que esté cuatro espacios a la derecha de la definición de la función, estará dentro de la función.
Return es la palabra que usa Python (como muchos otros lenguajes) para devolver los datos. Y seguidamente le especificaremos qué ha de devolver. Pues bien, como es obvio, para calcular el precio por metro cuadrado, ha de devolver el precio, dividido por el área de cada polígono.
Como vemos, «precio» es el nombre de la variable que recibe como parámetro, y el área la calcula a partir del otro parámetro obligatorio, feature. Feature será la llamada «entidad», que tendrá una función (también llamado método) propia para calcular su geometría. Y esta a su vez, tendrá otra para calcular el área.
Pues así de sencilla resultaría la función para calcular el precio por metro cuadrado. Pulsaremos el triángulo de ejecutar, y ya la tendremos agregada a nuestro repositorio de funciones.
Para utilizar la función vamos a hacerla en dos sitios diferentes, así podremos ver el ámbito: en el etiquetado, y en el coloreado del mapa.
- Etiquetado:
Vamos a crear una etiqueta para las parcelas que muestre su precio.
Entramos en el etiquetador de QGIS sobre la capa de manzanas, y en el campo de expresiones, estableceremos el texto de la función, con el parámetro del campo de precio. Además aprovecharemos para redondear el valor, y darle un formato más atractivo.

- Coloreado del mapa:
Estableceremos una regla para que, si el campo calculado por la función es mayor de 20€/m, será rojo, si no, será verde. Es más, no hará falta ni calcular un campo, simplemente estableciendo la regla con la función, obtendrá los valores.

Por tanto, un ejemplo de cómo podría quedar nuestro mapa utilizando las funciones podría ser el de la imagen.

Con este artículo hemos visto cómo con unas pequeñas nociones de código Python, con las funciones propias de PyQGIS, y el propio QGIS podemos crear soluciones que nos simplifican mucho nuestra tarea rutinaria con los GIS, incluso mejorar muchos elementos que no vienen de «serie».
Descubre más en nuestro blog sobre QGIS y PYTHON o sobre nuestro Curso de QGIS: Sistemas de Información Geográfica
Buenas tardes,
Tenia una consulta, tengo una imagen con puntos con unas mediciones, hay algun pluggin para si georeferencio esa imagen, automaticamente me rellene la tabla con las coordenadas de ese punto?
un saludo
Hola,
muy útil tu descripción, solo que tengo una duda ¿como agregar una descripción de la función que se muestre en la sección de ayuda?
Saludos.
Hola francisco.
No lo sé seguro porque no encuentro mucha documentación, pero mirando el master del repositorio de QGIS en GitHub, la encuentro aquí:
«github.com/qgis/QGIS/tree/master/resources/function_help/json»
Tal vez puedas añadir tu JSON de información siguiendo la misma estructura.
Un saludo.