Pyqgis में कस्टम qgsfunction रजिस्टर करें


9

मैं एक स्टैंडअलोन एप्लिकेशन के भीतर pyqgis का उपयोग कर रहा हूं। अब मैं नियम के रूप में filterExpression के रूप में उपयोग करने के लिए एक कस्टम अभिव्यक्ति बनाना चाहता था 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) फ़ंक्शन को पंजीकृत करने के बाद काम करता है, और यदि नहीं तो विफल हो जाता है। लेकिन फिर भी, मैं एक नियम के भीतर अभिव्यक्ति का उपयोग नहीं कर सकता ...

अभी, फंक्शन वाली फाइल मेरे प्रोजेक्ट फोल्डर में सबसे ऊपर है, जो कि स्वचालित रूप से PATH में शामिल है, है ना ?! (नाथन वुड्रो के अनुसार, फ़ाइल को PATH में कहीं भी रखा जा सकता है - https://nathanw.net/2012/11/10/user-defined-expression-functions-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/QGIS को फिर से लोड करने के लिए अपनी फाइल को कॉपी करें और फंक्शन एक्सप्रेशन बिल्डर सेक्शन अजगर में उपलब्ध है
ThomasG77

आपकी सलाह के बाद, फ़ंक्शन QGIS फ़ंक्शन संपादक में दिखाई देता है और मैं इसे अपेक्षित रूप से उपयोग कर सकता हूं। लेकिन जब यह मेरे स्वसंपूर्ण अनुप्रयोग में उपयोग करने की कोशिश कर रहा है, तो फ़ंक्शन काम नहीं करता है! - मुझे लगता है, जब QGIS शुरू होता है, यह किसी भी तरह अभिव्यक्ति फ़ोल्डर में सभी फ़ाइलों को पंजीकृत करता है, लेकिन मुझे आश्चर्य है कि कैसे ?!
हेनहुई

क्या आप @qgsfunctionअपने कोड में फ़ंक्शन का उपयोग कर रहे हैं , जैसा कि आप कोड में फ़ंक्शन को परिभाषित करते हैं। आप expressionsफ़ोल्डर को अनदेखा कर सकते हैं यदि आप अपनी स्क्रिप्ट बना रहे हैं जो सिर्फ मुख्य ऐप के लिए है
नाथन डब्ल्यू

आप सही हैं - जब फ़ंक्शन का पंजीकरण ऊपर वर्णित के रूप में काम करता है (उदाहरण के लिए do_nothing)। लेकिन मेरा मूल कार्य bitwise_andअभी भी काम नहीं करता है। अब, मुझे लगता है कि यह फ़ंक्शन के रिटर्न प्रकार के साथ कुछ करना है, क्योंकि do_nothing works, लेकिन add_oneनहीं करता है!
हेनहुई

जवाबों:


8

मैंने आखिरकार समस्या हल कर ली!

यह वास्तव में एक प्रकार की समस्या थी, क्योंकि इनपुट मानों को QVariantअंदर के रूप में परिभाषित किया गया है @qgsfunction। इसलिए, मुझे अपना कोड काम पाने के लिए पहले उन्हें पूर्णांक में बदलना पड़ा। जाहिर है, QGIS प्रकार रूपांतरणों का ख्याल रखता है ...

फ़ंक्शन अब इस तरह दिखता है:

@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) 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.