Comment obtenir des noms de champs dans pyqgis 2.0

13

J'essaie de changer un plugin de QGIS 1.8 à 2.0. Dans la version 1.8, je crée une table des noms de champs comme ceci:

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

J'ai essayé cela pour la version 2.0 avec

layer = vlayer
fieldNames = []

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

Mais pendingFields () ne fonctionne pas pour moi. Existe-t-il maintenant une nouvelle méthode pour obtenir les noms des champs?

Martin
la source

Réponses:

24

C'est plus simple qu'avec la version 1.8:

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

ou en une seule ligne

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

un après

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}
.....

Généralement pour explorer une nouvelle fonction, j'utilise le dir () ou le module see pour examiner ce qu'il y a à l'intérieur:

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']

ou

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

Et vous pouvez voir qu'il y a une fonction field () donc

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

et un champ a un nom, un type, une précision, ...:

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

donc:

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

avec .dataProvider ()

C'est .field ()

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

et

field_names = [field.name() for field in prov.fields()]
gène
la source
ok cela fonctionne, mais uniquement dans l'éditeur Python de qgis. Lorsque j'utilise cette fonction dans mon plugin, rien ne se passe. La fonction va jusqu'au champ dans les champs mais là elle s'arrête. J'ai essayé de montrer une boîte de message par la suite mais elle n'atteint pas la ligne de code. J'ai peut-être oublié d'importer quelque chose? J'ai importé qgis.core, qgis.gui et qgis.utils.
Martin
vous devez utiliser .dataprovider (), voir l'addition dans ma réponse
gène
Je vous remercie. Ça fonctionne. Le problème était que j'essaie d'obtenir l'ID de la couche avec la couche active getLayerID()mais cela ne fonctionne plus.
Martin
2

Cela fonctionne par exemple comme ceci (depuis le dernier dev QGIS 1.9):

layer = vlayer # QGsVectorlayerObject
prov = vlayer.dataProvider()
fieldNames = []
fields = prov.fields()
for field in fields:
    fieldNames.append( field.name() )
Courlis
la source
1
Pour moi, cela ne fonctionne pas. Lorsque j'essaie de parcourir les champs, rien ne se passe. Le fournisseur de données de 2.0 est-il toujours utilisable?
Martin
1
c'est ça. Et pour mon plugin, le code ci-dessus fonctionne sans problème. essayez d'imprimer le type et le contenu des objets lors de l'exécution du code. Aide au débogage
Courlis
a travaillé avec QgsMapLayerRegistry.instance (). mapLayers (). values ​​():
Muhammad Faizan Khan