1 votos

Script en Python para la función de selección por atributos en QGIS

Lo siguiente por supuesto funciona, selecciona estas características de mi_capa que tienen atributo 1 para mi_campo2 y añade los atributos correspondientes de mi_campo1 en mi_lista:

my_layer = iface.activeLayer()
indexmf = my_layer.fieldNameIndex("my_field1")
my_list = []

it = my_layer.getFeatures( QgsFeatureRequest().setFilterExpression ( u'"my_field2" = 1') )
my_layer.setSelectedFeatures( [ f.id() for f in it ] )
selection = my_layer.selectedFeatures()
for feature in selection:
    sfeat = feature.attributes()[indexmf]
    my_list.append(sfeat)

#and of course remove selection
layer.removeSelection()

Entonces, me gustaría crear una función para hacer lo anterior:

[editado.. funciona]

def my_function(layer, list, fieldname, attribute, index):
    it = layer.getFeatures( QgsFeatureRequest().setFilterExpression ( u'"%s" = {0}'.format(attribute) %fieldname ) ) 
    layer.setSelectedFeatures( [ f.id() for f in it ] )
    selection = layer.selectedFeatures()
    for feature in selection:
        sfeat = feature.attributes()[index]
        list.append(sfeat)
    layer.removeSelection()

Pero cuando lo llamo no pasa nada:

my_function(my_layer, my_list, "my_field2", 1, indexmf)

¿Podría ayudarme a entender lo que me falta?

1voto

Zoltan Puntos 284

El número de parámetros es diferente en la definición de la función y en la llamada a la función, por lo que su expresión de filtro no filtrará nada, porque sustituirá indexmf por atributo en su función e index será indefinido.

Supongo que tu código sería más claro si tu función devolviera la lista de resultados. Por ejemplo

def my_function(layer, fieldname, attribute, index): list = [] ... list.append(...) return list

y llamando a la función:

mylist += my_function(....)

1voto

Ajmer Singh Phull Puntos 21

Parece que tu función no funciona ya que pones tus atributos en la cadena de la expresión de filtro, por lo que Python no asigna el valor que le asignas.

Sustituya esta línea

it = layer.getFeatures( QgsFeatureRequest().setFilterExpression ( u'"fieldname" = attribute' ) )

con

it = layer.getFeatures( QgsFeatureRequest().setFilterExpression ( u'"%s" = '+str(attribute) % fieldname ) )

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