Comment lire les valeurs d'attribut à l'aide de PyQGIS?


18

Comment obtenir les informations contenues dans la table attributaire, disons dans la colonne 2, ligne 2, en utilisant pyqgis?


C'est utile, mais cela semble seulement vous donner la valeur des attributs. Il semble que les attributs doivent être une paire nom / valeur. Comment obtenez-vous le nom de chaque attribut? Est-ce à cela que servent les "champs"?
ajpieri

Cela ne répond pas vraiment à la question. Si vous avez une autre question, vous pouvez la poser en cliquant sur Poser une question . Vous pouvez également ajouter une prime pour attirer davantage l'attention sur cette question une fois que vous avez suffisamment de réputation . - De l'avis
Martin Hügi

Réponses:


43

Pour boucler sur chaque entité d'une couche, utilisez le getFeatures()générateur. Cela renvoie un itérateur de fonctionnalités ( QgsFeature) dans la couche.

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

Si vous êtes uniquement intéressé par une entité particulière, au lieu de toutes les entités de la couche, vous pouvez y accéder en utilisant un QgsFeatureRequestet c'est FID:

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

Une fois que vous avez un QgsFeatureobjet, vous pouvez utiliser la attributes()méthode pour récupérer les attributs (aka colonnes ou champs) associés à cette fonctionnalité (aka ligne), par exemple:

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

Si vous souhaitez indexer le champ par son nom, plutôt que par un nombre, vous devez utiliser les mappages de champs:

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

L'index de champ ne doit pas changer pendant la boucle, vous ne devez donc l'appeler qu'une seule fois.

Il y a plus d'informations et d'exemples dans le livre de recettes PyQGIS: http://www.qgis.org/pyqgis-cookbook/vector.html#iterating-over-vector-layer

Mise à jour

Vous pouvez accéder aux attributs de fonctionnalité beaucoup plus facilement en utilisant le QgsFeaturemême type dict, par exemple

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

Je ne sais pas quelle version est entrée ou si elle a toujours été là.


11

Je pensais que j'ajouterais du code, car googler ce problème renvoie cette question ... la plupart des gens préfèrent une explication rapide ou un extrait de code à un lien qui mène à une page qui contient beaucoup d'informations supplémentaires.

Pour obtenir les informations dans un tableau, vous devez d'abord accéder aux fonctionnalités de la couche . Dans mon cas, j'ai mis les fonctionnalités dans une variable. Ensuite, vous parcourez les fonctionnalités et pour chaque fonctionnalité, vous appelez ses attributs , qui peuvent ensuite être imprimés à l'aide de leur index de colonne . Par exemple, si je voudrais obtenir toutes les valeurs de la deuxième colonne, je ferais ceci:

lyr = iface.activeLayer()

features = lyr.getFeatures()

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

1

Les réponses ci-dessus montrent uniquement comment procéder pour le calque actif. Je pense que, dans de nombreux cas, vous souhaiterez peut-être trouver cet attribut pour un calque qui n'est pas les calques actifs ou un calque vérifié dans la fenêtre Calques. Le code ci-dessous obtiendra une liste de tous les calques que vous avez ajoutés à votre fenêtre Calques (qu'ils soient cochés ou actifs) et trouvera l'attribut à la ligne 2, colonne 2.

from qgis.core import QgsProject

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

Remarque mapLayersByName renvoie une liste de couches avec le nom donné. Je suppose qu'il en existe un pour cet exemple.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.