কিউজিআইএস প্রক্রিয়াজাতকরণ থেকে মেমরি আউটপুট লোড করবেন কীভাবে?


11

অনেকগুলি প্রসেসিং অ্যালগরিদমের কাছে মেমরি হিসাবে আউটপুট সংরক্ষণের বিকল্প রয়েছে। যদি টুলবক্স থেকে চালানো হয় তবে এটি সূক্ষ্মভাবে কাজ করে, কারণ আপনি "অ্যালগরিদম চালানোর পরে আউটপুট ফাইলটি খুলুন" বাক্সটিতে টিক দিতে পারেন।

কিউজিআইএসের উত্স কোডটি দেখে, মেমরি স্তরটি লোড করার কোডটি ফাংশনে সংজ্ঞায়িত বলে মনে হচ্ছে 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

আআআন্ড আমি এটি খুঁজে পেয়েছি। ব্যবহার করুন 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
আপনি যে উত্তরটি পেয়েছেন তা দেখে আমি আগ্রহী। আপনি কি জানেন যে কোনও মেমরি স্তর তৈরি করার অনুরূপ উপায় আছে - এবং রানড্রোড বাস্তবায়ন না করে এটি অ্যাক্সেস করতে সক্ষম হচ্ছেন কিনা? আমি ক্যানভাসে প্রসেসিং আউটপুট যুক্ত করার আগে কিছু পোস্ট প্রসেসিং করব বলে আশা করি - এবং যদি
এমনটা

1
আমি সেই সময়ে একটিও খুঁজে পেলাম না, এটি বলা অসম্ভব বলে মনে করলাম না ... আমি অনুমান করি আপনি যদি এটি লোড করতে এবং এটি লুকিয়ে রাখতে পারেন, যদি এটি সাহায্য করে।
ওস্টিন

এটি ব্যবহার QgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]করে যদি আপনি স্তরটির নামটি না খুঁজে পান তবে :QgsMapLayerRegistry.instance().mapLayers()
কমরেড চে

@ ক্যাটালপা আপনি চেষ্টা করতে পারেন, প্রসেসিং.রুনালগ ("কিগিস: ছেদ", স্তর 1, স্তর 2, 'আউট.শ্প')
নাটক

4

এটি সঠিক উপায়, এটি ডকুমেন্টেশনে ব্যাখ্যা করা হয়েছে http://docs.qgis.org/2.14/es/docs/user_manual/processing/console.html

পরবর্তী কোডটি মেমোরির সাথে শেষের ব্যতীত এটি লোড হয় work

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কী, এবং মানটি একটি সাময়িক পথ। আপনি প্রসেসিং.এলঘেল্প ("নাম প্রসেসিং") প্রসেসিং, অ্যালগেল্প ("ঘাস: 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>

এক্ষেত্রে মূলটি আউটপুট , মূলধন বা মূলধন ছাড়াই আপনাকে অবশ্যই মূলধনপত্র লিখতে হবে, এই ক্ষেত্রে মূলধন নয় care


দয়া করে স্ট্যাক এক্সচেঞ্জ নীতি অনুসরণ করে সদৃশ জবাবগুলি ( gis.stackexchange.com/a/211730/8104 ) এড়িয়ে চলুন । আরও বিশদ: meta.stackexchange.com/q/104227
হারুন

এই একটাই ছিল যা শেষ পর্যন্ত আমার পক্ষে কাজ করেছিল। কী তথ্য যে অন্যত্র অনুপস্থিত ছিল যে আপনার পাস করতে পারেন ছিল output['OUTPUT']পাথ QgsVectorLayerএকটি সঙ্গে provider_nameএর "ogr"। এটি .shp পথে পড়বে এবং একটি মেমরির স্তর তৈরি করবে। এই পদ্ধতিটি রেজিস্ট্রিতে স্তরটি যুক্ত করে না তাই এটি স্তর প্যানেলে ফ্ল্যাশ হয় না।
নিক কে 9

আপনার উল্লেখ ম্যানুয়াল পৃষ্ঠা অনুসারে, "রানালগ পদ্ধতিটি আউটপুট নামগুলি (অ্যালগোরিদম বর্ণনায় দেখানো হয়েছে) কী হিসাবে এবং সেই আউটপুটগুলির ফাইল হিসাবে পাথ হিসাবে মান হিসাবে একটি অভিধান প্রদান করে" " সুতরাং এই পদ্ধতির মেমোরি স্তরগুলি ব্যবহার করে বলে মনে হচ্ছে না - সমস্ত মধ্যবর্তী ফলাফলগুলি ফাইল সিস্টেমে সংরক্ষণ করা হবে।
হাভার্ড টোয়েট

0

আমি নিশ্চিত নই যে এটি আপনাকে আপনার প্রসঙ্গে সহায়তা করবে (আপনি কি নিজের কোডটি স্ট্যান্ডলোন হিসাবে চালাতে চান বা প্রসেসিং অ্যালগরিটম শেষ হওয়ার পরে কিউজিআইএসের মধ্যে?) যদি এটি পরে থাকে তবে আপনি কিউজিআইএস ম্যাপলায়ার রেজিস্ট্রিটি দেখে সহজেই লোড হওয়া 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টেম্প ফাইলটি পাস এবং উত্পন্ন করার তুলনায় মেমরি আউটপুট ব্যবহার করার কোনও সুবিধা নেই ? আপনি কি এ ব্যাপারে নিশ্চিত?
ওস্টিন

Noneস্তরটি রেজিস্ট্রিটিতে পাওয়া না গেলে সবেমাত্র পেরিয়ে গেছে। এটি কোনও টেম্পাইল তৈরি করে না এবং যাইহোক আপনাকে এটি নিজেই পরীক্ষা করতে হবে check আমি এই ফাংশনটি কিউজিআইএস-এর মধ্যে লোড স্তরগুলিকে জিজ্ঞাসা করতে ব্যবহার করি। কনসোলে আপনাকে বাইরে সাহায্য করতে পারে না।
কার্লিউ

আমি তোমাদের ভুল বুঝে ভাবেন, আমি পাশ করার সম্পর্কে কথা ছিল মনে Noneকরতে processing.runalgআউটপুট পরামিতি, যা আমি বিশ্বাস করি একটি টেম্প আউটপুট ফাইল তৈরি করে থাকে।
ওস্টিন

এফওয়াইআই: সবেমাত্র কিউএসম্যাপলায়াররেজিস্ট্রি ফাংশনটি জুড়ে এসেছিল, একে বলা হয়mapLayersByName
ওস্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.