Abrufen der Daten eines ausgewählten Features in QGIS mit Python?


10

Ich habe ein Problem / eine Frage zu Python und QGIS. Ist es möglich, die Daten eines ausgewählten Features in QGIS mit Python abzurufen, und wenn ja, wie?

In meinem Beispiel habe ich eine Ebene, die einige Parzellen für die Stadtplanung zeigt. Wenn ich jetzt eines der Pakete auswähle, möchte ich die Daten für genau dieses Paket erhalten. Diese Daten sollten von einem Python-Skript ausgelesen und dann einer automatisch erstellten PDF-Datei hinzugefügt werden. Der letzte Schritt ist einfach, aber ich habe die Daten von dieser ausgewählten Funktion nicht erhalten.

Es ist möglich, Daten von der aktiven Ebene abzurufen, aber ist es auch möglich, Daten von einem ausgewählten Merkmal dieser Ebene abzurufen?

Hoffe du kannst mir helfen. Grüße

Antworten:


15

Beim Anrufen layer.selectedFeatures()wird eine Liste mit den ausgewählten Funktionen zurückgegeben. Sie können dann feature.attributeMap()jedes der ausgewählten Features aufrufen , um ein Wörterbuch der Attribute jedes Features abzurufen.

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())

Vor kurzem wurde hier eine ähnliche Frage beantwortet: Wie überprüfe ich beim Durchlaufen einer Vektorebene mit pyqgis, ob ein Feature ausgewählt ist?


seltsam, die QgsFeature-Objekte, die aus den selected_features resultieren, haben keine Geometriemethode ...
user32882

9

Ich wollte nur einige Aktualisierungen der vorherigen Antwort veröffentlichen, da Änderungen an der QGIS Python-API seit Version 2.0 vorgenommen wurden .

Nach wie vor würden Sie eine Liste ausgewählter Funktionen erhalten iface.activeLayer().selectedFeatures(), in QGISVersionen verwenden >= 2.0Sie jetzt jedoch die Funktion QgsFeature.attributes()anstelle von QgsFeature.attributeMap(). Die beiden Funktionen sind nicht genau gleich: attributes()Jetzt wird eine Liste zurückgegeben , während die alte attributeMap()ein Wörterbuch zurückgibt . Nehmen Sie einen Moment der API - Dokumentation zu durchsuchen QgsFeature.attributes(), QgsAttributesusw. zu verstehen , wie Attribute gespeichert / abgerufen.

Wenn Sie interessiert sind, können Sie einige der Gründe für die API-Änderungen in diesem Mailinglisten-Thread nachlesen : [Qgis-Entwickler] Neue Vektor-API-Auswahlfunktionen . Kurz (in den Worten des QGIS-Entwicklers Martin Dobias):

Zugriff auf Attribute: Es gibt keine f.attributeMap()mehr, da Attribute jetzt in einem Vektor (Python :) listanstelle einer Karte (Python :) gespeichert werden dict. QgsFeatureDie Klasse emuliert das Python-Containerobjekt 4, sodass Sie auf Attribute zugreifen können, als wäre die QgsFeatureInstanz eine Liste oder ein Wörterbuch, wobei die Schlüssel entweder Feldindizes oder Feldnamen sind:

f[0] ... erstes Attribut

f["type"] ... Attribut mit dem Namen "Typ"

Es ist weiterhin möglich, alle Attribute f.attributes()abzurufen : Gibt eine Liste mit Werten zurück.

Angenommen, Sie hatten eine Ebene mit cityFeatures, die jeweils eine Liste von Attributen enthalten, einschließlich eines countyAttributs. Gehen countySie Helena, ARin der Python-Konsole folgendermaßen vor, um den Wert für eine bestimmte Stadt zu erhalten, die Sie ausgewählt haben (z. B. ):

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

Wenn Sie die Werte aller Felder in der Attributtabelle der Stadt anzeigen möchten, verwenden Sie einfach:

cityData = city.attributes()

Sie können auch alle Feldnamen aus diesem Beispiel mit city.fields (). Names () abrufen, wodurch eine Liste der Feldnamen zurückgegeben wird.
Cary H

1

Ich möchte der Antwort von J. Taylor etwas Nützliches hinzufügen und darauf hinweisen, dass die derzeit akzeptierte Antwort aus dem Jahr 2012 nicht mehr korrekt ist:

Das QgsFeature-Objekt unterstützt nützliche __geo_interface__Attribute, die ein Wörterbuch von einem bestimmten Feature zurückgeben. Das Wörterbuch befindet sich tatsächlich in einem GeoJSON-Standard, sodass alle Attribut-Wert-Paare und die Geometrie enthalten sind. Die Funktion existiert bereits seit einiger Zeit und wurde erstmals 2012 von Sean Gillies beschrieben. Ein Beispiel hierfür ist die Verwendung . Ich konnte keine Informationen finden, von welcher Version von QGIS es verfügbar ist, und ich habe QGIS 3 noch nicht ausprobiert, war aber sicherlich ab mindestens QGIS 2.14 verfügbar.

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.