QGIS मॉडलर अगर / और कोई शर्त है, तो मॉडलर के लिए कस्टम स्क्रिप्ट


10

मैं अपने मॉडल के अंदर एक सरल / अन्य कार्य करना चाहता हूं और मैं जानना चाहता हूं कि यह संभव है या नहीं।

यहां छवि विवरण दर्ज करें

मैं यह बात चाहता हूं कि यदि 'सेगमेंट लेयर' के लिए एक इनपुट चुना जाता है, तो उसे 'सेगमेंटेशन (माध्योपचार)' पर अमल नहीं करना है और अगली प्रक्रिया के लिए इनपुट के बजाय 'सेगमेंट लेयर' का उपयोग करना है।

'सेगमेंटेशन (माध्य)' के लिए इनपुट निम्नानुसार हैं

यहां छवि विवरण दर्ज करें

यूसुफ के उत्तर को लागू करने की कोशिश करने के बाद अपडेट करें: मैंने निम्नलिखित कोड का उपयोग किया और यह त्रुटि मिली यहां छवि विवरण दर्ज करें

अद्यतन 2, मापदंडों को बदलने के बाद मुझे लाइन 28 में एक त्रुटि मिलती है यह 'और:' खड़ा है

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    -BGREN\
    -0\
    -70\
    -70\
    -0.1\
    -100\
    -100\
    -0\
    -0\
    -0\
    -'True'\
    -'False'\
    -1\
    -0.1\
    -'Layer'\
    -'DN'\
    -1024\
    -1\
    -0\
    -output)
else:
    output=Segment_Layer

यहां छवि विवरण दर्ज करें

अपडेट करें यह काम करता है :) कुछ प्रयासों के बाद और जोसेफ के साथ यह कोड अब एक आकर्षण की तरह काम करता है, अंतिम चाल थी दो वैकल्पिक मूल्यों को 'कोई नहीं' के साथ बदलना।

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    BGREN, \
    0, \
    70, \
    70, \
    0.1, \
    100, \
    100, \
    0, \
    0, \
    None, \
    True, \
    False, \
    1, \
    0.1, \
    'Layer', \
    'DN', \
    1024, \
    1, \
    None, \
    output)
else:
    output=Segment_Layer

3
मुझे लगता है कि आप एक का उपयोग करने की आवश्यकता होगी कस्टम स्क्रिप्ट अपने नमूना बनानेवाला के अंदर उपयोग करने के क्रम में अगर / किसी और बयानों को सही ढंग से।
जोसेफ

1
@ जोसेफ ने भी यही सोचा, समस्या यह है कि मैं स्क्रिप्टिंग में उतना अच्छा नहीं हूं जितना मैं बनना चाहता हूं, मैं बहुत ज्यादा एक्सपायरी नहीं हूं ...
एंड्रियास

1
@ और मैं पुष्टि करता हूं कि जोसेफ ने अपनी टिप्पणी में क्या लिखा है। हालाँकि, मुझे लगता है कि अगर आप अपने प्रश्न को संपादित करते हैं और अजगर के साथ कुछ संकेत प्राप्त करने की संभावना देते हैं, तो आपको समुदाय से अधिक मदद मिल सकती है (उचित टैग भी जोड़ते हुए) ...
mgri

1
@Andreas - मेरी पोस्ट को संपादित किया। इसके अलावा, आपको उनकी समस्या हल करने के बाद जवाब स्वीकार करना चाहिए ;)
जोसेफ

1
@ जोसेफ मैंने अपना पोस्ट अब काम कर रहे कोड के साथ संपादित किया, आपकी मदद की बहुत आवश्यकता थी और मुझे वास्तव में खुशी है कि आपने मुझे अपना कुछ कीमती समय इस के साथ देने में लिया :) जैसा कि अभी यह एल्गोरिथम निष्पादित कर रहा है और मुझे इंतजार करना होगा परिणामों के लिए, लेकिन यह वास्तव में आशाजनक लग रहा है, धन्यवाद फिर से :)
एंड्रियास

जवाबों:


8

जैसा कि मेरी टिप्पणी में उल्लेख किया गया है, एक कस्टम स्क्रिप्ट इस स्थिति में जाने का तरीका हो सकता है। आप इनमें से एक बना सकते हैं:

Processing Toolbox > Scripts > Tools > Create new script

निम्न स्क्रिप्ट इनपुट मापदंडों को वैकल्पिक के साथ-साथ एक if / else कथन के आधार पर सेट करता है, जिसके आधार पर पैरामीटर में एक परत होती है। तो अगर एक परत के लिए चुना गया था BGREN, यह विभाजन उपकरण प्रदर्शन करेगा और आउटपुट सेट करेगा; अन्यथा आउटपुट से चयनित परत होगी Segment_Layer

यहाँ एक संभावित स्क्रिप्ट है:

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    -BGREN, \
    -filter, \
    -filter.meanshift.spatialr, \
    -filter.meanshift.ranger, \
    -filter.meanshift.thres, \
    -filter.meanshift.maxiter, \
    -filter.meanshift.minsize, \
    -mode, \
    -mode.vector.outmode, \
    -mode.vector.inmask, \
    -mode.vector.neighbor, \
    -mode.vector.stitch, \
    -mode.vector.minsize, \
    -mode.vector.simplify, \
    -mode.vector.layername, \
    -mode.vector.fieldname, \
    -mode.vector.tilesize, \
    -mode.vector.startlabel, \
    -mode.vector.ogroptions, \
    -output)
else:
    output=Segment_Layer

otb:segmentationmeanshiftदेखो डरावना के लिए मापदंडों ! दुर्भाग्य से, मेरे पास Orfeo स्थापित नहीं है इसलिए इस टूल का परीक्षण नहीं कर सकता। हालांकि, पैरामीटर यहां दिखाए गए हैं , आपको बस GUI का उपयोग करने के बजाय उन्हें टाइप करने की आवश्यकता है। इसके बाद, अपने नमूना बनानेवाला का उपयोग करते हुए स्क्रिप्ट जोड़ने BGRENऔर Segment_Layerइनपुट परतों के रूप में:

स्क्रिप्ट पैरामीटर

इसके अलावा, आपके मॉडलर में, आपको आवश्यक पैरामीटर की परिभाषा को बदलने की आवश्यकता हो सकती है BGRENऔर Segment_Layer:

पैरामीटर परिभाषा

फिर स्क्रिप्ट के आउटपुट को अपने NDVI टूल से कनेक्ट करें।


मैंने अन्य उपकरणों के उपयोग से कुछ हद तक इसका परीक्षण किया, जिसके आधार पर इनपुट परत का चयन किया गया था, इसलिए उम्मीद है कि यह आपके मॉडलर के लिए काम करेगा!



संपादित करें:

यहाँ वह कोड है जिसे आपने थोड़ा संशोधित किया है (आपको मापदंडों को अलग करने के लिए अल्पविराम की आवश्यकता है, Trueऔर Falseकथनों को उनके आसपास उद्धरणों की आवश्यकता नहीं है, पिछड़े स्लैश सिर्फ पठनीयता के लिए है, लेकिन इसे एक-लाइनर के रूप में शामिल करेंगे):

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift', \
    BGREN, \
    0, \
    70, \
    70, \
    0.1, \
    100, \
    100, \
    0, \
    0, \
    0, \
    True, \
    False, \
    1, \
    0.1, \
    'Layer', \
    'DN', \
    1024, \
    1, \
    0, \
    output)
else:
    output=Segment_Layer

या वन-लाइनर के रूप में:

##Example=name
##BGREN=optional raster
##Segment_Layer=optional vector
##output=output vector

if BGREN is not None:
    processing.runalg('otb:segmentationmeanshift',BGREN,0,70,70,0.1,100,100,0,0,0,True,False,1,0.1,'Layer','DN',1024,1,0,output)
else:
    output=Segment_Layer

1
मैं अपने प्रश्न को संपादित करने के लिए @Andreas को प्रोत्साहित करने के लिए एक टिप्पणी जोड़ रहा था और अधिक मदद प्राप्त करने के लिए अजगर के साथ कुछ संकेत प्राप्त करने की संभावना दे रहा था, लेकिन आप तेज थे!
mgri

1
@ मैग्री - मैं आपको उस टिप्पणी को पोस्ट करने के लिए प्रोत्साहित करूंगा क्योंकि ओपी कुछ विवरणों को संपादित करना चाह सकता है और दूसरों को संभावित समाधान पोस्ट करने के लिए प्रोत्साहित कर सकता है :)
जोसेफ

1
@ जोसेफ लानत है कि जितना मैंने सोचा था कि यह बहुत अधिक होगा: ओ वैसे भी मैं इसे फिर से बनाने की कोशिश करूंगा और एक प्रतिक्रिया छोड़ दूंगा अगर मुझे काम करने के लिए मिला, अग्रिम धन्यवाद :)
एंड्रियास

1
बहुत बहुत स्वागत! मैंने संभवतः इसे उखाड़ फेंका, इसलिए यह आपके प्रश्न को संपादित करने के लिए एक अच्छा विचार हो सकता है क्योंकि @mgri ने सुझाव दिया ताकि एक अधिक उपयुक्त अजगर समाधान या इस तरह पोस्ट किया जा सके =)
जोसेफ

1
@Andreas - बिल्कुल भी बेवकूफ नहीं, हर किसी को शुरू से सीखना है =)
जोसेफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.