পাইকগিস ২.০ এ ফিল্ডের নাম কীভাবে পাবেন


13

আমি কিউজিআইএস 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
....

.ডাটাপ্রোভিডার () সহ

এটি .ফিল্ড ()

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

ঠিক আছে এটি কাজ করে তবে কেবল কিউজিসের পাইথন সম্পাদকে। আমি যখন আমার প্লাগিনে এই ফাংশনটি ব্যবহার করি তখন কিছুই হয় না। ক্ষেত্রগুলিতে মাঠের জন্য ফাংশনটি নিখরচায় চলছে তবে সেখানে এটি বন্ধ হয়ে যায়। আমি পরে একটি বার্তা বাক্স দেখানোর চেষ্টা করেছি তবে এটি কোডলাইনটিতে পৌঁছায় না। আমি কি কিছু আমদানি করতে ভুলে গেছি? আমি কিগিস.কম, কিগিস.গুই এবং কিগিস.ইউটিস আমদানি করেছি।
মার্টিন

আপনাকে অবশ্যই .ডাটাপ্রোভিডার () ব্যবহার করতে হবে, আমার জবাবে আরও দেখুন
জেন

ধন্যবাদ. এটা কাজ করছে। সমস্যাটি ছিল আমি লেয়ার আইডিটি সক্রিয় স্তর থেকে পাওয়ার চেষ্টা করেছি getLayerID()তবে এটি আর কাজ করছে না।
মার্টিন

2

এটি উদাহরণস্বরূপ এটির জন্য কাজ করে (শেষ কিউজিআইএস ডেভেল ১.৯ থেকে):

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

1
আমার জন্য এটি কাজ করে না। যখন আমি ক্ষেত্রগুলি দিয়ে পুনরাবৃত্তি করার চেষ্টা করি তখন কিছুই ঘটে না। ২.০-তে থাকা ডেটাপ্রাইডারটি কি এখনও ব্যবহারযোগ্য?
মার্টিন

1
জুপ এটা এবং আমার প্লাগিনের জন্য উপরের কোডটি সমস্যা ছাড়াই কাজ করে। কোডটি সম্পাদন করার সময় অবজেক্টের ধরণ এবং বিষয়বস্তু মুদ্রণের চেষ্টা করুন। ডিবাগ করতে সহায়তা করে
কার্লিউ

QgsMapLayerRegistry.instance ()। mapLayers ()। মানসমূহ () এর সাথে কাজ করেছেন:
মুহাম্মদ ফয়জান খান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.