Iniciándote con la Programación Python (QGIS3)

QGIS tiene una potente interfaz de programación que le permite ampliar la funcionalidad central del software, así como escribir códigos para automatizar sus tareas. QGIS es compatible con el popular lenguaje de código, Python. Incluso si eres un principiante, aprender un poco de la interfaz de programación Python y QGIS le permitirá ser mucho más productivo en su trabajo. Este tutorial no asume ningún conocimiento previo de programación y está destinado a dar una introducción a las secuencias de comando de Python en QGIS (PyQGIS).

Vista general de la tarea

Cargaremos una capa punto vectorial que representa todos los aeropuertos principales y usaremos script python para crear un archivo texto con el nombre de aeropuerto, código de aeropuerto, latitud y longitud para cada aeropuerto en la capa.

Obtener los datos

Usaremos el conjunto de datos Aeropuertos de Natural Earth.

Download the Airports shapefile.

Procedimiento

  1. Ubica el archivo ne_10m_airports.zip en el Explorador QGIS y expándelo. Selecciona el archivo ne_10m_airports.shp y arrástralo a la pantalla.

../../_images/1101.png
  1. Verás la capa ne_10m_airports cargada en QGIS.

../../_images/270.png
  1. Seleccione la herramienta Identificar y clic sobre cualquiera de los puntos para examinar los atributos disponibles. Verás que el nombre del aeropuerto y su código de 3 dígitos están contenidos en los atributos name y iata_code respectivamente. Puedes cerrar la ventana Identificar.

../../_images/335.png
  1. QGIS provee una consola incorporada donde puedes escribir comandos python y obtener resultados. Esta consola es una manera genial de aprender script y también hacer un procesamiento rápido de datos. Abre la Consola de Python yendo a Plugins ‣ Consola de Python.

../../_images/416.png
  1. Verá un nuevo panel abierto en la parte inferior del lienzo de QGIS. Verá un mensaje como « >>> « en la parte inferior donde puede escribir comandos. Para interactuar con el entorno QGIS, debemos usar la variable «iface». Para acceder a la capa actualmente activa en QGIS, puede escribir lo siguiente y presionar: kbd: “Enter”. Este comando obtiene la referencia a la capa cargada actualmente y la almacena en la variable «layer “”.

layer = iface.activeLayer()
../../_images/515.png
  1. Hay una función práctica llamada dir() en python que te muestra todos los métodos disponibles para cualquier objeto. Esto es útil cuando no estás seguro que funciones están disponibles para el objeto. Ejecuta el siguiente comando para ver que operaciones podemos hacer en la variable layer.

dir(layer)
../../_images/615.png
  1. Verás una larga lista de funciones disponibles. Por ahora, usaremos una función llamada getFeatures() que te conseguirá la referencia a todos los elementos de una capa. En nuestro caso, cada elemento será un punto representando un aeropuerto. Puedes escribir el siguiente comando para iterar a través de cada uno de los elementos en la capa actual.

Nota

Indentación (o número de espacios antes de cada declaración) es muy importante en Python. Si obtienes un error en este paso, asegúrate que has agregado 2 espacios antes de escribir la segunda línea.

Como la declaración print(f) está dentro de un bucle-for, necesitarás presionar Intro dos veces después de esa declaración - una vez para salir del bucle - y otra para ejecutar el comando.

for f in layer.getFeatures():
  print(f)
../../_images/7.gif
  1. Como verás en la salida, cada línea contiene una referencia a un elementos dentro de la capa. La referencia al elemento está almacenada en la variable f. Podemos usar la variable f para acceder a los atributos de cada elemento. Escribe los siguiente para imprimir el name y iata_code para cada elemento aeropuerto.

for f in layer.getFeatures():
  print(f['name'], f['iata_code'])
../../_images/8.gif
  1. Entonces, ahora sabe cómo acceder programáticamente al atributo de cada elemento en una capa. Ahora, veamos cómo podemos acceder a las coordenadas del elemento. Se puede acceder a las coordenadas de un elemento vectorial llamando a la función «geometry()». Esta función devuelve un objeto de geometría que podemos almacenar en la variable «geom». Puede ejecutar la función «asPoint()» en el objeto de geometría para obtener las coordenadas x e y del punto. Si su elemento es una línea o un polígono, puede usar las funciones «asPolyline()» o «asPolygon()». Escriba el siguiente código en el indicador y presione: kbd: “Intro” para ver las coordenadas x e y de cada elemento.

for f in layer.getFeatures():
  geom = f.geometry()
  print(geom.asPoint())
../../_images/9.gif
  1. Y si quisiéramos obtener sólo la coordenada x del elemento? Puedes llamar a la función x() en el objeto punto y obtener su coordenada x.

for f in layer.getFeatures():
  geom = f.geometry()
  print(geom.asPoint().x())
../../_images/10.gif
  1. Ahora tenemos todas las piezas que podemos unir juntas para generar nuestra salida deseada. Escriba el siguiente código para imprimir el nombre, iata_code, latitud y longitud de cada uno de los elementos de aeropuerto. Aquí estamos usando el método .format() que da más control sobre la impresión de múltiples variables. La notación .2f es para limitar las coordenadas a 2 decimales.

for f in layer.getFeatures():
  geom = f.geometry()
  print('{},{},{:.2f},{:.2f}'.format(f['name'], f['iata_code'], geom.asPoint().y(), geom.asPoint().x()))
../../_images/11.gif
  1. Puedes ver la salida impresa en la consola. Una manera más útil de almacenar la salida sería en un archivo. Puedes escribir el siguiente código para crear un archivo y escribir la salida allí. Reemplace la ruta de archivo con una ruta de su propio sistema. Note que agregamos \n al final de nuestro formateo de línea. Esto es para agregar una línea nueva después de agregar los datos para cada elemento.

Nota

Hay 2 niveles de bloques de código abajo. Asegúrate de agregar 4 espacios al código que inicia la línea 3.

with open('/Users/ujaval/Desktop/airports.txt', 'w') as file:
  for f in layer.getFeatures():
    geom = f.geometry()
    line = '{},{},{:.2f},{:.2f}\n'.format(f['name'], f['iata_code'], geom.asPoint().y(), geom.asPoint().x())
    file.write(line)
../../_images/12.gif
  1. Puedes ir a la ubicación del archivo de salida que especificaste y abrir el archivo de texto. Verás los datos del archivo shape de aeropuertos que extrajimos usando script python.

../../_images/1320.png

If you want to give feedback or share your experience with this tutorial, please comment below. (requires GitHub account)