पायथन का उपयोग करके उनके गुणों के आधार पर फ़िल्टर विशेषताएं?


16

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

उदाहरण: मेरा एक क्षेत्र का नाम 'काउंटीज' है। इसमें पचास हजार से अधिक विशेषताएं हैं। सभी सुविधाओं को प्राप्त करना और समय लेने के कारण इसे फ़िल्टर करना संभव नहीं है। इसलिए मैं आर्कियोजेक्ट में iqueryfilter.whereclause = 'काउंटी = नॉर्विच' का उपयोग करके इसे क्वेरी कर सकता हूं। इसी तरह की बात मुझे PyQgis में चाहिए।


1
@NathanW हाँ आप सही हैं। मुझे केवल परत से एक क्वेरी का उपयोग करके डेटा वापस करने की आवश्यकता है। आप मुझे pyqgis में कोई उदाहरण प्रदान कर सकते हैं?
वेंकट

@NathanW हाय मैं समझ गया। आर्कगिस में इसकी परिभाषा क्वेरी की तरह काम कर रही है। इस उदाहरण को देखें। t = outputLayer.setSubsetString ('UniqID =' + inputFeat.attribute ("UniqID") .PyObject ()) यदि t == True: outputProvider = =LLayer.dataProvider () प्रिंट आउटपुटProvider.featureCount () यानी यह केवल क्वेरी क्वेरी लौटाएगा। संतुष्ट डेटा
venkat

@venkat जहां QGIS में आप क्वेरी डाल रहे हैं? धन्यवाद।
इयानब्रॉड

जवाबों:


12

QGIS अभिव्यक्ति इंजन QgsFeatureRequest.setFilterExpression( unicode )विधि का उपयोग करके ऐसा करने में सक्षम है (QGIS 2.2 के बाद से)

request = QgsFeatureRequest().setFilterExpression( u'"Counties" = \'Norwich\'' )
it = l.getFeatures( request )

QGIS 2.10 से शुरू करना और भी संभव है कि इस तरह से फ़िल्टर करने से आपको अन्य प्रकार के फ़िल्टरिंग पर कुछ अतिरिक्त प्रदर्शन मिलेगा (जैसे कि पायथन कार्यान्वयन)।

मूल रूप से यह लागू होता है यदि निम्नलिखित तीन शर्तें पूरी होती हैं:

  • आप इस समय पोस्टगीस प्रदाता के साथ एक परत का उपयोग कर रहे हैं (2.16) पोस्टगिस प्रदाता की तुलना में कई गुना अधिक इसे लागू करते हैं (स्थानिक, ओगर, ओरेकल ...)।
  • आपकी अभिव्यक्ति अति जटिल नहीं है (जैसी चीजें >,= , IN, NOT NULL... समर्थित हैं)
  • आपने इस सुविधा को सेटिंग> विकल्प> डेटा स्रोत> डेटा स्रोत हैंडलिंग> सर्वर साइड पर पोस्टग्रेज पर एक्सक्लूसिव एक्सप्रेशन सक्षम किया है
  • प्रदर्शन लाभ डेटाबेस तालिकाओं पर उपयुक्त अनुक्रमित के साथ इष्टतम है

QGIS 3.0 के साथ यह केवल करना संभव है

features = l.getFeatures('"Counties" = \'Norwicth\'')

1

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


2
यह डुप्लीकेट सवाल नहीं है। मैं एक परत से सभी विशेषताओं को प्राप्त नहीं करना चाहता। इसे पहले फ़िल्टर करें और फिर मैं उन विशेषताओं को प्राप्त करना चाहता हूं जो फ़िल्टर मानदंडों के तहत आती हैं। यानी प्रदर्शन काफी बेहतर है।
वेंकट

1

एक sql क्वेरी का उपयोग करके यह भी आसानी से संभव है ogr। आप इस कोड को QGIS पायथन कंसोल या स्टैंडअलोन स्क्रिप्ट में उदाहरण के लिए निष्पादित कर सकते हैं।
उदाहरण :

from osgeo import ogr

path = "path to your shapefile.shp"
ID = "FieldID" # For instance 'Countries' 
datasource = ogr.Open(str(path)) # your datasource

layer = datasource.GetLayer(0) # Import layer 0 --> only works with shapefiles
layerName = str( layer.GetName() )# Save the Layersname first

# Do the sql query
# Selects all features from a layer datasource where Field Countries is equal to 'Germany'
layers = datasource.ExecuteSQL("SELECT * FROM %s WHERE %s = '%s'" % (layerName, ID, 'Germany') )
res = []
for i in range(0,layers.GetFeatureCount()):
   f = layers.GetFeature(i)
   g = f.GetGeometryRef()
   res.append(g.Area()) 

# res now contains the measured area of each feature where the attribute ID has the value 'Germany'

0

निर्दिष्ट SQL फिल्टर अभी तक संस्करण 1.9 के रूप में QGIS API का उपयोग करके समर्थित नहीं हैं।

जैसा कि मैं इस मेलिंग सूची लेख से समझता हूं , "देशी प्रदाता की एसक्यूएल" के लिए समर्थन केवल भविष्य के रिलीज में होगा।

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