পাইকগিসে কাস্টম কিউএসফংশনটি নিবন্ধন করুন


9

আমি একক প্রয়োগের মধ্যে পাইকগিস ব্যবহার করছি g এখন আমি নিয়ম অনুযায়ী ফিল্টারএক্সপ্রেশন হিসাবে ব্যবহার করতে একটি কাস্টম এক্সপ্রেশন তৈরি করতে চেয়েছিলাম ruleBasedRendererV2। (আমি বিদ্যমান ফাংশনগুলির সাথে রেন্ডারারের চেষ্টা করেছি এবং সবকিছু ঠিকঠাক কাজ করেছে!)

কাস্টম qgisfunction(বিটওয়াইস এবং ফাংশন - যেমন কোনও ফাংশন এখনও নেই) এর মতো দেখায়:

from qgis.utils import qgsfunction

@qgsfunction(args="auto", group='Python')
def bitwise_and(value1, value2, feature, parent):
    return value1 & value2

আমি এটি নিবন্ধ করার চেষ্টা করেছি, এর মাধ্যমে:

from qgis.core import QgsExpression
QgsExpression.registerFunction(bitwise_and) 

এর মাধ্যমে অভিব্যক্তিটি পরীক্ষা করা:

expressionString = 'bitwise_and(2, 2) = 2'
exp = QgsExpression(expressionString)
if exp.hasParserError():
    print(exp.parserErrorString())

( 2=2তাই সর্বদা দেওয়া True) ফাংশন নিবন্ধকরণের পরে কাজ করে এবং যদি ব্যর্থ হয় ails তবে তবুও, আমি কোনও নিয়মের মধ্যে প্রকাশটি ব্যবহার করতে পারি না ...

এই মুহুর্তে, ফাংশনযুক্ত ফাইলটি আমার প্রকল্প ফোল্ডারে উপরে রয়েছে যা স্বয়ংক্রিয়ভাবে PATH এর সাথে অন্তর্ভুক্ত রয়েছে, তাই না ?! (নাথন উড্রোর মতে, ফাইলটি PATH- এ যে কোনও জায়গায় স্থাপন করা যেতে পারে - https://nathanw.net/2012/11/10/user-defined-expression-funitions-for-qgis/ দেখুন )।

আপডেট: ফাংশনটির নিবন্ধকরণ এখন পর্যন্ত কাজ করে উপরের কোড সহ - এখন সমস্যাটি নিজেই ফাংশনটিতে রয়েছে ...

আপডেট # 2:

খুব অদ্ভুত! do_nothingদুটি আর্গুমেন্ট পাওয়া সহজ ফাংশনটি আমার কোডে ভাল কাজ করে:

@qgsfunction(args="auto", group='Python')
def do_nothing(value1, value2, feature, parent):
    return value1

এক্সপ্রেশন ব্যবহার করে expString = 'do_nothing(2, 2) = 2'

আপডেট # 3:

সরল পরিবর্তন do_nothingকরতে add_oneআর কাজ করে না:

@qgsfunction(args="auto", group='Python')
def add_one(value1, value2, feature, parent):
    return value1 + 1

এটি মাধ্যমে কল expString = 'add_one(2, 2) = 3'। সে কারণেই আমি মনে করি এটির রিটার্নিং টাইপের সাথে কিছু করার আছে ?!


1
আপনার ফাইলটি অনুলিপি করুন ~/.qgis2/python/expressions/কিউজিআইএস পুনরায় লোড করুন এবং ফাংশনটি এক্সপ্রেশন বিল্ডার বিভাগে পাওয়া যায় পাইথন
টমাস জি 77

আপনার পরামর্শ অনুসরণ করে, QGIS ফাংশন সম্পাদকটিতে ফাংশন উপস্থিত হয় এবং আমি এটি প্রত্যাশা মতো ব্যবহার করতে পারি। তবে এটি আমার স্বতন্ত্র অ্যাপ্লিকেশনটিতে ব্যবহার করার চেষ্টা করার সময়, ফাংশনটি কার্যকর হয় না! - আমি মনে করি, কিউজিআইএস শুরু হওয়ার সাথে সাথে এটি কোনওভাবে এক্সপ্রেশন ফোল্ডারে সমস্ত ফাইল নিবন্ধিত করে, তবে আমি কী আশ্চর্য?
হেনহুয়

আপনি ব্যবহার করছেন @qgsfunctionআপনার কোডে ফাংশন, হিসাবে আপনি কোড ফাংশন নির্ধারণ করুন। আপনি expressionsযদি নিজের স্ক্রিপ্টটি কেবল মূল অ্যাপ্লিকেশনটির জন্য তৈরি করে থাকেন তবে আপনি ফোল্ডারটি এড়িয়ে যেতে পারেন
নাথান ডাব্লু

আপনি ঠিক বলেছেন - ফাংশনটির নিবন্ধকরণ যখন উপরে বর্ণিত হিসাবে কাজ করে (উদাহরণস্বরূপ do_nothing)। তবে আমার মূল ফাংশনটি bitwise_andএখনও কাজ করে না। এখন, আমি মনে করি এটির ফাংশনটির রিটার্ন টাইপের সাথে কিছু করার আছে do_nothing works, তবে add_oneনেই!
হেনহুই

উত্তর:


8

শেষ পর্যন্ত সমস্যার সমাধান!

এটি প্রকৃতপক্ষে একটি টাইপ-সমস্যা ছিল, কারণ ইনপুট মানগুলি QVariantঅভ্যন্তরের হিসাবে সংজ্ঞায়িত করা হয় @qgsfunction। সুতরাং, আমার কোডের কাজ পেতে আমাকে প্রথমে তাদের পূর্ণসংখ্যায় রূপান্তর করতে হয়েছিল। স্পষ্টতই, কিউজিআইএস নিজেই ধরণের রূপান্তরগুলির যত্ন নেয় ...

ফাংশনটি এখন এর মতো দেখাচ্ছে:

@qgsfunction(args="auto", group='Python')
def bitwise_and(value1, value2, feature, parent):
    return value1.toInt()[0] & value2.toInt()[0]

এবং যদি আপনার প্রকল্প ফোল্ডারে ফাংশনটি রাখে তবে প্রথমে এটি নিবন্ধন করতে ভুলবেন না:

from qgis.core import QgsExpression
QgsExpression.registerFunction(bitwise_and) 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.