5 votos

¿Realizar uniones de tablas específicas en QGIS mediante python?

Estoy intentando actualizar un campo existente en un shapefile utilizando datos de otro shapefile. Básicamente, cada tabla de atributos contiene un campo ID que quiero utilizar para actualizar un campo llamado "dirección".

Hasta ahora, he intentado utilizar el procesamiento alg "qgis:joinattributestable" y QgsVectorJoinInfo(). Sin embargo, ambas soluciones parecen crear campos de unión temporales que no me sirven para nada.

¿Es esto posible con QGIS?

5voto

Mue Puntos 2469

Podrías usar algo como lo siguiente que:

  1. Une sus shapefiles utilizando QgsVectorJoinInfo()
  2. Actualiza el dirección campo
  3. Elimina la unión

# Change names to match your layer names
layer_1_name = str("layer_1")
layer_2_name = str("layer_2")

for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    if layer.name() == layer_1_name:
        qgis.utils.iface.setActiveLayer(layer)
        layer_1 = qgis.utils.iface.activeLayer()    
    if layer.name() == layer_2_name:
        qgis.utils.iface.setActiveLayer(layer)
        layer_2 = qgis.utils.iface.activeLayer()

# Set up join parameters            
layer_1_Field='ID'
layer_2_Field='ID'
joinObject = QgsVectorJoinInfo()
joinObject.joinLayerId = layer_2.id()
joinObject.joinFieldName = layer_2_Field
joinObject.targetFieldName = layer_1_Field
joinObject.memoryCache = True
layer_1.addJoin(joinObject)

# Define original field and joined field to update
original_field = layer_1.fieldNameIndex('address') 
joined_field = layer_1.fieldNameIndex(layer_2_name + '_address')

layer_1.startEditing()
for feat in layer_1.getFeatures():
    layer_1.changeAttributeValue(feat.id(), original_field, feat.attributes()[joined_field])

# Save the changes
layer_1.commitChanges()

# Remove join 
layer_1.removeJoin(layer_2.id())

El código fue adaptado de un respuesta anterior .

0 votos

Muchas gracias por eso, funcionó sin problemas. ¿Hay alguna forma de conseguir que funcione utilizando capas abiertas con 'QgsVectorLayer()'? He intentado asignar mis capas de la siguiente manera pero la unión no parece funcionar: ' Capa 1 = QgsVectorLayer("path", "name". "ogr) Capa 2 = QgsVectorLayer("path", "name, "ogr") Gracias

0 votos

@JamieTasker - ¡De nada! Has definido las capas pero ¿las has cargado con QgsMapLayerRegistry.instance().addMapLayers([layer1, layer2]) ?

1 votos

Excelente, es exactamente lo que buscaba. Muchas gracias por su ayuda.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X