QGIS प्रसंस्करण / SEXTANTE के साथ मेमोरी वेक्टर लेयर का उपयोग करना


10

मैं qgis:clipकंसोल से कंसोल को चलाने की कोशिश कर रहा हूं , लेकिन ओवरले पैरामीटर के रूप में इन-मेमोरी लेयर का उपयोग करते समय मुझे एक त्रुटि मिल रही है। क्या यह अपेक्षित है, या मैं कुछ गलत कर रहा हूं?

कोड:

mem_layer = QgsVectorLayer("Polygon?crs=epsg:4326", "temp_layer", "memory")
if not mem_layer.isValid(): raise Exception("Failed to create memory layer")            
mem_layer_provider = mem_layer.dataProvider()

clip_polygon = QgsFeature()
clip_polygon.setGeometry(QgsGeometry.fromRect( 
    QgsRectangle(
        self.output_layer.extent().xMinimum() + 10,
        self.output_layer.extent().yMinimum() + 10,
        self.output_layer.extent().xMaximum() - 10,
        self.output_layer.extent().yMaximum() - 10
    )
))
mem_layer_provider.addFeatures([clip_polygon])
mem_layer.updateExtents()

output = self.output_layer_path + "2"
processing.runalg("qgis:clip", layer, mem_layer, output) # Fails

ऊपर दिए गए कोड में, self.output_layerऔर layerवेक्टर लेयर ऑब्जेक्ट हैं (QgsVectorLayer - उचित वाले, डिस्क पर शेपफाइल्स से लोड किए गए), self.output_layer_pathएक पथ के साथ एक पायथन स्ट्रिंग ऑब्जेक्ट है।

यहाँ त्रुटि मुझे मिल रही है:

"C:/OSGEO4~1/apps/qgis/./python/plugins\processing\core\GeoAlgorithm.py", line 150, in     
    execute self.processAlgorithm(progress)
File "C:/OSGEO4~1/apps/qgis/./python/plugins\processing\algs\ftools\Clip.py", line 72, 
    in processAlgorithm index = utils.createSpatialIndex(layerB)
File "C:/OSGEO4~1/apps/qgis/./python/plugins\processing\algs\ftools\FToolsUtils.py", 
    line 31, in createSpatialIndex features = QGisLayers.features(layer)
File "C:/OSGEO4~1/apps/qgis/./python/plugins\processing\core\QGisLayers.py", line 211, 
    in features return Features(layer)
File "C:/OSGEO4~1/apps/qgis/./python/plugins\processing\core\QGisLayers.py", line 218, 
    in __init__ self.iter = layer.getFeatures()
AttributeError: 'NoneType' object has no attribute 'getFeatures'

यदि मैं अपने प्रोसेसिंग कॉल को निम्न में बदलता हूं, तो यह बिना किसी त्रुटि के चलता है:

processing.runalg("qgis:clip", layer, self.output_layer, output) # Runs fine

इसके अलावा, यदि कोई मदद करता है, तो यह फेलिंग एल्गोरिथ्म है क्योंकि यह प्रोसेसिंग_qgis.log में लॉग इन है:

processing.runalg("qgis:clip","C:/path/to/shapefile.shp|layerid=0|subset=CONTINENT = 
    'Europe'","Polygon?crs=epsg:4326","C:/path/to/output")

1
यह संभवतः अपेक्षित है क्योंकि हार्ड-ड्राइव पर उपकरण को एक भौतिक परत को संबोधित करने की आवश्यकता है। बस एक विचार है, लेकिन आप अस्थायी रूप से एक अस्थायी फ़ाइल में परत को बचाने की कोशिश क्यों नहीं करते हैं (यदि आपको स्थान की आवश्यकता है import tempfileऔर tempfile.gettempdir)। यह कैसे QGIS प्रसंस्करण वैसे भी काम करता है
Curlew

मैं करूँगा, अगर मुझे .. इन जैसी परतों के लिए स्मृति में काम करने के लिए बस आसान और साफ है। यदि आप सुनिश्चित हैं कि यह अपेक्षित है, तो इसे उत्तर के रूप में पोस्ट करें और मैं इसे स्वीकार कर सकता हूं।
ओएस्टीन

जवाबों:


12

जैसा कि यह पता चला है, यह तब तक ठीक काम करता है जब तक आप मेमोरी लेयर का उपयोग करने से पहले सामग्री की तालिका में जोड़ देते हैं। ऐसा लगता dataobjects.getObjectFromUriहै कि क्यूजीआईएस स्रोत में फ़ंक्शन इसे अन्यथा नहीं संभाल सकता है।

तो निम्नलिखित बहुत अच्छी तरह से काम करता है:

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)
processing.runalg("qgis:clip", layer, mem_layer, output)

प्रसंस्करण कार्यों से आउटपुट के रूप में मेमोरी लेयर्स का उपयोग कैसे करें (मूल रूप से इसके बजाय उपयोग करें ) के लिए मेरा हाल का प्रश्न देखें ।processing.runandloadprocessing.runalg

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