วิธีรับชื่อฟิลด์ใน 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 () หรือโมดูลดูเพื่อตรวจสอบสิ่งที่อยู่ภายใน:

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 Editor ของ qgis เมื่อฉันใช้ฟังก์ชั่นนี้ในปลั๊กอินของฉันไม่มีอะไรเกิดขึ้น ฟังก์ชั่นจะไม่ทำงานจนกว่าจะถึงเขตข้อมูลในเขตข้อมูล แต่จะมีการหยุด ฉันพยายามที่จะแสดงกล่องข้อความหลังจากนั้น แต่มันไม่ถึง codeline บางทีฉันอาจลืมนำเข้าบางสิ่ง? ฉันมีการนำเข้า qgis.core, qgis.gui และ qgis.utils
Martin

คุณต้องใช้. dataprovider () ดูเพิ่มเติมในคำตอบของฉัน
ยีน

ขอขอบคุณ. มันใช้งานได้ ปัญหาคือว่าฉันพยายามที่จะได้รับเลเยอร์ id จากชั้นที่ใช้งานด้วยgetLayerID()แต่มันไม่ทำงานอีกต่อไป
Martin

2

มันทำงานได้เช่นนี้ (ตั้งแต่ QGIS dev 1.9) ล่าสุด:

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

1
สำหรับฉันมันไม่ทำงาน เมื่อฉันพยายามที่จะทำซ้ำผ่านสาขาไม่มีอะไรเกิดขึ้น dataProvider ใน 2.0 ยังคงใช้งานได้อยู่หรือไม่?
Martin

1
มันเป็น และสำหรับปลั๊กอินของฉันรหัสด้านบนทำงานได้โดยไม่มีปัญหา พยายามพิมพ์ประเภทและเนื้อหาของวัตถุในขณะดำเนินการรหัส ช่วยแก้จุดบกพร่อง
Curlew

ทำงานร่วมกับ QgsMapLayerRegistry.instance (). mapLayers (). values ​​():
Muhammad Faizan Khan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.