¿Cómo leer los valores de los atributos usando PyQGIS?


18

¿Cuál es la forma de obtener la información contenida en la tabla de atributos, digamos en la columna 2, fila 2 usando pyqgis?


Esto es útil, pero solo parece darle el valor de los atributos. Parece que los atributos deben ser un par de nombre / valor. ¿Cómo se obtiene el nombre de cada atributo? ¿De eso se tratan los "campos"?
ajpieri

Esto realmente no responde la pregunta. Si tiene una pregunta diferente, puede hacerla haciendo clic en Hacer pregunta . También puede agregar una recompensa para llamar más la atención sobre esta pregunta una vez que tenga suficiente reputación . - De la opinión
Martin Hügi

Respuestas:


43

Para recorrer cada entidad en una capa, use el getFeatures()generador. Esto devuelve un iterador de características ( QgsFeature) en la capa.

for feature in layer.getFeatures():
    pass # do something with feature

Si solo está interesado en una característica en particular, en lugar de todas las características en la capa, puede acceder a ella usando un QgsFeatureRequesty es FID:

fid = 1 # the second feature (zero based indexing!)
iterator = layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
feature = next(iterator)

Una vez que tenga un QgsFeatureobjeto, puede usar el attributes()método para recuperar los atributos (también conocidos como columnas o campos) asociados con esa característica (también conocida como fila), por ejemplo:

# get the feature's attributes
attrs = feature.attributes()
# print the second attribute (note zero based indexing of Python lists)
print(attrs[1])

Si desea indexar el campo por su nombre, en lugar de un número, debe usar las asignaciones de campo:

idx = layer.fieldNameIndex('name')
print(feature.attributes()[idx])

El índice de campo no debería cambiar durante el ciclo, por lo que solo debe llamarlo una vez.

Hay más información y ejemplos en el libro de cocina PyQGIS: http://www.qgis.org/pyqgis-cookbook/vector.html#iterating-over-vector-layer

Actualizar

Puede acceder a los atributos de la característica con mucha más facilidad utilizando el QgsFeaturetipo a dict, p. Ej.

for feature in layer.getFeatures():
    name = feature["name"]

No estoy seguro de qué versión llegó o si siempre ha estado allí.


11

Pensé que realmente agregaría algo de código, ya que googlear este problema devuelve esta pregunta ... la mayoría de las personas prefieren una explicación rápida o un fragmento de código a un enlace que conduce a una página que tiene mucha información adicional.

Para obtener la información en una tabla, primero debe acceder a las características de la capa . En mi caso pongo las características en una variable. Luego recorre las características , y para cada característica llama a sus atributos , que luego se pueden imprimir utilizando su índice de columna . Por ejemplo, si quisiera obtener todos los valores en la segunda columna, entonces haría esto:

lyr = iface.activeLayer()

features = lyr.getFeatures()

for feat in features:
    attrs = feat.attributes()
    print attrs[1]

1

Las respuestas anteriores solo muestran cómo hacer esto para la capa activa. Creo que, en muchos casos, es posible que desee encontrar dicho atributo para una capa que no son las capas activas o una capa marcada en la ventana Capas. El siguiente código obtendrá una lista de todas las capas que ha agregado a su ventana Capas (independientemente de si están marcadas o activas) y encontrará el atributo en la fila 2, columna 2.

from qgis.core import QgsProject

layer = QgsProject.instance().mapLayersByName("myLayerName")[0]
        value = layer.getFeature(2).attribute(2)

Nota mapLayersByName devuelve una lista de capas con el nombre dado. Supongo que existe uno para este ejemplo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.