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.
Fuente de Datos [TIGER] [USCENSUS]
Procedimiento¶
Puede escribir los siguientes comandos en la Consola Python o el Editor incorporado en QGIS.
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)

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)

Cree la tabla de unión. Las uniones de tabla son realizadas en QGIS usando el objeto
QgsVectorJoinInfo
. Necesitamos especificar el campoGEO.id2
de la capa CSV como el Campo de Unión y el campoGEOID
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)

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)

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 esca_tracts_pop_D001
. Aplicaremos un representador graduado usando la claseQgsGraduatedSymbolRendererV2
en el modoCuantil
. 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)

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.

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)