14 votos

Cómo obtener los nombres de los campos en pyqgis 2.0

Estoy intentando cambiar un plugin de QGIS 1.8 a 2.0. En la versión 1.8 creo una tabla con los nombres de los campos así:

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

He probado 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 pendingFields() no me funciona. ¿Hay algún método nuevo para obtener los nombres de los campos?

27voto

GreyCat Puntos 146

Es más sencillo 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 despué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}
.....

Generalmente para explorar una nueva función, uso el dir() o el véase 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() así que

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

Así que..:

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

0 votos

Ok esto funciona, pero solo en el editor de Python 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. Traté de mostrar un messagebox después pero no llega a la línea de código. ¿Tal vez me olvidé de importar algo? Tengo qgis.core, qgis.gui y qgis.utils importados.

0 votos

Debe utilizar .dataprovider(), vea la adición en mi respuesta

0 votos

Gracias. Ya funciona. El problema es que intento obtener el id de la capa activa con getLayerID() pero esto ya no funciona.

1voto

Rihan Meij Puntos 362

Por ejemplo, funciona así (desde la última versión de QGIS 1.9):

layer = vlayer # QGsVectorlayerObject
prov = vlayer.dataProvider()
fieldNames = []
fields = prov.fields()
for field in fields:
    fieldNames.append( field.name() )

1 votos

Para mí esto no funciona. Cuando intento iterar por los campos no pasa nada. ¿Sigue siendo utilizable el dataProvider de la 2.0?

1 votos

Jup es. Y para mi plugin el código anterior funciona sin problemas. intenta imprimir el tipo y contenido de los objetos mientras se ejecuta el código. Ayuda a la depuración

0 votos

Trabajó con QgsMapLayerRegistry.instance().mapLayers().values():

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X