QGIS प्रोसेसिंग से मेमोरी आउटपुट कैसे लोड करें?


11

कई प्रोसेसिंग एल्गोरिदम में आउटपुट को मेमोरी के रूप में सहेजने का विकल्प होता है। यदि टूलबॉक्स से भाग गया, तो यह ठीक काम करता है, क्योंकि आप "रनिंग एल्गोरिथम के बाद ओपन आउटपुट फाइल" पर टिक कर सकते हैं।

QGIS के स्रोत कोड को देखते हुए, मेमोरी लेयर को लोड करने के लिए कोड फ़ंक्शन में परिभाषित किया गया लगता है Postprocessing.handleAlgorithmResults। फ़ंक्शन किसी alg.outputsसूची तक पहुंच का उपयोग करता है , और निम्न कार्य करता है :

for out in alg.outputs:
    progress.setPercentage(100 * i / float(len(alg.outputs)))
    if out.hidden or not out.open:
        continue
    if isinstance(out, (OutputRaster, OutputVector, OutputTable)):
        try:
            if out.value.startswith('memory:'):
                layer = out.memoryLayer                                # NOTE!!
                QgsMapLayerRegistry.instance().addMapLayers([layer])   # NOTE!!
            else:
                # ... 

जब आप कंसोल से प्रसंस्करण एल्गोरिदम चलाते हैं, तो क्या इस ऑब्जेक्ट तक पहुंच के बिना परत को लोड करने का एक तरीका है? मैं दौड़ सकता हूं

processing.runalg("qgis:intersection", layer1, layer2, "memory:")

या और भी

processing.runalg("qgis:intersection", layer1, layer2, "memory:myLayerName")

हालाँकि मुझे परिणामी आउटपुट को हथियाने का कोई तरीका नहीं मिल रहा है।

जवाबों:


15

Aaaand मैंने पाया। उपयोग करें processing.runandload, जो एल्गोरिदम को चलाने के बाद आउटपुट परत को सामग्री की तालिका में लोड करता है।

processing.runandload("qgis:intersection", layer1, layer2, "memory:myLayerName")
layer = QgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]
# Should do error checking as well, but this works!!

1
मुझे आपके द्वारा दिए गए उत्तर से घबराहट हो रही है। क्या आप जानते हैं कि क्या मेमोरी लेयर बनाने का एक समान साधन है - और रनएंडलोड को लागू किए बिना इसे एक्सेस करने में सक्षम है? मुझे उम्मीद है कि कैनवास पर जोड़ने से पहले प्रोसेसिंग आउटपुट पर कुछ पोस्ट प्रोसेसिंग की जाएगी - और आश्चर्य होगा कि क्या ऐसा संभव है ...
Katalpa

1
मुझे उस समय कोई नहीं मिला, यह कहने के लिए कि यह असंभव है ... मुझे लगता है कि आप इसे लोड कर सकते हैं और इसे छिपा सकते हैं, अगर यह मदद करता है।
Oystein

अगर आपको QgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]यह प्रयोग करके परत का नाम नहीं मिल रहा है :QgsMapLayerRegistry.instance().mapLayers()
कॉमरेड Che

@ कटप्पा आप कोशिश कर सकते हैं, प्रसंस्करण। क्रुनाल ("क्यूगिस: चौराहा", लेयर 1, लेयर 2, 'आउट.शप')
नाटक

4

यह सही तरीका है, यह दस्तावेज़ीकरण में बताया गया है http://docs.qgis.org/2.14/es/docs/user_manual/processing/console.html

अगला कोड मेमोरी के साथ काम करता है सिवाय इसके कि वह लोड हो

MDT=path/mdt.tif
drain=processing.runalg("grass:r.drain",MDT,"",(pun),False,False,False,"%f,%f,%f,%f"% (xmin, xmax, ymin, ymax),0,-1,0.00100,None)
vect=processing.runalg("grass:r.to.vect",drain['output'],0,False,"%f,%f,%f,%f"% (xmin, xmax, ymin, ymax),0,None)
bu=processing.runalg("qgis:fixeddistancebuffer",vect['output'],Metros_afecta,1,False,None)
buf=bu['OUTPUT']
bufe= QgsVectorLayer(buf,"area", "ogr")
#the last load the layer 
QgsMapLayerRegistry.instance().addMapLayers([bufe])

processing.runalgइस मामले में एक शब्दकोश रिटर्न bu['OUTPUT']OUTPUTकुंजी है, और मूल्य एक अस्थायी रास्ता है। आप प्रोसेसिंग के रूप में processeing.alghelp ("नाम प्रसंस्करण") के साथ कुंजी देख सकते हैं, alghelp ("घास: r.drain")

वापसी

processing.alghelp("grass:r.drain")
ALGORITHM: r.drain - Traces a flow through an elevation model on a raster map.
input <ParameterRaster>
coordinate <ParameterString>
vector_points <ParameterMultipleInput>
-c <ParameterBoolean>
-a <ParameterBoolean>
-n <ParameterBoolean>
GRASS_REGION_PARAMETER <ParameterExtent>
GRASS_REGION_CELLSIZE_PARAMETER <ParameterNumber>
GRASS_SNAP_TOLERANCE_PARAMETER <ParameterNumber>
GRASS_MIN_AREA_PARAMETER <ParameterNumber>
output <OutputRaster>

इस मामले में कुंजी आउटपुट है , बड़े अक्षरों के साथ ध्यान रखें जो आपको पूंजी में लिखना चाहिए या पूंजी के बिना, इस मामले में पूंजी नहीं।


स्टैक एक्सचेंज पॉलिसी के बाद कृपया डुप्लिकेट उत्तर ( gis.stackexchange.com/a/211730/8104 ) से बचें । अधिक विवरण: meta.stackexchange.com/q/104227
हारून

यह वह था जिसने अंततः मेरे लिए काम किया। मुख्य जानकारी है कि कहीं याद आ रही थी कि आप पास कर सकते हैं था output['OUTPUT']करने के लिए पथ QgsVectorLayerएक साथ provider_nameकी "ogr"। यह .shp पथ को पढ़ेगा और इन-मेमोरी लेयर बनाएगा। यह दृष्टिकोण परत को रजिस्ट्री में नहीं जोड़ता है, इसलिए यह परत पैनल में फ्लैश नहीं करता है।
निक K9

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

0

मुझे यकीन नहीं है कि अगर यह आपके संदर्भ में आपकी मदद करेगा (क्या आप अपने कोड को स्टैंडअलोन के रूप में या QGIS के भीतर एक प्रसंस्करण algoritm समाप्त होने के बाद चलाना चाहते हैं?)। यदि इसका उत्तरार्द्ध आप आसानी से QGIS MapLayer रजिस्ट्री में देखकर भरी हुई QGsVector-और QGsRasterlayerवस्तुओं को क्वेरी कर सकते हैं ।

# General function to retrieve a layer with a given name
def getLayerByName( layerName ):
  layerMap = QgsMapLayerRegistry.instance().mapLayers()
  for name, layer in layerMap.iteritems():
    if layer.name() == layerName:
        if layer.isValid():
          return layer
        else:
          return None

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


आपके उत्तर के लिए धन्यवाद। मुझे लगता है कि पहले से ही getLayersByNameनक्शे की रजिस्ट्री के लिए एक फ़ंक्शन है, लेकिन मैं कंसोल को स्वयं कंसोल से चलाना चाहता हूं, इसलिए यह वास्तव में मदद नहीं करेगा (मेमोरी परत को रजिस्ट्री में कभी लोड नहीं किया जाता है, यही मैं करने की कोशिश कर रहा हूं) । लेकिन क्या आप कह रहे हैं कि Noneटेम्प फाइल को पास करने और जेनरेट करने की तुलना में मेमोरी आउटपुट का उपयोग करने का कोई फायदा नहीं है ? क्या अापको उस बारे में पूर्ण विशवास है?
Oystein

Noneअगर परत रजिस्ट्री में नहीं मिल सकती है तो अभी पारित किया गया है। यह एक गतिरोध पैदा नहीं करता है और आपको इसके लिए मैन्युअल रूप से जाँच करने की आवश्यकता है। मैं इस फ़ंक्शन का उपयोग QGIS के भीतर भरी हुई परतों को क्वेरी करने के लिए करता हूं। कंसोल में बाहर आपकी मदद नहीं कर सकता।
Curlew

मैं तुम्हें गलत समझा, मैं गुजर के बारे में बात कर रहा था लगता है Noneकरने के लिए processing.runalgउत्पादन पैरामीटर, जो मेरा मानना है कि एक अस्थायी उत्पादन फ़ाइल बनाता है के रूप में।
Oystein

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