क्यूजीआईएस में एक अभिव्यक्ति का उपयोग करके विशिष्ट टेक्स्ट स्ट्रिंग वाली सुविधाओं का चयन कैसे करें


16

मुझे एक सर्वेक्षण पार्सल बहुभुज आकार की शैली की आवश्यकता है, जो इस बात पर आधारित है कि बहुभुज एक खनिज दावा है या नहीं। दुर्भाग्यवश, बहुभुज एक खनिज दावा है या नहीं इसकी एकमात्र जानकारी विशेषता तालिका के "TITLE" क्षेत्र में निहित है, जो सर्वेक्षण किए गए पार्सल का पूरा कानूनी नाम देता है। उदाहरण के लिए, 'DISTRICT LOT 5639, BEING AWARD NO। 2 मिनरल क्लैम, केडीवाईडी '। मुझे एक अभिव्यक्ति की आवश्यकता है जो "TITLE" फ़ील्ड में 'MINERAL CLAIM' पाठ वाली किसी भी सुविधा का चयन करती है।

जवाबों:


25

आप बस LIKEऑपरेटर का उपयोग करेंगे ।

उदाहरण के लिए, "TITLE" LIKE '%MINERAL CLAIM%'

%प्रतीक एक वाइल्डकार्ड तरह कार्य करता है।

LIKEकेस-संवेदी है, जबकि ILIKEनहीं है।


और ध्यान रखें कि यह एक धीमा ऑपरेशन है, आप इसे हर समय अभिव्यक्ति के रूप में रखने के बजाय एक नया कॉलम बनाने के लिए उपयोग करना चाह सकते हैं।
Bugmenot123

यह एक बड़े आकार के लिए धीमा है, इसलिए मैंने एक नई वेक्टर परत के रूप में चयन को सरल / चिपका दिया।
क्रिस

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

अनुक्रमित का उपयोग LIKE के साथ नहीं किया जा सकता है इसलिए मैं हमेशा उन्हें बार-बार करने से बचने की कोशिश करता हूं। लेकिन हां, यह अप्रासंगिक हो सकता है, निश्चित रूप से छोटे डेटासेट के साथ गति के लिए अन्य कम लटका हुआ फल हैं।
बुग्मनोट्स123

1
@ Bugmenot123 मैंने अभी सीखा है, कि यदि आपका डेटा पोस्टग्रेजल में होने पर आपके पास एक इंडेक्स है, तो LIKE इसे विशिष्ट परिस्थितियों में उपयोग करेगा (जैसे कि% क्वेरी में है) और क्रमिक स्कैन न करें! blog.cleverelephant.ca/2016/08/pgsql-text-pattern-ops.html
SaultDon

3

मुझे यह सटीक समस्या थी और इसे रेगेक्स के साथ अजगर कंसोल से हल किया। जबकि रेगेक्स मुश्किल हो सकता है यह बहुत शक्तिशाली है। और आपको एक उपकरण के साथ छोड़ दिया जाएगा जिसका उपयोग आप अधिक कठिन मैच मामलों के साथ कर सकते हैं। यहाँ डॉक्स हैं । और यहाँ अपने regex तार के परीक्षण के लिए एक अच्छा ऑनलाइन मशीन है

सबसे पहले यहाँ क्विज़ में अपने रेगेक्स स्ट्रिंग्स की जाँच के लिए मैं त्वरित स्क्रिप्ट चलाता हूं

import re
RES_STRING='MINERAL CLAIM'
REGEX_HAYSTACK='DISTRICT LOT 5639, BEING AWARD NO. 2 MINERAL CLAIM, KDYD'

REGEX_STRING=re.compile(RES_STRING)
print "searching for "+RES_STRING+" in "+REGEX_HAYSTACK
REGEX_MATCH = REGEX_STRING.search(REGEX_HAYSTACK)
if REGEX_MATCH:
    print "found '"+REGEX_MATCH.group()+"'"
else:
    print "No match found"

एक बार जब आप अपने रेगेक्स मिलान से खुश हो जाते हैं, तो आप इसे फ़ंक्शन में लपेट सकते हैं जो सभी सुविधाओं के लिए एक चयन प्रदान करता है। नीचे ऐसा करने के लिए एक फ़ंक्शन है।

def select_by_regex(input_layer,attribute_name,regex_string):
    import re
    RES_STRING=regex_string
    attribute_name_idx = input_layer.fieldNameIndex(attribute_name)
    if attribute_name_idx<0:
        raise valueError("cannot find attribute"+attribute_name)
    else:
        fids=[]
        for feature in input_layer.getFeatures():
            REGEX_HAYSTACK=feature[attribute_name_idx]
            REGEX_STRING=re.compile(RES_STRING)
            REGEX_MATCH = REGEX_STRING.search(REGEX_HAYSTACK)
            if REGEX_MATCH:
                fids.append(feature.id())
            else:
                pass
        input_layer.setSelectedFeatures(fids)


#USAGE BIT
input_layer = QgsVectorLayer('path/to/shape/file.shp','layer name', 'ogr')
QgsMapLayerRegistry.instance().addMapLayer(input_layer)   
regex_string='MINERAL CLAIM'
attribute_name='TITLE'
select_by_regex(input_layer,attribute_name,regex_string)

आपको इसे एक फ़ाइल में सहेजने और इसे qgis python ide से चलाने की आवश्यकता होगी।

(अप्रमाणित लेकिन बहुत आश्वस्त)


1
रेगेक्स सीखने के लिए महान सलाह, लेकिन हाथ में समस्या के लिए ओवरकिल।
अल्फाबेटसैप

1
@ अल्फा-बीटा-सूप सच। इस मामले में। हालांकि, इसी तरह की समस्याओं निश्चित रूप से यह अपरिहार्य मिलेगा। बहुत संख्या <6000? या पहले 2 खनिज दावे? यह सिर्फ एक और (यद्यपि बहुत अधिक जटिल / शक्तिशाली) उत्तर है। शायद यह किसी और की मदद करेगा।
मि। पर्पल

3
यह भी ध्यान दें कि QGIS में एक रेगुलर एक्सप्रेशन मैच फ़ंक्शन - regexp_match है।
ndawson

निश्चित रूप से अधिक "गहराई में" उत्तर। मुझे जो चाहिए, उसके लिए थोड़ा ओवरकिल, लेकिन फिर भी इसकी सराहना करें। यह भविष्य में दूसरों की मदद करने के लिए निश्चित है।
क्रिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.