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

लेकिन लंबित फ़ील्ड () मेरे लिए काम नहीं करता है। क्या अब खेतों के नाम लेने की कोई नई विधि है?

जवाबों:


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

और आप देख सकते हैं कि कोई फ़ील्ड () फ़ंक्शन है

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.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
मेरे लिए यह काम नहीं करता है। जब मैं खेतों के माध्यम से पुनरावृति करने की कोशिश करता हूं तो कुछ भी नहीं होता है। 2.0 में डेटाप्रोइडर अभी भी प्रयोग करने योग्य है?
मार्टिन

1
यह है और मेरे प्लगइन के लिए उपरोक्त कोड समस्याओं के बिना काम करता है। कोड निष्पादित करते समय ऑब्जेक्ट्स के प्रकार और सामग्री को प्रिंट करने का प्रयास करें। डिबगिंग में मदद करता है
Curlew

QgsMapLayerRegistry.instance ()। mapLayers ()। मानों () के साथ काम किया:
मुहम्मद फैजान खान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.