QGIS permite generar herramientas personalizadas para automatizar algunas tareas y mejorar la eficiencia de los trabajos repetitivos mediante programación Python.
En base a las necesidades de los procesos de IDECOR, nos propusimos crear una herramienta que nos permita modificar un atributo de las geometrías georreferenciadas de una capa vectorial con un valor fijo, con solo hacer clic en cada uno de los objetos con auxilio de la inteligencia artificial (IA).
Te contamos el resultado de esta experiencia de usar ChatGPT 4 para construir un complemento de QGIS, que nos permitió probar la potencia de la IA generativa como guía en la tarea de programar una funcionalidad específica.
Es de destacar que no teníamos experiencia previa de programar complementos QGIS y que utilizamos el mínimo de conocimientos de programación Python. Cada código provisto por ChatGPT, simplemente lo copiamos y pegamos sin modificaciones.
En esta experiencia, trabajamos usando una máquina con sistema operativo Ubuntu 24.04. Sin embargo, las indicaciones que nos fue dando ChatGPT 4 sirven también para Windows.
A lo largo del trabajo, ChatGPT nos fue dando distintos códigos Python y recomendaciones, el chat completo y el proyecto final se pueden consultar en este enlace.
Una característica de los grandes modelos de IA generativa del lenguaje natural es que no brindan siempre la misma respuesta ante un mismo prompt, por lo que es probable que esta experiencia pueda no ser exactamente reproducida.
La experiencia
Comenzamos ingresando en ChatGPT 4 el siguiente prompt:
Idecor:
Quiero programar un complemento para QGIS que implemente una herramienta que una vez activada me abra un formulario de dialogo que me pida un valor y el nombre de un atributo de una lista desplegable sobre la capa seleccionada, si no hay capa seleccionada que me de una alerta, una vez completados esos dos datos me permita interactuar con el mapa e ir haciendo click sobre algunos objetos de la capa seleccionada, cada vez que hago click sobre un objeto me reemplace el valor del atributo que elegí por el valor que puse en el formulario, que la herramienta se termine cuando presione escape para terminar.
ChatGPT respondió con una serie de seis pasos para armar el complemento, el código que debíamos usar y la instalación. Por ejemplo, el primer y segundo paso fueron:
ChatGPT:
Para crear un complemento para QGIS que implemente la funcionalidad que describiste, necesitarás trabajar con Python y la API de QGIS. A continuación, te daré una guía básica para que comiences:
- Estructura del complemento: Para crear un complemento, necesitarás la estructura básica de un complemento de QGIS. Puedes utilizar el asistente de Qt Designer o crear manualmente la estructura.
- Interfaz del formulario: Crea un formulario usando Qt Designer que contenga:
- Un campo de texto para el valor.
- Una lista desplegable (QComboBox) para seleccionar un atributo.
…
Esos pasos nos parecieron insuficientes para llevarlos a la práctica, de modo que le pedimos si podía ampliar la explicación con una nueva pregunta:
Idecor:
¿Cómo creo el formulario con qtdesigner?
ChatGPT nos respondió de manera detallada los pasos para instalar y armar el formulario con Qt Designer.
ChatGPT:
Crear un formulario usando Qt Designer es un proceso bastante sencillo. Aquí tienes una guía paso a paso para crear un formulario para tu complemento de QGIS:
…
A continuación le preguntamos cómo dar un nombre al componente y al formulario.
Idecor:
Mi complemento quiero que se llame CambiadorValor y el formulario CambiadorForm me podrías reescribir el código del programa principal?
A lo que ChatGPT nos respondió con una nueva versión del código.
Luego, le pedimos que la clase del formulario se llamara Ui_Dialog porque así nos la había creado Qt Designer. Y nuevamente ChatGPT nos entregó una versión del código del componente.
Con esto ya estábamos en condiciones de probar nuestra creación compartida con ChatGPT. Y ahí comenzaron los problemas.
Idecor:
Ahora me dice ‘Ui_Dialog’ object has no attribute ‘buttonOk’.
ChatGPT:
El error ‘Ui_Dialog’ object has no attribute ‘buttonOk’ indica que el objeto Ui_Dialog que has generado a partir del archivo .ui no tiene un atributo llamado buttonOk. Esto puede deberse a varias razones:
- El botón no se llama buttonOk en el diseño: Verifica en Qt Designer que el nombre del botón para aceptar esté correctamente configurado. Asegúrate de que se llama buttonOk, y no algo como pushButton o okButton.
- Los nombres de los objetos en el archivo .ui: Cuando creas los componentes en Qt Designer, cada widget tiene un nombre de objeto. Asegúrate de que estás utilizando el nombre correcto para cada widget.
- Revisa la clase generada: Asegúrate de que el archivo cambiador_form.py se haya generado correctamente y de que contenga los atributos correspondientes que se definen en tu archivo .ui.
…
Y nos dió una nueva versión del código, pero nos dimos cuenta que en el formulario habíamos usado un control buttonBox que incluía los botones de Aceptar y Cancelar, de modo que solicitamos algunas modificaciones.
Idecor:
Mi form tiene un buttonBox con los botones Aceptar y Cancelar
ChatGPT:
…
Después de esto se sucedieron una serie de errores que ChatGPT nos fue contestando con nuevas versiones en un proceso de prueba y error. Se produjeron errores, como por ejemplo:
- ”’CambiadorValor’ object has no attribute ‘initGui’”
- «QgsMapCanvas.setMapTool(): argument 1 has unexpected type ‘CambiadorValor’”
- «QgsMapToPixel.toMapPoint(): argument 1 has unexpected type ‘QPoint'»
- «‘QgsVectorLayer’ object has no attribute ‘boundingBox'»
¡Eureka! Con la última versión que nos entregó ChatGPT funcionó aceptablemente para un primer prototipo utilizable. Nos envalentonamos y empezamos a pedir mejoras a las que ChatGPT nos fue contestando con algunos errores que fue solucionando:
Idecor:
Que me cambie el cursor cuando la herramienta está activa, como queda el código?
ChatGPT:
…
Idecor:
me da error «name ‘QtCore’ is not defined»
ChatGPT:
…
Idecor:
¿Qué cursores podria usar?
ChatGPT:
…
Idecor:
Quiero que la herramienta se deshabilite cuando presiones la tecla escape
ChatGPT:
…
Idecor:
A la última versión agregale lo de cambiar el cursor a «Cursor de Mano»
ChatGPT:
…
Por último, intentamos que al hacer clic en una geometría la misma tenga un efecto Flash, para asegurar al usuario que había modificado el objeto correcto. Pero ChatGPT solo logró que todos los objetos de la capa parpadearan juntos al hacer clic. Al cabo de varios intentos desistimos de esa funcionalidad que la dejamos para hacerla a mano.
Imagen 1. Muestra del formulario desplegado al lanzar el componente QGIS.
Conclusiones
Según nuestra experiencia, ChatGPT 4 terminó siendo útil para el objetivo que nos planteamos al comienzo, teniendo en cuenta la restricción de no tener que aprender a programar un complemento QGIS.
Si bien no alcanzó a cubrir el 100% de lo que le pedimos, si logró una funcionalidad muy aceptable.
Acceder a la solución no fue algo instantáneo, sino que tuvimos que llevar adelante un proceso de conversación no exento de varios errores en el medio que nos hicieron temer que no alcanzaríamos los resultados. Este proceso es similar al que enfrenta un programador que va solucionando errores y agregando funcionalidades a una aplicación.
La calidad del código generado no fue la mejor, ya que ChatGPT no utilizó algunos patrones de diseño que permitan desacoplar los componentes, pero fue funcional. Es probable que si se lo hubiéramos pedido lo hubiera corregido siguiendo los patrones de diseño.
El proceso nos llevó aproximadamente 3 horas de trabajo, lo que a un programador experto en complementos QGIS probablemente le hubiera llevado bastante menos sin usar ChatGPT.
Es de destacar que ChatGPT nos brindó en cada respuesta no solo el código Python bien comentado, sino también otra información muy útil -como notas adicionales sobre el programa explicando sus partes importantes-, además de indicaciones para realizar verificaciones que se necesitan y explicaciones sobre los errores. Toda esta información contribuye a aprender sobre la programación de la tarea y los objetos involucrados.
En definitiva, nos sirvió para comprobar si la idea que tuvimos de hacer una herramienta QGIS era posible, prototipar y contar con una base de programa para comenzar a mejorarla sin tener que recurrir a leer documentación y realizar tutoriales acelerando la curva de aprendizaje.
Colaboración:
Ing. Aldo Algorry,
IDECOR