मान फ़ील्ड द्वारा कई पंक्तियों को मर्ज करना

Dec 09 2020

मैं कैसे ट्रिगर फ़ील्ड के आधार पर इन पंक्तियों में शामिल हो सकता हूं। हालत इस प्रकार है, फ़ील्ड को फ़िड फ़ील्ड से 1करने के बाद आरोही क्रम में आदेशित किया जाना चाहिए 68। इस प्रकार, मैं पहले 1 के साथ शुरू होने वाली मेरी सभी पंक्तियों में शामिल होना चाहता हूं जिसमें 1 ट्रिगर है और अगले वाले जिनके पास मूल्य है 0और पहले मूल्य के साथ बंद हो जाते हैं 1और फिर से शुरू होते हैं।

संपादित करें: मुझे समझ में आया। लेकिन मैं इस समस्या को कैसे हल कर सकता हूं? इन रेखाओं से कैसे जुड़ें? ट्रिगर कोण को संदर्भित करता है। यदि यह 0 है, तो 2 खंडों के बीच का कोण x डिग्री से कम है, और यदि यह 1 है तो कोण x डिग्री से अधिक है। इसलिए, मैं चाहता हूं कि यदि पहली पंक्ति एक ट्रिगर नहीं है, तो मैं इसे पहली पंक्ति के साथ जोड़ना चाहता हूं जो ट्रिगर है।

जवाब

3 MrXsquared Dec 09 2020 at 19:48

आपको यह अंदाजा लगाने के लिए कि यह कैसे किया जा सकता है, यहां एक नया समूह समूह जोड़ने के लिए पायथन में एक समाधान है, आप अपनी पंक्तियों को भंग करने के लिए उपयोग कर सकते हैं:

# Change your settings here:
layername = 'line' 
triggerfield = 'Trigger' # field must already exist
groupfieldname = 'mygroup' # will be added if does not exist
newlineindicator = 1

#####
# no changes needed below #
#####
layer = QgsProject.instance().mapLayersByName(layername)[0] # get the layer
layer.startEditing() # start editing the layer
layer.dataProvider().addAttributes([QgsField(groupfieldname,QVariant.Int)]) # add a group field
layer.commitChanges() # save new added field to prevent crash when searching for it later
layer.startEditing() # start editing the layer again
groupid = 0 # initialize groupid
fieldindex = layer.fields().indexFromName(groupfieldname) # get fieldindex of groupfield

for feat in layer.getFeatures(): # itereate over layer
    if feat[triggerfield] == newlineindicator: # if a new trigger appears, increase groupcounter
        groupid += 1
    attrs = { fieldindex : groupid } # prepare attributes
    layer.dataProvider().changeAttributeValues({ feat.id() : attrs }) # assign current groupid to current feature
layer.commitChanges() # save changes

परिणाम:

3 Babel Dec 09 2020 at 21:08

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

आपके डेटा संरचना और क्षेत्र के नाम लेते हुए, अभिव्यक्ति इस तरह दिखती है (अभिव्यक्ति के लिए नीचे देखें कि अभिव्यक्ति कैसे काम करती है):

array_last (
    array_sort (
        array_foreach (
            array_remove_all ( 
                array_agg ( 
                    if ( 
                        "trigger" = 1, 
                        "fid" , 
                        0
                    ) 
                ) ,
            0) ,
        if (
            if ( 
                "trigger" = 1, 
                "fid" , 
                0 
                ) = @element, 
                @element, 
                if (
                    "fid" > @element ,  
                    @element,0
                )
        )
        ) 
    )
)

Menu Processing / Toolbox / Aggregateइन सुविधाओं को संयुक्त करने के लिए फ़ंक्शन के साथ आप इस फ़ील्ड का उपयोग कर सकते हैं।

अभिव्यक्ति के पीछे के विचार की व्याख्या करने के लिए: बेहतर समझ के लिए, आइए आप सम्मिलित लाइन के "शुरुआती-सेगमेंट" को कॉल करें जिसे आप अंत में " हेड " प्राप्त करना चाहते हैं - और बाद के सेगमेंट जो इसे " पूंछ " में शामिल हो गए हैं ।

  1. सिर के फ़िड-वैल्यू प्राप्त करें , चलो इसे " समूह-आईडी " कहते हैं। अंतिम लक्ष्य प्रत्येक पूंछ को एक सिर को सौंपना है (या: प्रत्येक पूंछ को अगले छोटे सिर के समूह-आईडी मूल्य को सौंपा जाना चाहिए: 2 और 3 को 1, 5 और 6 से 4 आदि को सौंपा जाना चाहिए) a) यदि ट्रिगर 1 ( सिर ) है, तो आईडी का मान प्राप्त करें: यह समूह-आईडी है । Else ( पूंछ के लिए ) 0. मान का मान सेट करें) एक एरे बनाते हुए इन मानों को अलग करें। ग) सरणी से सभी 0 मान निकालें। इस प्रकार हमें समूह-आईडी (= प्रमुखों का समूह ) प्राप्त होता है: [1,4,7,9,12]। हम अंत में सरणी से इनमें से किसी एक मान को प्रत्येक सुविधा प्रदान करना चाहते हैं।

  2. अब अभिव्यक्ति के साथ सरणी से इन समूह-आईडी में से प्रत्येक के साथ परत की सभी विशेषताओं पर पुनरावृति array_foreach: ए) ट्रिगर = 1 ( प्रमुख ) के साथ सुविधाओं के लिए हमें कोई समस्या नहीं है, ये पहले से ही सही समूह-आईडी (इसी के अनुसार) हैं उनके fid) b) अन्य मामलों में ( पूंछ , ट्रिगर = 0), हमें नए मान निर्दिष्ट करने चाहिए। इस प्रकार हम प्रत्येक इनपुट वैल्यू की फिड से सरणी (सभी ग्रुप-आईडी की सूची) की तुलना करते हैं और यदि यह एफआईडी से छोटा है (तो हम अगले छोटे मूल्य पर असाइन करना चाहते हैं) ग्रुप-आईडी रखते हैं। अन्यथा हम इसे 0. पर सेट करते हैं, इसलिए किसी भी स्थिति में उस सरणी से एक मूल्य नहीं होगा जो फिड से बड़ा है।

  3. यह सुनिश्चित करने के लिए कि हमारे पास सही क्रम में मान हैं (सबसे छोटी से बड़ी) - अंतिम क्रम से अंतिम शून्य को हटाने के लिए सरणी को क्रमबद्ध करें (नीचे स्क्रीनशॉट देखें)। सॉर्ट ऑर्डर सेट किए बिना, हमें डिफ़ॉल्ट मान मिलता है ascending=true

  4. सॉर्ट किए गए सरणी से अंतिम मान प्राप्त करें, इस प्रकार अंतिम (सबसे बड़ा) समूह-आईडी जो (चरण 2 बी को याद रखें) फिड से बड़ा नहीं है और (केस ट्रिगर = 1 में) फिड (चरण 2 ए) के बराबर है और हमेशा 1 से हमारे द्वारा बनाई गई सरणी से एक संख्या है।

चरण 1 और 2 के मध्यवर्ती परिणामों के लिए स्क्रीनशॉट देखें:

अब ऊपर वर्णित फ़ील्ड के साथ कुल फ़ंक्शन का उपयोग करना आसान है।