QGIS ग्राफिकल मॉडलर में दोहराव कार्यों को सरल बनाएं


13

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

क्या ऐसे पुनरावृत्तियाँ हैं जिनका उपयोग ऊपर दिखाए गए मॉडल को सरल बनाने के लिए QGIS चित्रमय मॉडलर में किया जा सकता है। यदि नहीं, तो क्या मॉडल को सरल बनाने का कोई बेहतर तरीका है?

पहला कॉलम मेरी इनपुट परतों का प्रतिनिधित्व करता है, दूसरा कॉलम चौराहा है, तीसरा कॉलम "चौराहे" ऑपरेशन से आउटपुट है, चौथा कॉलम "लोकेशन से जुड़ने की विशेषता" ऑपरेशन का है और पांचवां कॉलम जॉइन ऑपरेशन का परिणाम है।

मैं एक वाटरशेड विश्लेषण के लिए "चौराहे" और "स्थान से विशेषता जुड़ना" ऑपरेशन करना चाहूंगा। उद्देश्य अलग-अलग आदेशों, धारा अनुपात और द्विभाजन अनुपात की धाराओं की कुल और औसत लंबाई जैसे रैखिक मॉर्फोमेट्रिक मापदंडों की गणना है।

पहला कदम वाटरशेड के साथ "ऑर्डर 1 स्ट्रीम" को इंटरसेक्ट करना है, और फिर उसी वॉटरशेड के साथ "ऑर्डर 2 स्ट्रीम" को इंटरसेक्ट करना है। यदि कोई "ऑर्डर 3 स्ट्रीम" आकृति प्रदान की गई है, तो इस नई परत के लिए चौराहे का प्रदर्शन किया जाना चाहिए। इसलिए केवल "ऑर्डर 1 स्ट्रीम" और "ऑर्डर 2 स्ट्रीम" अनिवार्य हैं, बाकी प्रदान किए गए वाटरशेड परत पर निर्भर करते हैं। उदाहरण के लिए यदि वाटरशेड एक ऑर्डर 4 वाटरशेड है तो आवश्यक धाराएं "ऑर्डर 4 स्ट्रीम" तक हैं।

एक बार जब सभी उपलब्ध इनपुट परतों के लिए चौराहे को पूरा किया जाता है, तो वे अंतरित हो जाते हैं और अंतरित धाराओं के योग और अर्थ प्राप्त करने के लिए विकल्पों के साथ वाटरशेड में शामिल हो जाते हैं।

छवि सही प्रक्रिया दिखाती है। यदि मैं मॉडलर के बाहर ऑपरेशन करता हूं तो परिणाम सही हैं। जब मैं मॉडल चलाता हूं तो मुझे यह त्रुटि मिलती है।

"एल्गोरिथ्म को क्रियान्वित करने में त्रुटि आर्डर 5_plus_wed 'कोई नहीं टाइप' ऑब्जेक्ट में कोई विशेषता नहीं है 'dataProvider'"।

यह तब होता है जब मैंने वैकल्पिक मापदंडों में से एक के लिए इनपुट नहीं दिया है (यानी इनपुट जैसे "ऑर्डर 4 स्ट्रीम") हालांकि अगर मैं सभी इनपुट प्रदान करता हूं तो मुझे वे परिणाम मिलते हैं जिनकी मुझे आवश्यकता है।

इसलिए, मैं पूछना चाहता हूं कि क्या इस कार्य को स्थापित करने का कोई बेहतर तरीका है।

जवाबों:


12

जिस तरह से मैं आपके काम को स्थापित करूंगा वह एक कस्टम स्क्रिप्ट तैयार करना होगा जो मॉडलर की तुलना में अधिक लचीलापन प्रदान करता है लेकिन फिर भी अपने उपयोगकर्ताओं को एक समान इंटरफ़ेस प्रदान कर सकता है। आप इनमें से एक बना सकते हैं:

टूलबॉक्स प्रसंस्करण> लिपियों> उपकरण> नई स्क्रिप्ट बनाएँ

फिर नीचे स्क्रिप्ट को कॉपी / पेस्ट करें और इसे सहेजें C:/Users/You/.qgis2/processing/scripts

नीचे दी गई स्क्रिप्ट आपके मॉडल का अनुकरण करने की कोशिश करती है। स्क्रिप्ट एक अंतिम समाधान नहीं है (विशेषकर जब से मैं इनटर्मेशन के लिए इस्तेमाल किया गया था और लोकेशन टूल्स द्वारा जुड़ने की विशेषता जो आपने परिभाषित किया है, उससे भिन्न हो सकती है) लेकिन उम्मीद है कि आप अपनी ज़रूरतों के अनुरूप स्क्रिप्ट के विस्तार और सुधार के लिए इसका उपयोग कर सकते हैं। । इसे चलाने के लिए, बस इसे सहेजने के बाद इसे प्रोसेसिंग टूलबॉक्स से चुनें ।

मुझे लगता है कि स्क्रिप्ट वही करती है जो आपने पूछा था:

  • पहले दो आदेश अनिवार्य हैं इसलिए कार्रवाई की जाएगी।

  • IF बयानों का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि कोई भी सफल आदेश केवल तभी संसाधित होगा जब सही एक इसे पहले कर देता है (जैसे ऑर्डर 4 केवल तभी चलेगा जब ऑर्डर 3 का चयन किया गया हो)।

  • इसके अलावा, संदेश पायथन कंसोल में छपे हैं, जिसमें दिखाया गया है कि कौन से आदेश संसाधित किए जा रहे हैं।


##Example model=name
##Order1=vector
##Order2=vector
##Order3=optional vector
##Order4=optional vector
##Order5=optional vector
##Watershed=vector
##Order2_Wshed=output vector
##Order3_Wshed=output vector
##Order4_Wshed=output vector
##Order5_Wshed=output vector

order1 = processing.getObject(Order1)
order2 = processing.getObject(Order2)
order3 = processing.getObject(Order3)
order4 = processing.getObject(Order4)
order5 = processing.getObject(Order5)
watershed = processing.getObject(Watershed)

if Order3 is None:
    print 'Processing Order1 and Order2'
else:
    print 'Processing Order1, Order2 and Order3'
    if Order4 is not None:
        print 'Processing Order1, Order2, Order3 and Order4'
        if Order5 is not None:
            print 'Processing Order1, Order2, Order3, Order4 and Order5'

output_1a = processing.runalg("qgis:intersection", order1, watershed, None)
output_1b = processing.runalg("qgis:joinattributesbylocation", output_1a['OUTPUT'], watershed, u'intersects', 0, 0, '', 0, None)
output_2a = processing.runalg("qgis:intersection", order2, watershed, None)
output_2b = processing.runalg("qgis:joinattributesbylocation", output_2a['OUTPUT'], output_1b['OUTPUT'], u'intersects', 0, 0, '', 0, Order2_Wshed)

if Order3 is None:
    pass
else:
    output_3a = processing.runalg("qgis:intersection", order3, watershed, None)
    output_3b = processing.runalg("qgis:joinattributesbylocation", output_3a['OUTPUT'], output_2b['OUTPUT'], u'intersects', 0, 0, '', 0, Order3_Wshed)
    if Order4 is None:
        pass
    else:
        output_4a = processing.runalg("qgis:intersection", order4, watershed, None)
        output_4b = processing.runalg("qgis:joinattributesbylocation", output_4a['OUTPUT'], output_3b['OUTPUT'], u'intersects', 0, 0, '', 0, Order4_Wshed)
        if Order5 is None:
            pass
        else:
            output_5a = processing.runalg("qgis:intersection", order5, watershed, None)
            output_5b = processing.runalg("qgis:joinattributesbylocation", output_5a['OUTPUT'], output_4b['OUTPUT'], u'intersects', 0, 1, 'sum, mean', 0, Order5_Wshed)

नीचे स्क्रिप्ट को चलाते समय इंटरफ़ेस का एक स्क्रीनशॉट है (जो आपके मॉडल को चलाते समय समान दिखना चाहिए):

रनिंग स्क्रिप्ट

ध्यान देने योग्य कुछ बातें:

  • लाल बॉक्स में अनिवार्य पैरामीटर होते हैं

  • ग्रीन बॉक्स में वैकल्पिक पैरामीटर होते हैं

  • ब्लू बॉक्स में अनिवार्य पैरामीटर होता है

  • ब्लैक बॉक्स में आउटपुट परिणामों के लिए वैकल्पिक पैरामीटर होते हैं। स्क्रिप्ट तभी आउटपुट लेयर्स देगी जब संबंधित ऑर्डर का चयन किया जाता है (जैसे कि ऑर्डर 5 के लिए इनपुट का चयन नहीं किया गया है, लेकिन इसके लिए आउटपुट है, एक त्रुटि होगी)। इसलिए, उपयोगकर्ता को इनपुट और संबंधित आउटपुट का चयन करना होगा। यह जानबूझकर नहीं था, लेकिन व्यक्तिगत रूप से मुझे लगता है कि यह उपयोगकर्ता को मापदंडों को ध्यान से जांचने के लिए मजबूर करने का एक अच्छा तरीका है।


मैंने QGIS 2.12.3 ( प्रसंस्करण प्लगइन संस्करण 2.12.2 के साथ ) का उपयोग किया।


2
हाल ही में क्यूजीआईएस पॉडकास्ट पर उनके पास प्रसंस्करण के निर्माता थे, और उन्होंने कहा कि जिस तरह से इसे बनाया गया था, उसके कारण आप सीधे मॉडल बिल्डर में अब एक इटरेटर नहीं जोड़ सकते। इसे जोड़ने के लिए एक व्यापक पुनर्लेखन की आवश्यकता होगी। तो एक कस्टम स्क्रिप्ट निश्चित रूप से अभी के लिए इसे करने का तरीका है।
हिक्कीवेसंतो

@Vesanto - यह बहुत दिलचस्प है, इसके लिए धन्यवाद। क्या आपके पास इस विशेष पॉडकास्ट का लिंक है?
जोसेफ


1
@ डेनिसटीजी - माफी दोस्त, मुझे अपनी पोस्ट में उल्लेख करना चाहिए था कि मैंने क्यूजीआईएस २.१२.३ ( प्रसंस्करण प्लगइन संस्करण २.१२.२ के साथ ) का उपयोग किया है।
यूसुफ

1
@ जोसेफ, यह मेरे लिए काम करता है। काफी व्यावहारिक, मैं मदद की सराहना करते हैं।
डेनिसटीजी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.