Wie man in pyqgis 2.0 Feldnamen erhält

13

Ich versuche ein Plugin von QGIS 1.8 auf 2.0 zu ändern. In der 1.8-Version erstelle ich eine Tabelle mit den Feldnamen wie folgt:

layer = vlayer
provider = layer.dataProvider()
feat = QGSFeatrue()
allAttrs = provider.attributeIndexes()
provider.select(allAttrs)
fieldNames = []

while provider.nextFeature(feat)
    fields = layer.pendingFields()
    for (k, field) in fields.iteritems():
         fieldNames.append(field.name())

Ich habe das für die 2.0 Version mit probiert

layer = vlayer
fieldNames = []

for feature in layer.getFeatures():
    fields = layer.pendingFields()
    for (k, field) in fields.iteritems():
         fieldNames.append(field.name())

Aber pendingFields () funktioniert bei mir nicht. Gibt es jetzt eine neue Methode, um die Namen der Felder zu erhalten?

Martin
quelle

Antworten:

24

Es ist einfacher als mit Version 1.8:

layer = qgis.utils.iface.activeLayer()  
fields = layer.pendingFields()   
field_names = [field.name() for field in fields]

oder in einer Zeile

field_names = [field.name() for field in layer.pendingFields() ]

ein nachher

for elem in layer.getFeatures():  
   print dict(zip(field_names, elem.attributes()))
{u'adip': 17, u'dipdir': 130, u'tdip': 29}
{u'adip': 55, u'dipdir': 325, u'tdip': 75}
.....

Im Allgemeinen verwende ich zum Erkunden einer neuen Funktion das Modul dir () oder see , um zu überprüfen, was darin enthalten ist:

dir(fields)
['FieldOrigin', 'OriginEdit', 'OriginJoin', 'OriginProvider', 'OriginUnknown', '__class__', '__delattr__', '__delitem__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__len__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'append', 'at', 'clear', 'count', 'extend', 'field', 'fieldOrigin', 'fieldOriginIndex', 'indexFromName', 'isEmpty', 'remove', 'size', 'toList']

oder

see(fields)
[]                 hash()             help()             len()
repr()             str()              .FieldOrigin()     .OriginEdit
.OriginJoin        .OriginProvider    .OriginUnknown     .append()
.at()              .clear()           .count()           .extend()
.field()           .fieldOrigin()     .fieldOriginIndex()
.indexFromName()   .isEmpty()         .remove()          .size()
.toList()

Und Sie können sehen, dass es eine field () - Funktion gibt

print fields.field(0)
qgis.core.QgsField object at 0x163E39C0

und ein Feld hat einen Namen, einen Typ, eine Genauigkeit, ...:

see(fields.field(0))
<                 <=                ==                !=                >
>=                hash()            help()            repr()
str()             .comment()        .displayString()  .length()
.name()           .precision()      .setComment()     .setLength()
.setName()        .setPrecision()   .setType()        .setTypeName()
.type()           .typeName()

so:

fields.field(0).name()
u'adip'
fields.field(0).type()
2
fields.field(0).typeName()
u'Integer'
fields.field(0).precision()
0
....

mit .dataProvider ()

Es ist .field ()

....
prov = layer.dataProvider()
prov.fields().field(0).name()
u'adip'
prov.fields().field(0).typeName()
u'Integer'

und

field_names = [field.name() for field in prov.fields()]
Gen
quelle
ok das klappt aber nur im python editor von qgis. Wenn ich diese Funktion in meinem Plugin benutze, passiert nichts. Die Funktion läuft bis zum Feld in Feldern, aber dort hört sie auf. Ich habe danach versucht, eine Nachrichtenbox anzuzeigen, aber sie erreicht nicht die Codeline. Vielleicht habe ich vergessen, etwas zu importieren? Ich habe qgis.core, qgis.gui und qgis.utils importiert.
Martin
Sie müssen .dataprovider () verwenden, siehe Zusatz in meiner Antwort
Gen
Vielen Dank. Es funktioniert. Das Problem war, dass ich versucht habe, die Ebenen-ID von der aktiven Ebene abzurufen, getLayerID()aber dies funktioniert nicht mehr.
Martin
2

Es funktioniert zum Beispiel so (seit dem letzten QGIS-Entwickler 1.9):

layer = vlayer # QGsVectorlayerObject
prov = vlayer.dataProvider()
fieldNames = []
fields = prov.fields()
for field in fields:
    fieldNames.append( field.name() )
Brachvogel
quelle
1
Bei mir funktioniert das nicht. Wenn ich versuche, durch Felder zu iterieren, passiert nichts. Ist der dataProvider in 2.0 noch verwendbar?
Martin
1
jup ist es. Und für mein Plugin funktioniert der obige Code ohne Probleme. Versuchen Sie, Typ und Inhalt der Objekte auszudrucken, während Sie den Code ausführen. Hilft beim Debuggen
Curlew
arbeitete mit QgsMapLayerRegistry.instance (). mapLayers (). values ​​():
Muhammad Faizan Khan