Como obter nomes de campos no pyqgis 2.0

13

Estou tentando alterar um plugin do QGIS 1.8 para 2.0. Na versão 1.8, crio uma tabela com os nomes dos campos assim:

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

Eu tentei isso para a versão 2.0 com

layer = vlayer
fieldNames = []

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

Mas pendingFields () não funciona para mim. Existe agora um novo método para obter os nomes dos campos?

Martin
fonte

Respostas:

24

É mais simples que na versão 1.8:

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

ou em uma linha

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

um depois

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

Geralmente, para explorar uma nova função, uso o dir () ou o módulo see para examinar o que há dentro:

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

E você pode ver que existe uma função field ()

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

e um campo tem um nome, um tipo, uma precisão, ...:

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

assim:

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

com .dataProvider ()

É .field ()

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

e

field_names = [field.name() for field in prov.fields()]
gene
fonte
ok isso funciona, mas apenas no editor Python do qgis. Quando eu uso essa função no meu plugin, nada acontece. A função vai até o campo nos campos, mas aí para. Tentei mostrar uma caixa de mensagens depois, mas ela não atinge a linha de código. Talvez eu tenha esquecido de importar alguma coisa? Eu tenho qgis.core, qgis.gui e qgis.utils importados.
Martin
você deve usar .dataprovider (), veja adição na minha resposta
gene
Obrigado. Está funcionando. O problema foi que tento obter o ID da camada da camada ativa, getLayerID()mas isso não está mais funcionando.
Martin
2

Funciona, por exemplo, assim (desde o último QGIS dev 1.9):

layer = vlayer # QGsVectorlayerObject
prov = vlayer.dataProvider()
fieldNames = []
fields = prov.fields()
for field in fields:
    fieldNames.append( field.name() )
Maçarico
fonte
1
Para mim, isso não funciona. Quando tento percorrer os campos, nada acontece. O dataProvider no 2.0 ainda é utilizável?
Martin
1
jup é. E para o meu plugin o código acima funciona sem problemas. tente imprimir o tipo e o conteúdo dos objetos enquanto executa o código. Ajuda a depuração
Curlew
trabalhou com QgsMapLayerRegistry.instance (). mapLayers (). values ​​():
Muhammad Faizan Khan