Як завантажити вихід пам'яті з обробки 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.