Як завантажити вихід пам'яті з обробки 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
Мене заінтригує відповідь, яку ти знайшов. Чи знаєте ви, чи існує подібний засіб створення шару пам'яті - і можливість отримати доступ до нього, не застосовуючи runandload? Я сподіваюся зробити деяку публікацію обробки виходу обробки, перш ніж додати її до полотна - і задумався, чи таке можливо…
Katalpa,

1
Я не міг знайти його в той час, щоб не сказати, що це неможливо ... Я думаю, ви можете завантажити його і приховати, якщо це допоможе.
Ойштейн

Якщо ви не можете знайти назву шару, QgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]спробуйте це:QgsMapLayerRegistry.instance().mapLayers()
Товариш Че

@Katalpa ви можете спробувати, treatment.runalg ("qgis: перехрестя", layer1, layer2, 'out.shp')
драма

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КЛЮЧОВИЙ, а значення - тимчасовий шлях. Ви можете бачити ключ із processseing.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 ), дотримуючись політики Stack Exchange. Більше інформації: meta.stackexchange.com/q/104227
Аарон

Це в кінцевому підсумку працювало для мене. Ключ інформації , яка була відсутня в іншому місці, що ви можете пройти output['OUTPUT']шлях QgsVectorLayerз provider_nameз "ogr". Це буде прочитано у .shp шляху та створить шар в пам'яті. Цей підхід не додає шару до реєстру, тому він не спалахує на панелі шарів.
Нік К9

Відповідно до сторінки керівництва, на яку ви посилаєтесь, "Метод runalg повертає словник із вихідними іменами (тими, які показані в описі алгоритму) у вигляді ключів, а шляхи до файлів цих виходів - як значення". Тому, схоже, цей підхід не використовує шари пам'яті - всі проміжні результати зберігатимуться у файловій системі.
Håvard Tveite

0

Я не впевнений, чи це допоможе вам у вашому контексті (чи хочете ви запустити свій код як окремий, так і в межах QGIS після завершення алгоритму обробки?). Якщо це останнє, ви можете легко запитувати завантажені QGsVector-та QGsRasterlayerоб’єкти, заглянувши в реєстр QGIS MapLayer.

# 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

Взагалі всі шари повинні мати джерело десь на жорсткому диску, навіть якщо результат тільки додається після того, як обробка alg закінчить свої обчислення. Якщо ви заглянете в метадані шарів, ви зможете знайти власне джерело шару (якщо його походження відбувається при обробці його зазвичай десь у тимчасовій папці)


Спасибі за вашу відповідь. Я думаю, що вже існує getLayersByNameфункція для реєстру карт, але я хочу запустити алгоритм з консолі, тому це не допоможе (шар пам'яті ніколи не завантажується в реєстр, це я намагаюся зробити) . Але ви хочете сказати, що немає переваги використовувати вихід пам’яті порівняно з передачею Noneта генерацією тимчасового файлу? Ви впевнені в цьому?
Ойштейн

Noneпросто передається, якщо шару неможливо знайти в реєстрі. Він не створює тимчасовий файл, і вам потрібно все одно перевірити його. Я використовую цю функцію для запиту завантажених шарів в QGIS. Не можу вам допомогти на вулиці в консолі.
Curlew

Я думаю, що ви неправильно зрозуміли, я говорив про перехід Noneдо processing.runalgвихідного параметра, який, на мою думку, створює тимчасовий вихідний файл.
Oystein

FYI: Щойно знову наткнувся на функцію QgsMapLayerRegistry, її називаютьmapLayersByName
Oystein
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.