Cara mendapatkan nama bidang di pyqgis 2.0

13

Saya mencoba mengubah plugin dari QGIS 1.8 ke 2.0. Dalam versi 1.8 saya membuat tabel nama bidang seperti ini:

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

Saya mencoba ini untuk versi 2.0 dengan

layer = vlayer
fieldNames = []

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

Tetapi pendingFields () tidak berfungsi untuk saya. Apakah sekarang ada metode baru untuk mendapatkan nama bidang?

Martin
sumber

Jawaban:

24

Ini lebih sederhana daripada dengan versi 1.8:

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

atau dalam satu baris

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

setelah

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

Secara umum untuk mengeksplorasi fungsi baru, saya menggunakan dir () atau modul lihat untuk memeriksa apa yang ada di dalamnya:

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

atau

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

Dan Anda dapat melihat bahwa ada fungsi field () jadi

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

dan sebuah bidang memiliki nama, tipe, presisi, ...:

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

begitu:

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

dengan .dataProvider ()

Ini adalah .field ()

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

dan

field_names = [field.name() for field in prov.fields()]
gen
sumber
ok ini berfungsi, tetapi hanya di Python Editor qgis. Ketika saya menggunakan fungsi ini di plugin saya tidak ada yang terjadi. Fungsi ini akan sampai untuk bidang di bidang tetapi ada yang berhenti. Saya mencoba menunjukkan kotak pesan setelah itu tetapi tidak mencapai kode. Mungkin saya lupa mengimpor sesuatu? Saya telah mengimpor qgis.core, qgis.gui dan qgis.utils.
Martin
Anda harus menggunakan .dataprovider (), lihat tambahan di balasan saya
gen
Terima kasih. Ini bekerja. Masalahnya adalah bahwa saya mencoba untuk mendapatkan id lapisan dari lapisan aktif dengan getLayerID()tetapi ini tidak berfungsi lagi.
Martin
2

Ini berfungsi misalnya seperti ini (sejak QGIS dev 1.9 terakhir):

layer = vlayer # QGsVectorlayerObject
prov = vlayer.dataProvider()
fieldNames = []
fields = prov.fields()
for field in fields:
    fieldNames.append( field.name() )
Curlew
sumber
1
Bagi saya ini tidak berhasil. Ketika saya mencoba untuk beralih melalui bidang tidak ada yang terjadi. Apakah dataProvider dalam 2.0 masih dapat digunakan?
Martin
1
jup itu. Dan untuk plugin saya kode di atas berfungsi tanpa masalah. cobalah untuk mencetak jenis dan konten objek saat mengeksekusi kode. Membantu debugging
Curlew
bekerja dengan QgsMapLayerRegistry.instance (). mapLayers (). values ​​():
Muhammad Faizan Khan