Realizar Uniones de Tabla (PyQGIS)

Advertencia

Este tutorial está ahora obsoleto. La manera preferida para hacer uniones de tablas mediante pyqgis es ejecutar el algoritmo native:joinattributestable mediante Python. Vea detalles en Ejecutar Algoritmos de Procesamiento vía Python (QGIS3).

Este tutorial muestra como usar script Python en QGIS (PyQGIS) para realizar una unión de tablas y aplicar un estilo graduado a la capa resultante. Este tutorial replica los pasos del tutorial Realización de uniones de tabla usando sólo script python.

Vista general de la tarea

Por favor refiérase al tutorial Realización de uniones de tabla para la vista general.

Otras habilidades que aprenderá

  • Cargar capas comprimidas en QGIS mediante Python.

  • Usar QgsGraduatedSymbolRendererV2 para aplicar un estilo graduado a la capa vectorial.

Obtener los datos

Descargue los siguientes archivos a su computadora.

tl_2013_06_tract.zip

ca_tracts_pop.csv

ca_tracts_pop.csvt

Fuente de Datos [TIGER] [USCENSUS]

Procedimiento

Puede escribir los siguientes comandos en la Consola Python o el Editor incorporado en QGIS.

  1. Cargue el archivo shape. El archivo Zonas Censales es una archivo zip que contiene el archivo shape. A pesar de que podemos descomprimirlo y cargar el archivo shape, el proveedor OGR tiene la habilidad para cargar el archivo zip directamente mediante un Sistema de Archivo Virtual. Agregando /vsizip/ en la ruta, podemos acceder al archivo shape contenido en el archivo zip.

Nota

La zip_url comenzaría con /vsizip// en sistemas Linux y Mac. (Note el / extra)

zip_uri = '/vsizip/C:/Users/Ujaval/Downloads/tl_2013_06_tract.zip'
shp =  QgsVectorLayer(zip_uri, 'tl_2013_06_tract', 'ogr')
QgsMapLayerRegistry.instance().addMapLayer(shp)
../_images/1201.png
  1. Cargue el archivo CSV. Como el archivo CSV no contiene ningún dato espacial, lo cargaremos como una tabla usado el proveedor ``delimitedtext`.`

csv_uri = 'file:///C:/Users/Ujaval/Downloads/ca_tracts_pop.csv?delimiter=,'
csv = QgsVectorLayer(csv_uri, 'ca_tracts_pop', 'delimitedtext')
QgsMapLayerRegistry.instance().addMapLayer(csv)
../_images/2165.png
  1. Cree la tabla de unión. Las uniones de tabla son realizadas en QGIS usando el objeto QgsVectorJoinInfo. Necesitamos especificar el campo GEO.id2 de la capa CSV como el Campo de Unión y el campo GEOID de la capa archivo shape como el Campo Destino. Una vez que ejecuta el código siguiente, la capa archivo shape tendrá atributos adicionales unidos a la capa csv.

Nota

Una dificultad común cuando se usa QgsVectorJoinInfo es que ambas capas deben estar cargadas en el QgsMapLayerRegistry - si no la unión no funcionaría.

shpField='GEOID'
csvField='GEO.id2'
joinObject = QgsVectorJoinInfo()
joinObject.joinLayerId = csv.id()
joinObject.joinFieldName = csvField
joinObject.targetFieldName = shpField
joinObject.memoryCache = True
shp.addJoin(joinObject)
../_images/3104.png
  1. Una manera más fácil - y preferida de alcanzar la misma cosa es mediante el Marco de Procesamiento. Puedes llamar al algoritmo qgis:joinattributestable y crear una capa unida.

Nota

Estamos usando el método processing.runandload() para ejecutar el algoritmo en vez del más común processing.runalg(). Como queremos cargar la capa unida resultante en QGIS, processing.runandload() es una mejor elección.

import processing
shpField='GEOID'
csvField='GEO.id2'
result = processing.runandload('qgis:joinattributestable', shp, csv, shpField, csvField, None)
../_images/467.png
  1. Nos mantendremos con la unión original usando QgsVectorJoinInfo por el resto del tutorial. Ahora es tiempo de aplicar un estilo graduado a la capa unida. El nombre del campo población en la capa unida es ca_tracts_pop_D001. Aplicaremos un representador graduado usando la clase QgsGraduatedSymbolRendererV2 en el modo Cuantil. Refiérase a Realización de uniones de tabla para los colores y rangos que necesitaremos usar.

from PyQt4 import QtGui

myColumn = 'ca_tracts_pop_D001 '
myRangeList = []
myOpacity = 1

ranges = []

myMin1 = 0.0
myMax1 = 3157.2
myLabel1 = 'Group 1'
myColor1 = QtGui.QColor('#f7fbff')
ranges.append((myMin1, myMax1, myLabel1, myColor1))

myMin2 = 3157.2
myMax2 = 4019.0
myLabel2 = 'Group 2'
myColor2 = QtGui.QColor('#c7dcef')
ranges.append((myMin2, myMax2, myLabel2, myColor2))

myMin3 = 4019.0
myMax3 = 4865.8
myLabel3 = 'Group 3'
myColor3 = QtGui.QColor('#72b2d7')
ranges.append((myMin3, myMax3, myLabel3, myColor3))

myMin4 = 4865.8
myMax4 = 5996.4
myLabel4 = 'Group 4'
myColor4 = QtGui.QColor('#2878b8')
ranges.append((myMin4, myMax4, myLabel4, myColor4))

myMin5 = 5996.4
myMax5 = 37452.0
myLabel5 = 'Group 5'
myColor5 = QtGui.QColor('#08306b')
ranges.append((myMin5, myMax5, myLabel5, myColor5))

for myMin, myMax, myLabel, myColor in ranges:
  mySymbol = QgsSymbolV2.defaultSymbol(shp.geometryType())
  mySymbol.setColor(myColor)
  mySymbol.setAlpha(myOpacity)
  myRange = QgsRendererRangeV2(myMin, myMax, mySymbol, myLabel)
  myRangeList.append(myRange)

myRenderer = QgsGraduatedSymbolRendererV2('', myRangeList)
myRenderer.setMode(QgsGraduatedSymbolRendererV2.Quantile)
myRenderer.setClassAttribute(myColumn)

shp.setRendererV2(myRenderer)
../_images/561.png
  1. Es útil escribir el código en la Consola de Python para pequeñas tareas, pero es de lejos más fácil usar el Editor incorporado. Puedes copiar el script completo en el Editor y clic Ejecutar. Cuando el script culmine, habrás creado una unión de tablas y dado estilo a la capa resultante sin pasos manuales.

../_images/659.png

Abajo está el archivo completo join_attributes.py como referencia.

from PyQt4 import QtGui
zip_uri = '/vsizip/C:/Users/Ujaval/Downloads/tl_2013_06_tract.zip/tl_2013_06_tract.shp'
shp =  QgsVectorLayer(zip_uri, 'tl_2013_06_tract', 'ogr')
QgsMapLayerRegistry.instance().addMapLayer(shp)

csv_uri = "file:///C:/Users/Ujaval/Downloads/ca_tracts_pop.csv?delimiter=,"
csv = QgsVectorLayer(csv_uri, "ca_tracts_pop", "delimitedtext")
QgsMapLayerRegistry.instance().addMapLayer(csv)

shpField='GEOID'
csvField='GEO.id2'
joinObject = QgsVectorJoinInfo()
joinObject.joinLayerId = csv.id()
joinObject.joinFieldName = csvField
joinObject.targetFieldName = shpField
joinObject.memoryCache = True
shp.addJoin(joinObject)

myColumn = 'ca_tracts_pop_D001 '
myRangeList = []
myOpacity = 1

ranges = []

myMin1 = 0.0
myMax1 = 3157.2
myLabel1 = 'Group 1'
myColor1 = QtGui.QColor('#f7fbff')
ranges.append((myMin1, myMax1, myLabel1, myColor1))

myMin2 = 3157.2
myMax2 = 4019.0
myLabel2 = 'Group 2'
myColor2 = QtGui.QColor('#c7dcef')
ranges.append((myMin2, myMax2, myLabel2, myColor2))

myMin3 = 4019.0
myMax3 = 4865.8
myLabel3 = 'Group 3'
myColor3 = QtGui.QColor('#72b2d7')
ranges.append((myMin3, myMax3, myLabel3, myColor3))

myMin4 = 4865.8
myMax4 = 5996.4
myLabel4 = 'Group 4'
myColor4 = QtGui.QColor('#2878b8')
ranges.append((myMin4, myMax4, myLabel4, myColor4))

myMin5 = 5996.4
myMax5 = 37452.0
myLabel5 = 'Group 5'
myColor5 = QtGui.QColor('#08306b')
ranges.append((myMin5, myMax5, myLabel5, myColor5))

for myMin, myMax, myLabel, myColor in ranges:
    mySymbol = QgsSymbolV2.defaultSymbol(shp.geometryType())
    mySymbol.setColor(myColor)
    mySymbol.setAlpha(myOpacity)
    myRange = QgsRendererRangeV2(myMin, myMax, mySymbol, myLabel)
    myRangeList.append(myRange)

myRenderer = QgsGraduatedSymbolRendererV2('', myRangeList)
myRenderer.setMode(QgsGraduatedSymbolRendererV2.Quantile)
myRenderer.setClassAttribute(myColumn)

shp.setRendererV2(myRenderer)

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