Wie lese ich die Attributwerte mit PyQGIS?

16

Wie erhält man die in der Attributtabelle enthaltenen Informationen, z. B. in Spalte 2, Zeile 2, mit pyqgis?

user16018
quelle
Dies ist hilfreich, aber dies scheint nur den Wert der Attribute anzugeben. Es scheint, dass Attribute ein Name / Wert-Paar sein müssen. Wie erhält man den Namen für jedes Attribut? Ist es das, worum es in den "Feldern" geht?
Ajpieri
Dies beantwortet die Frage nicht wirklich. Wenn Sie eine andere Frage haben, können Sie sie stellen, indem Sie auf Frage stellen klicken . Sie können auch ein Kopfgeld hinzufügen, um mehr Aufmerksamkeit auf diese Frage zu lenken, sobald Sie über genügend Ansehen verfügen . - Aus der Bewertung
Martin Hügi

Antworten:

41

Verwenden Sie den getFeatures()Generator, um alle Features in einer Ebene zu durchlaufen. Dies gibt einen Iterator von features ( QgsFeature) in der Ebene zurück.

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

Wenn Sie sich nur für ein bestimmtes Feature interessieren, können Sie statt für alle Features in der Ebene mit a QgsFeatureRequestund FID darauf zugreifen :

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

Sobald Sie ein QgsFeatureObjekt haben, können Sie die attributes()Methode verwenden, um die Attribute (auch als Spalten oder Felder bezeichnet) abzurufen, die mit dieser Funktion (auch als Zeile bezeichnet) verknüpft sind. Beispiel:

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

Wenn Sie das Feld nach seinem Namen anstatt nach einer Zahl indizieren möchten, müssen Sie die Feldzuordnungen verwenden:

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

Der Feldindex sollte sich während der Schleife nicht ändern, sodass Sie ihn nur einmal aufrufen müssen.

Weitere Informationen und Beispiele finden Sie im PyQGIS-Kochbuch: http://www.qgis.org/pyqgis-cookbook/vector.html#iterating-over-vector-layer

Aktualisieren

Sie können auf Merkmalsattribute viel einfacher zugreifen, indem Sie QgsFeaturea verwenden dict, z

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

Ich bin mir nicht sicher, welche Version reinkam oder ob sie schon immer da war.

Snorfalorpagus
quelle
11

Dachte, ich würde tatsächlich Code hinzufügen, da das Durchsuchen dieses Problems diese Frage zurückgibt. Die meisten Leute bevorzugen eine kurze Erklärung oder einen Codeausschnitt zu einem Link, der zu einer Seite mit vielen zusätzlichen Informationen führt.

Um die Informationen in einer Tabelle zu erhalten, müssen Sie zuerst auf die Funktionen des Layers zugreifen . In meinem Fall habe ich die Features in eine Variable geschrieben. Anschließend durchlaufen Sie die Features und rufen für jedes Feature seine Attribute auf , die dann anhand ihres Spaltenindex gedruckt werden können . Wenn ich zum Beispiel alle Werte in der zweiten Spalte erhalten möchte, würde ich Folgendes tun:

lyr = iface.activeLayer()

features = lyr.getFeatures()

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

Die obigen Antworten zeigen nur, wie dies für die aktive Ebene getan wird. Ich denke, in vielen Fällen möchten Sie das Attribut möglicherweise für eine Ebene suchen, die nicht die aktiven Ebenen ist, oder für eine Ebene, die im Ebenenfenster aktiviert ist. Der folgende Code zeigt eine Liste aller Ebenen an, die Sie Ihrem Ebenenfenster hinzugefügt haben (unabhängig davon, ob diese aktiviert oder aktiv sind). Das Attribut finden Sie in Zeile 2, Spalte 2.

from qgis.core import QgsProject

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

Hinweis mapLayersByName gibt eine Liste von Layern mit dem angegebenen Namen zurück. Ich gehe davon aus, dass eines für dieses Beispiel existiert.

Ajpieri
quelle