পাইকিজিআইএস দিয়ে ক্ষেত্র যোগ করা এবং অভিব্যক্তি গণনা করা?


10

আমি নতুন ক্ষেত্র যুক্ত করতে এবং প্রতিটি বৈশিষ্ট্যের জন্য মান গণনা করতে পাইকিজিআইএস ব্যবহার করতে চাই। ফিল্ড ক্যালকুলেটর বিকল্পের মতো।

আমার 'ফিল্ড ক্যালকুলেটর' এক্সপ্রেশন উদাহরণস্বরূপ: y(start_point($geometry))

from PyQt4.QtCore import QVariant
from qgis.core import QgsField, QgsExpression, QgsFeature
vl = iface.activeLayer()

vl.startEditing()

#step 1
myField = QgsField( 'myNewColumn', QVariant.Float )
vl.addAttribute( myField )
idx = vl.fieldNameIndex( 'myNewColumn' )

#step 2
e = QgsExpression( 'y(start_point($geometry))' )
e.prepare( vl.pendingFields() )

for f in vl.getFeatures():
    f[idx] = e.evaluate( f )
    vl.updateFeature( f )

vl.commitChanges()

এই ত্রুটিটি আমি পেয়েছি:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/var/folders/0r/q6nxg6w54fv4l7c8gksb2t500000gn/T/tmp9dosIe.py", line 30, in <module>
    f[idx] = e.evaluate( f )
KeyError: '-1'

উত্তর:


11

আপনি যে ত্রুটি পেয়েছেন তা ফিল্ড সূচক বলে -1, সুতরাং আপনার নতুন ক্ষেত্রটি আপনার বৈশিষ্ট্য সারণীতে পাওয়া যায় নি।

এটি ঘটতে পারে কারণ:

  1. QVariant.Doubleপরিবর্তে আপনার ব্যবহার করা উচিত QVariant.Float
  2. আপনার নতুন কলাম সূচক জিজ্ঞাসার আগে আপনি স্তর সরবরাহকারীর কাছে নতুন ক্ষেত্রটি প্রতিশ্রুতিবদ্ধ হন নি।
  3. আপনি সূচকের জন্য জিজ্ঞাসা করছেন myNewColumnতবে আপনার সরবরাহকারী কেবল ক্ষেত্রের নামের জন্য 10 টি অক্ষর সংরক্ষণ করতে পারবেন, তাই এটি সংরক্ষণ করা হয়েছে myNewColum(চূড়ান্ত অনুপস্থিত n)। (উত্তরটি একবার চেষ্টা করে দেখার সময় আমার সাথে ঘটেছিল)

পরিবর্তে এটি চেষ্টা করুন:

#step 1
myField = QgsField( 'newColumn', QVariant.Double )
vl.dataProvider().addAttributes([myField])
vl.updateFields()
idx = vl.fieldNameIndex( 'newColumn' )

এখন এর idxচেয়ে আলাদা হওয়া উচিত -1, আপনি এটি পরীক্ষা করতে পারেন:

if idx != -1:
    print "Field found!"

উপায় দ্বারা, আপনি #step 1সম্পাদনা ব্লক থেকে কোড চালাতে পারেন ।


1
কিছু প্রাথমিক পরীক্ষার পরে আমি মনে করি এটির ফিল্ডের নামের সীমাবদ্ধতা। অবশ্যই কিউভিআর্যান্টে 'এক্স কমর্ড' প্রেরণ.এটি খুব ভাল ধারণা নয়, যদিও কোনও ত্রুটি নেই, কেবল খারাপ প্রোগ্রামিং। ডাবল সেখানে থাকা উচিত। ধন্যবাদ
OHTO

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