1 votos

QGIS 3.10.8 Añadir características y atributos a la capa existente usando python

¿Existe una forma de añadir características de una capa a otra haciendo coincidir los nombres de los atributos utilizando Python?

Usando QGIS 3.10.8 Estoy tratando de añadir características a una capa existente. He estado utilizando el código siguiente para añadir las características, este código sin embargo no coincide con los nombres de los atributos y rellena las características añadidas en el orden de la capa que estoy obteniendo características de.

Por ejemplo: Si tengo N-1 atributos en la capa de la que estoy obteniendo las características, los datos añadirán características, pero añadirán "NULL" a las últimas columnas de atributos, mientras que los atributos con "NULL" deberían haber estado en otro lugar, ilustrado en la imagen de abajo.

¿Hay alguna forma de garantizar que las características se añadan al atributo correcto?

layer = QgsVectorLayer(Out, "Out","ogr")
feats = []
for feat in Inn.getFeatures():
    feats.append(feat)
layer.startEditing()
dp = layer.dataProvider()
dp.addFeatures(feats)
layer.commitChanges()

Illustration of problem

2voto

Jeremy White Puntos 381

Hace tiempo escribí este script que debería hacer lo que quieres. La clave está en configurar tu mapeo de campos en listas anidadas. Puedes usar este enfoque para hacer coincidir campos con nombres completamente diferentes y tener control sobre la coincidencia de qué atributos se copian a qué campo en la capa de destino. Sin embargo, en su caso, se asegurará de que "Att2" se copie en "Att2", "Att3" en "Att3", etc. Si tiene un campo "Att1" en su capa de destino, estará vacío o será nulo para la característica copiada. Deberá cambiar los nombres de las capas en el script para que coincidan con los nombres de las capas de origen y destino.

project = QgsProject().instance()
# Set up field mapping in lists below e.g. ['Layer A field name', 'Layer B field name']
fld_map = [['Att2', 'Att2'],
            ['Att3', 'Att3']]

layer_1 = project.mapLayersByName('Layer_A')[0] # change 'Layer A' to the name of your source layer
L1_feats = [f for f in layer_1.getFeatures()]

layer_2 = project.mapLayersByName('Layer_B')[0] # change 'Layer B' to the name of your target layer
pr_2 = layer_2.dataProvider()
layer_2.startEditing()
for feat in L1_feats:
    atts = {}
    for item in fld_map:
        atts[layer_2.fields().lookupField(item[1])]= feat.attribute(layer_1.fields().lookupField(item[0]))
    L2_feat = QgsFeature()
    L2_feat.setGeometry(feat.geometry())
    pr_2.addFeature(L2_feat)
    pr_2.changeAttributeValues({L2_feat.id(): atts})
layer_2.commitChanges()
layer_2.updateExtents()

En realidad empecé a implementar esto en un plugin pero me desvié y nunca lo terminé. Todavía tengo la intención de terminarlo cuando tenga la oportunidad y subirlo al repositorio.

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