PyQGIS के साथ एक अभिव्यक्ति का उपयोग करके सुविधाओं का चयन करना


13

मैं एक अभिव्यक्ति का उपयोग करके PyQGIS के साथ सुविधाओं का चयन कैसे कर सकता हूं?

मैंने उपयोग करने की कोशिश की QgsExpressionलेकिन चुनिंदा विधि इसे नहीं लेती है:

exp = QgsExpression("'ogc_fid' = 482")
cLayer = canvas.currentLayer()
cLayer.select(exp)

क्या यह संभव है और यदि हां, तो मैं इसे कैसे करूं?

जवाबों:


24

आजकल (QGIS v3.x)

  1. परत संदर्भ प्राप्त करें:

    layer = iface.activeLayer()

  2. अभिव्यक्ति द्वारा सुविधाओं का चयन करें:

    layer.selectByExpression( "\"ogc_fid\"=482" )


QGIS 2.16 से पहले

इन कदमों का अनुसरण करें:

  1. परत संदर्भ प्राप्त करें:

    cLayer = iface.mapCanvas().currentLayer()

  2. एक अभिव्यक्ति से एक सुविधा प्राप्त करें:

    expr = QgsExpression( "\"ogc_fid\"=482" )

    it = cLayer.getFeatures( QgsFeatureRequest( expr ) )

  3. 2 में प्राप्त परिणाम से सुविधा Ids की एक सूची बनाएँ।

    ids = [i.id() for i in it]

  4. 3 में प्राप्त आईडी के साथ सुविधाओं का चयन करें:

    cLayer.setSelectedFeatures( ids )


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

expr = QgsExpression( " \"name\" = 'my string' " )

यदि आपका स्ट्रिंग मान एक चर से आता है, तो आप यह कर सकते हैं:

myVariable = 'my string'
expr = QgsExpression( " \"name\" = '{}' ".format(myVariable) )

मैं कैसे कहूँ "\"ogc_fid\"=482 AND name=\"hello world\""? यहाँ यह कहता है कि यह अजगर में उपलब्ध नहीं है: qgis.org/api/… । शायद आप इस सीमा को दरकिनार करने का एक तरीका जानते हैं?
जेनिया इवानोव

2
ध्यान रखें कि फ़ील्ड के नाम दोहरे उद्धृत होने चाहिए, स्ट्रिंग मान एकल उद्धरण और संख्या को उद्धरण की आवश्यकता नहीं है। अपने उदाहरण में: "\"ogc_fid\"=482 AND \"name\"='hello world'"। BTW, आपकी टिप्पणी में शामिल लिंक वास्तव में बता रहा है कि BinaryOperatorTextपायथन बाइंडिंग में स्थिर विशेषता उपलब्ध नहीं है, लेकिन ऑपरेटर्स के लिए काम करते हैं QgsExpression, भले ही वे पायथन बाइंडिंग के माध्यम से उपयोग किए जाते हों।
जर्मेन कैरिलो

@ GermánCarrillo मैं ऊपर आपके तरीके का उपयोग कर रहा हूं, लेकिन इसे खोजने के लिए एक ज्ञात मान कॉपी और पेस्ट करने के बावजूद किसी भी मान को वापस करने के लिए नहीं मिल सकता है। कॉलम में स्ट्रिंग्स हैं, इसलिए मैंने उपयोग किया है expr = QgsExpression("\"police_ref\" = 'P0580996'")। मैंने खोज शब्द (सिंगल-कोट्स के लिए) में एक ब्रेक-कैरेक्टर जोड़ने की कोशिश की है, लेकिन इससे कोई फर्क नहीं पड़ता। दिलचस्प बात यह है कि अगर मैं उस विशेषता तालिका को खोल रहा हूँ जो मैं क्वेरी कर रहा हूँ, और वहां अभिव्यक्ति बिल्डर का उपयोग करता हूं, तो यह एक चयन करता है यदि पुलिस_एसएआर उदाहरण के रूप में उपयोग करता है, तो पहली पंक्ति में है, लेकिन अन्यथा नहीं
एलेक्स

@ GermánCarrillo खेद है कि मन कभी नहीं, मुझे यकीन नहीं है कि मैंने अलग तरीके से क्या किया, लेकिन मैं इसे अब चुनिंदा सुविधाओं के लिए प्राप्त कर सकता हूं! दूसरों को पढ़ने के लिए, आप एकल उद्धरण के लिए एक ब्रेक-चरित्र की जरूरत नहीं है
एलेक्स

6

यह मेरे लिए QGIS पायथन कंसोल पर काम करता है

layer = qgis.utils.iface.activeLayer()
layer .selectByExpression(" \"ogc_fid\" = '{}' ".format(482))

GIS SE में आपका स्वागत है। एक नए उपयोगकर्ता के रूप में, कृपया यात्रा करें । मौजूदा (और स्वीकृत) उत्तर कहीं अधिक पूर्ण है। उस पर यह कैसे सुधार करता है? आम तौर पर, प्रतिष्ठा के अंक अर्जित करने का तरीका अनुत्तरित प्रश्नों का उत्तर देना है , लेकिन तीन साल पुराने प्रश्न का एक नया पूर्ण उत्तर स्वागत योग्य होगा, यदि यह विशेष रूप से पिछले समाधान के साथ एक समस्या को संबोधित करता है (जिस स्थिति में, समस्या का उल्लेख अवश्य होना चाहिए) ।
विंस

2

आपको केवल GUI इंटरफ़ेस में इसका परीक्षण करने की आवश्यकता है: "अभिव्यक्ति द्वारा चयन करें"। यदि यह काम करता है, तो आप इसे अपने पायथन कोड में दोहरे उद्धरण चिह्नों से घेर सकते हैं।

exp = QgsExpression("ogc_fid=482")

यदि आप एक स्ट्रिंग से तुलना करते हैं, तो आप एकल उद्धरण जोड़ सकते हैं ''।

exp = QgsExpression("ogc_fid='482'")

यह अजगर में एक ही सिद्धांत है, यह दोहरे उद्धरण और एकल उद्धरण के बीच अंतर कर सकता है।

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