Cách lấy tên trường trong pyqgis 2.0


13

Tôi đang cố gắng thay đổi một plugin từ QGIS 1.8 thành 2.0. Trong phiên bản 1.8, tôi tạo một bảng các tên trường như thế này:

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

Tôi đã thử điều này cho phiên bản 2.0 với

layer = vlayer
fieldNames = []

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

Nhưng cấp phátFields () không hoạt động đối với tôi. Bây giờ có một phương pháp mới để lấy tên của các trường không?

Câu trả lời:


24

Nó đơn giản hơn so với phiên bản 1.8:

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

hoặc trong một dòng

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

một sau

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

Nói chung để khám phá một hàm mới, tôi sử dụng dir () hoặc mô-đun xem để kiểm tra những gì bên trong:

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

hoặc là

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

Và bạn có thể thấy rằng có một hàm field ()

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

và một trường có tên, loại, độ chính xác, ...:

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

vì thế:

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

với .dataProvider ()

Đó là .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()]

ok cái này hoạt động, nhưng chỉ trong Python Editor của qgis. Khi tôi sử dụng chức năng này trong plugin của tôi, không có gì xảy ra. Hàm sẽ không hoạt động cho trường trong các trường nhưng nó dừng lại. Tôi đã cố gắng hiển thị một hộp thông báo sau đó nhưng nó không đạt được dòng mã. Có lẽ tôi quên nhập một cái gì đó? Tôi đã nhập qgis.core, qgis.gui và qgis.utils.
Martin

bạn phải sử dụng .dataprovider (), xem thêm trong phần trả lời của tôi
gen

Cảm ơn bạn. Nó đang làm việc. Vấn đề là tôi đã cố gắng lấy id lớp từ lớp hoạt động getLayerID()nhưng điều này không hoạt động nữa.
Martin

2

Nó hoạt động ví dụ như thế này (kể từ phiên bản cuối cùng của QGIS dev 1.9):

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

1
Đối với tôi điều này không hoạt động. Khi tôi cố gắng lặp đi lặp lại qua các lĩnh vực, không có gì xảy ra. DataProvider trong 2.0 vẫn có thể sử dụng được chứ?
Martin

1
jup nó là Và đối với plugin của tôi, đoạn mã trên hoạt động mà không gặp vấn đề gì. cố gắng in ra loại và nội dung của các đối tượng trong khi thực thi mã. Giúp gỡ lỗi
Curlew

đã làm việc với QssMapLayerRegistry.instance (). mapLayers (). value ():
Muhammad Faizan Khan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.