পাইকিজিআইএস-এ কিউগেসফাইচার ব্যবহার করে কোনও বৈশিষ্ট্যের মান কীভাবে পরিবর্তন করবেন?


12

আমি কোনও বৈশিষ্ট্যের একটি বৈশিষ্ট্য আপডেট করতে চাই। যাইহোক, আমি বৈশিষ্ট্য অবজেক্টটি ব্যবহার করে এটি আপডেট করতে জানি না। এটি আপডেট করার জন্য আমাকে ডেটা সরবরাহকারী ব্যবহার করতে হবে।

layers = QgsMapLayerRegistry.instance().mapLayersByName('my_line') 
layer = layers[0]
dp = layer.dataProvider()
it = dp.getFeatures()

for i in range(0, dp.featureCount()):
  feat = it.next()
  attrs = { 2 : 30 }
  layer.dataProvider().changeAttributeValues({ feat.id() : attrs })

আমি কি QgsFeatureঅবজেক্ট ব্যবহার করে কোনও বৈশিষ্ট্যের মান পরিবর্তন করতে পারি ?

তদুপরি, এটিরেটর অবজেক্টটি ব্যবহার করে লুপ করা সম্ভব?


আমি কীভাবে সূচকটি ব্যবহার না করে মান পরিবর্তন করতে পারি? আমি তাদের ক্ষেত্রের নাম উল্লেখ করে মানগুলি পরিবর্তন করতে চাই। এটি অনেক বেশি আরামদায়ক হবে। আপনাকে অনেক ধন্যবাদ! শুভেচ্ছা রবার্ট
রবার্ট বি কে

my_index = layer.fieldNameIndex("my_field_name")সূচক পেতে কেবল ব্যবহার করুন ।
জার্মানি ক্যারিলো

এই ক্ষেত্রে আমি ক্ষেত্রের মধ্যে স্ট্রিং যুক্ত করতে পারি না আমি কীভাবে করতে পারি?
হামেদ ম্যাকিয়ান

আপনার যদি নতুন প্রশ্ন থাকে তবে দয়া করে প্রশ্ন জিজ্ঞাসা বোতামটি ক্লিক করে এটি জিজ্ঞাসা করুন । যদি এই প্রসঙ্গে সরবরাহ করতে সহায়তা করে তবে এই প্রশ্নের একটি লিঙ্ক অন্তর্ভুক্ত করুন। - পর্যালোচনা থেকে
ড্যান সি

হামেদ, জিআইএস স্ট্যাক এক্সচেঞ্জে আপনাকে স্বাগতম! যেহেতু এই প্রশ্নের ইতিমধ্যে উত্তর দেওয়া হয়েছে, অনুগ্রহ করে আপনার প্রশ্নটি এখানে নতুন, পৃথক প্রশ্ন হিসাবে জিজ্ঞাসা করুন gis.stackexchange.com/questions/ask
সেমি 1

উত্তর:


17

আপনার দুটি প্রশ্নের উত্তর:

  1. আপনি layerঅবজেক্ট থেকে আপনার বৈশিষ্ট্য মান পরিবর্তন করতে পারেন , অ্যাক্সেস করার প্রয়োজন নেই dataProvider()

  2. হ্যাঁ, আপনি একটি forলুপে পুনরুক্তি ব্যবহার করতে পারেন ।

নীচের কোডটি চেক করুন:

layers = QgsMapLayerRegistry.instance().mapLayersByName('my_line') 
layer = layers[0]
it = layer.getFeatures()

layer.startEditing()
for feat in it:
  layer.changeAttributeValue(feat.id(), 2, 30)

layer.commitChanges()

এটি সমস্ত স্তর বৈশিষ্ট্যের জন্য তৃতীয় (সূচক 2) ক্ষেত্রের মান 30 এ আপডেট করে।


দ্রষ্টব্য: আপনি উল্লেখ করেছেন যে, কিছু কারণে QgsFeature অবজেক্ট বৈশিষ্ট্য মানগুলি আপডেট করতে পারে না, যদিও এপিআই বলেছে এটি পারে।


5

হ্যাঁ, তবে আপনাকে ক্ষেত্রের সূচিটি জানতে হবে:

QgsFeature::setAttribute(int field,const QVariant & attr )  

আপনি ক্ষেত্রগুলি ব্যবহার করে পেতে পারেন QgsFeature::fieldsএবং তারপরে পুনরাবৃত্তি করুন যতক্ষণ না আপনি নিজের পছন্দ মতো সন্ধান করেন বা QgsFeature::attribute(const QString & name )নাম অনুসারে ক্ষেত্রের সূচি খুঁজে না পান।

কিউভেরিয়েন্টের কারণ হ'ল সেটঅ্যাট্রিবিউটটি পূর্ণসংখ্যা, ভাসা, তারিখ এবং পাঠ্য প্রকার গ্রহণ করতে পারে। QgsFeature.attribute (নাম) টাইপ int এর একটি বৈকল্পিকও প্রদান করে যদি বৈশিষ্ট্যটি পাওয়া যায় এবং অন্য কিছু খুঁজে পাওয়া যায় না তবে এটি আপনার কোডে সচেতন থাকুন। একটি চেষ্টা করুন .. ব্যতীত ব্লকটি সাজানো হবে, প্রান্তে রূপান্তর করার চেষ্টা করুন এবং প্রকারটি যদি না হয় তবে।

এটি সম্ভবত আপনার বৈশিষ্ট্যটি এই পদ্ধতিটিকে সমর্থন করে না। আমি নিযুক্ত অন্য একটি পদ্ধতি হ'ল QgsVectorLayer::changeAttributeValue:

self.canvas.currentLayer().changeAttributeValue(UpdateFeatureID,FieldToUpdate,self.CurrentWidget.text(),True)

এটি স্তরটিকে একটি নির্দিষ্ট বৈশিষ্ট্য এবং নির্দিষ্ট বৈশিষ্ট্য আপডেট করতে বলে। উদাহরণস্বরূপ মানটি একটি উইজেট থেকে আসে।


আমি চেষ্টা করেছিলাম feat.setAttribute(1, QVariant(20))কিন্তু সিস্টেমটি টাইপ-এরর
wannik

Feat.setAttribute (1, 20) আমি আগে এটি কীভাবে করেছি। এটি '20' এর মানটি 1 টি গুণকে দেওয়া হয়
মাইকেল সিসটেমন

আমি চেষ্টা করেছিলাম feat.setAttribute(1, 20)কিন্তু মান পরিবর্তন হয় না। যাইহোক, আমি করতে পারেনprint(feat.attributes()[1])
wannik

সম্পাদনাগুলি দেখুন, সম্ভবত আপনাকে QgsVectorLayer.changeAttributeValue কল করতে হবে যা পরিবর্তনের জন্য ড্রাইভার ব্যবহার করা উচিত।
মাইকেল সিলিমসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.