如何在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()对我不起作用。现在是否有一种获取字段名称的新方法?

Answers:


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

好的,这有效,但仅在qgis的Python编辑器中有效。当我在插件中使用此功能时,没有任何反应。该功能将持续到字段中的字段,但在此停止。之后,我尝试显示一个消息框,但未到达代码行。也许我忘了进口什么?我导入了qgis.core,qgis.gui和qgis.utils。
马丁

您必须使用.dataprovider(),请参阅我的回复中的其他内容
基因

谢谢。这是工作。问题是我尝试从活动层获取层ID,getLayerID()但这不再起作用。
马丁

2

例如,它的工作方式如下(自上一个QGIS dev 1.9起):

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

1
对我来说这是行不通的。当我尝试遍历字段时,没有任何反应。2.0中的dataProvider仍然可用吗?
马丁

1
贾普是。对于我的插件,上面的代码可以正常工作。尝试在执行代码时打印出对象的类型和内容。帮助调试
Curlew

与QgsMapLayerRegistry.instance()。mapLayers()。values()合作:
Muhammad Faizan Khan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.