Cómo obtener nombres de campo en pyqgis 2.0

13

Estoy tratando de cambiar un complemento de QGIS 1.8 a 2.0. En la versión 1.8, creo una tabla de los nombres de campo como este:

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

Intenté esto para la versión 2.0 con

layer = vlayer
fieldNames = []

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

Pero pendienteFields () no funciona para mí. ¿Existe ahora un nuevo método para obtener los nombres de los campos?

Martín
fuente

Respuestas:

24

Es más simple que con la versión 1.8:

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

o en una línea

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

un despues

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

En general, para explorar una nueva función, uso el directorio () o el módulo ver para examinar lo que hay 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']

o

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

Y puedes ver que hay una función field ()

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

y un campo tiene un nombre, un tipo, una precisión, ...:

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

entonces:

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

con .dataProvider ()

Es .field ()

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

y

field_names = [field.name() for field in prov.fields()]
gene
fuente
ok esto funciona, pero solo en Python Editor de qgis. Cuando uso esta función en mi plugin no pasa nada. La función va hasta el campo en los campos pero allí se detiene. Intenté mostrar un cuadro de mensaje después pero no llega a la línea de código. ¿Tal vez olvidé importar algo? Tengo qgis.core, qgis.gui y qgis.utils importados.
Martin
debe usar .dataprovider (), vea la adición en mi respuesta
gene
Gracias. Está funcionando. El problema fue que traté de obtener la identificación de la capa de la capa activa, getLayerID()pero esto ya no funciona.
Martin
2

Funciona, por ejemplo, de esta manera (desde el último QGIS dev 1.9):

layer = vlayer # QGsVectorlayerObject
prov = vlayer.dataProvider()
fieldNames = []
fields = prov.fields()
for field in fields:
    fieldNames.append( field.name() )
Zarapito
fuente
1
Para mí esto no funciona. Cuando intento recorrer los campos, no pasa nada. ¿El dataProvider en 2.0 todavía es utilizable?
Martin
1
Jup lo es. Y para mi complemento, el código anterior funciona sin problemas. intente imprimir el tipo y el contenido de los objetos mientras ejecuta el código. Ayuda a depurar
Curlew
trabajó con QgsMapLayerRegistry.instance (). mapLayers (). values ​​():
Muhammad Faizan Khan