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:
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]
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 importQgsProject
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.
Antworten:
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.Wenn Sie sich nur für ein bestimmtes Feature interessieren, können Sie statt für alle Features in der Ebene mit a
QgsFeatureRequest
und FID darauf zugreifen :Sobald Sie ein
QgsFeature
Objekt haben, können Sie dieattributes()
Methode verwenden, um die Attribute (auch als Spalten oder Felder bezeichnet) abzurufen, die mit dieser Funktion (auch als Zeile bezeichnet) verknüpft sind. Beispiel:Wenn Sie das Feld nach seinem Namen anstatt nach einer Zahl indizieren möchten, müssen Sie die Feldzuordnungen verwenden:
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
QgsFeature
a verwendendict
, zIch bin mir nicht sicher, welche Version reinkam oder ob sie schon immer da war.
quelle
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:
quelle
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.
Hinweis mapLayersByName gibt eine Liste von Layern mit dem angegebenen Namen zurück. Ich gehe davon aus, dass eines für dieses Beispiel existiert.
quelle