Як отримати імена полів у pyqgis 2.0


13

Я намагаюся змінити плагін з QGIS 1.8 на 2.0. У версії 1.8 я створюю таблицю таких імен полів:

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

Я спробував це для версії 2.0 з

layer = vlayer
fieldNames = []

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

Але pendingFields () для мене не працює. Чи існує зараз новий метод отримання назв полів?

Відповіді:


24

Це простіше, ніж у версії 1.8:

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

або в одному рядку

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

після

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

Як правило, для вивчення нової функції я використовую dir () або модуль see, щоб вивчити, що знаходиться всередині:

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

або

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

І ви можете бачити, що існує функція field ()

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

і поле має ім'я, тип, точність, ...:

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

так:

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

з .dataProvider ()

Це .field ()

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

і

field_names = [field.name() for field in prov.fields()]

добре це працює, але тільки в редакторі Python qgis. Коли я використовую цю функцію у своєму плагіні, нічого не відбувається. Ця функція переходить до поля в полях, але там вона зупиняється. Я спробував потім показати поле повідомлень, але воно не доходить до кодової лінії. Може, я забув щось імпортувати? У мене імпортуються qgis.core, qgis.gui та qgis.utils.
Мартін

ви повинні використовувати .dataprovider (), див. додаток у моїй відповіді
ген

Дякую. Це працює. Проблема полягала в тому, що я намагаюся отримати ідентифікатор шару з активного шару, getLayerID()але це більше не працює.
Мартін

2

Це працює, наприклад, так (з часу останнього QGIS, розробленого 1.9):

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

1
Для мене це не працює. Коли я намагаюся перебрати поля, нічого не відбувається. Чи є DataProvider в 2.0 все ще корисним?
Мартін

1
так, це так. А для мого плагіна вищевказаний код працює без проблем. спробуйте роздрукувати тип та вміст об’єктів під час виконання коду. Допомагає налагодження
Curlew

працював з QgsMapLayerRegistry.instance (). mapLayers (). значень ():
Muhammad Faizan Khan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.