Iniciándote con la Programación Python

Advertencia

Una nueva versión de este tutorial esta disponible en 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 de puntos vectoriales que represente todos los aeropuertos principales y utilizaremos secuencias de comando de Python para crear un archivo de texto con el nombre del aeropuerto, el código del aeropuerto, la latitud y la longitud de cada uno de los aeropuertos de la capa.

Obtener los datos

Usaremos el conjunto de datos Aeropuertos de Natural Earth .

Descarga el archivo shape Aeropuertos.

Fuente de Datos [NATURALEARTH]

Procedmiento

  1. En QGIS, ve a Capas ‣ Agregar Capa Vectorial. Navega al archivo descargado ne_10m_airports.zip y clic Abrir. Selecciona la capa ne_10m_airports.shp y clic Aceptar.

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

../_images/2151.png
  1. Selecciona 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.

../_images/394.png
  1. QGIS provee una consola incorporada donde puedes escribir comandos python y obtener el resultado. Esta consola es una forma grandiosa para aprender script y también hacer un procesamiento rápido de datos. Abre Consola de Python yendo a Complementos ‣ Consola de Python.

../_images/458.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/551.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/649.png
  1. Verás una lista larga de funciones disponibles. Por ahora, usaremos una función llamada getFeatures() que te conseguirá la referencia de 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. Asegúrate de agregar 2 espacios antes de escribir la segunda línea.

for f in layer.getFeatures():
  print f
../_images/749.png
  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/848.png
  1. Entonces, ahora sabe cómo acceder programáticamente al atributo de cada entidad en una capa. Ahora, veamos cómo podemos acceder a las coordenadas de la característica. Se puede acceder a las coordenadas de una entidad 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 entidad 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: “Enter” para ver las coordenadas x e y de cada función.

for f in layer.getFeatures():
  geom = f.geometry()
  print geom.asPoint()
../_images/948.png
  1. Y si quisieras obtener sólo la coordenadas x del elemento? Puedes llamar a la función x() sobre el objeto pnto y obtener su coordenada x.

for f in layer.getFeatures():
  geom = f.geometry()
  print geom.asPoint().x()
../_images/1055.png
  1. Ahora tenemos todas las piezas que podemos unir para generar el resultado deseado. Escriba el siguiente código para imprimir el nombre, iata_code, latitud y longitud de cada una de las características del aeropuerto. Las anotaciones «%s» y «%f» son formas de formatear una cadena y variables numéricas.

for f in layer.getFeatures():
  geom = f.geometry()
  print '%s, %s, %f, %f' % (f['name'], f['iata_code'],
         geom.asPoint().y(), geom.asPoint().x())
../_images/1186.png
  1. Puede ver la salida impresa en la consola. Una forma más útil de almacenar la salida sería en un archivo. Puede escribir el siguiente código para crear un archivo y escribir la salida allí. Reemplace la ruta del archivo con una ruta en su propio sistema. Tenga en cuenta que agregamos `` n`` al final de nuestro formato de línea. Esto es para agregar una nueva línea después de agregar los datos para cada característica. También debe tener en cuenta la línea `` unicode_line = line.encode (“utf-8”) ``. Dado que nuestra capa contiene algunas características con caracteres Unicode, no podemos simplemente escribirla en un archivo de texto. Codificamos el texto usando la codificación UTF-8 y luego escribimos en el archivo de texto.

output_file = open('c:/Users/Ujaval/Desktop/airports.txt', 'w')
for f in layer.getFeatures():
  geom = f.geometry()
  line = '%s, %s, %f, %f\n' % (f['name'], f['iata_code'],
          geom.asPoint().y(), geom.asPoint().x())
  unicode_line = line.encode('utf-8')
  output_file.write(unicode_line)
output_file.close()
../_images/1257.png
  1. Puedes ir a la ubicación del archivo de salida que especificaste y abrir el archivo texto. Verás los datos del archivo shape de aeropuertos que extraímos usando script python.

../_images/1355.png

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