Obtenir les données d'une fonctionnalité sélectionnée dans QGIS à l'aide de Python?

10

J'ai un problème / une question concernant python et QGIS. Est-il possible d'obtenir les données d'une fonctionnalité sélectionnée dans QGIS en utilisant python, et si oui, comment?

Dans mon exemple, j'ai une couche qui montre quelques parcelles pour l'urbanisme. Si je sélectionne maintenant l'un des colis, je veux obtenir les données exactes pour ce colis. Ces données doivent être lues par un script python puis ajoutées à un fichier PDF créé automatiquement. La dernière étape est facile, mais je n'ai pas obtenu les données de cette fonctionnalité sélectionnée.

Il est possible d'obtenir des données de la couche active, mais est-il également possible d'obtenir les données d'une entité sélectionnée de cette couche?

J'espère que tu peux m'aider. Cordialement

Sven
la source

Réponses:

15

L'appel layer.selectedFeatures()renvoie une liste avec les fonctions sélectionnées. Vous pouvez ensuite faire appel feature.attributeMap()à chacune des entités sélectionnées pour obtenir un dictionnaire des attributs de chaque entité.

layer = qgis.utils.iface.activeLayer()
selected_features = layer.selectedFeatures()
for i in selected_features:
    attrs = i.attributeMap()
    for (k,attr) in attrs.iteritems():
    print "%d: %s" % (k, attr.toString())

J'ai récemment répondu à une question similaire ici: lors de l'itération sur une couche vectorielle avec pyqgis, comment puis-je vérifier si une entité est sélectionnée?

Cyrus
la source
bizarre, les objets QgsFeature qui résultent des selected_features n'ont pas de méthode de géométrie ...
user32882
9

Je voulais juste publier quelques mises à jour de la réponse précédente à la lumière des modifications apportées à l'API QGIS Python depuis la version 2.0 .

Comme auparavant, vous obtiendrez une liste des fonctionnalités sélectionnées avec iface.activeLayer().selectedFeatures(), mais dans les QGISversions, >= 2.0vous utilisez maintenant la fonction à la QgsFeature.attributes()place de QgsFeature.attributeMap(). Les deux fonctions ne sont pas exactement les mêmes: attributes()renvoie maintenant une liste , alors que l'ancienne attributeMap()renvoyait un dictionnaire . Prenez un moment pour parcourir la documentation de l' API pour QgsFeature.attributes(), QgsAttributes, etc pour comprendre comment les attributs sont stockés / accessibles.

Si vous êtes intéressé, vous pouvez lire certaines des raisons derrière les changements d'API sur ce fil de liste de diffusion: [Qgis-developer] nouvelles fonctionnalités de sélection de l'API vectorielle . En bref (selon les mots du développeur QGIS Martin Dobias):

Accès aux attributs: il n'y en a f.attributeMap()plus, car les attributs sont désormais stockés dans un vecteur (Python:) listau lieu d'une carte (Python:) dict. QgsFeatureLa classe émule l'objet conteneur Python 4 afin que vous puissiez accéder aux attributs comme si l' QgsFeatureinstance était une liste ou un dictionnaire, les clés étant soit des index de champ, soit des noms de champ:

f[0] ... premier attribut

f["type"] ... attribut nommé "type"

Il est toujours possible d'obtenir tous les attributs: f.attributes()retourne une liste de valeurs.

Donc, à titre d'exemple de ce que vous avez demandé comment faire (obtenir des données pour une seule entité que vous avez sélectionnée), supposons que vous disposiez d'une couche d' cityentités contenant chacune une liste d'attributs, y compris un countyattribut. Pour obtenir la countyvaleur d'une ville spécifique que vous avez sélectionnée (par exemple Helena, AR), procédez comme suit dans la console Python:

city = iface.activeLayer().selectedFeatures()[0]
city["county"]
# OUTPUTS: u'Phillips'

Si vous voulez les valeurs de tous les champs de la table attributaire de la ville, vous utiliserez simplement:

cityData = city.attributes()
J. Taylor
la source
Vous pouvez également obtenir tous les noms de champs de cet exemple en utilisant city.fields (). Names () qui retournerait une liste de noms de champs.
Cary H
1

Je voudrais ajouter quelque chose d'utile à la réponse fournie par J. Taylor et souligner que la réponse actuellement acceptée de 2012 n'est plus correcte:

L'objet QgsFeature prend en charge l' __geo_interface__attribut utile , qui renvoie un dictionnaire à partir d'une fonctionnalité donnée. Le dictionnaire est en fait dans une norme GeoJSON, donc vous obtenez toutes les paires attribut-valeur et la géométrie incluses. La fonctionnalité existe depuis un certain temps maintenant, décrite pour la première fois par Sean Gillies en 2012, avec un exemple d'utilisation ici . Je n'ai trouvé aucune information à partir de quelle version de QGIS est disponible et je n'ai pas encore essayé QGIS 3, mais il était sûrement disponible à partir d'au moins QGIS 2.14.

TL; DR:

layer = qgis.utils.iface.activeLayer()
selected_features = layer.selectedFeatures()
for i in selected_features:
    attrs = i.__geo_interface__
    print attrs # GeoJSON attributes of a feature
adamczi
la source