Многие алгоритмы обработки имеют возможность сохранить вывод в виде памяти. Если запустить из панели инструментов, это работает нормально, потому что вы можете поставить галочку «Открыть выходной файл после запуска алгоритма».
Глядя на исходный код 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")
Однако я не могу найти способ получить результат.
QgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]
попробуйте это:QgsMapLayerRegistry.instance().mapLayers()
это правильный путь, это объясняется в документации http://docs.qgis.org/2.14/es/docs/user_manual/processing/console.html
следующий код работает с в памяти все, кроме последнего, что он загружен
processing.runalg
возвращает словарь в данном случаеbu['OUTPUT']
.OUTPUT
ЯВЛЯЕТСЯ КЛЮЧОМ, а значение - временным путем. Вы можете увидеть ключ с processseing.alghelp («обработка имени») в качестве обработки, alghelp («grass: r.drain»)возвращение
в этом случае ключ выводится , будьте осторожны с заглавными буквами, которые вы должны написать заглавными или без заглавных букв, в данном случае не заглавными.
источник
output['OUTPUT']
путьQgsVectorLayer
с помощьюprovider_name
of"ogr"
. Это будет читать по пути .shp и создаст слой в памяти. Этот подход не добавляет слой в реестр, поэтому он не мигает на панели слоев.Я не уверен, поможет ли это вам в вашем контексте (хотите ли вы запустить свой код как автономный или в QGIS после завершения алгоритма обработки?). Если это последнее, вы можете легко запросить загруженные
QGsVector-
иQGsRasterlayer
объекты, заглянув в реестр QGIS MapLayer.В общем случае все слои должны иметь источник где-то на жестком диске, даже если результат просто добавляется после того, как обработчик завершает свои вычисления. Если вы посмотрите на метаданные слоев, вы сможете найти фактический источник слоя (если он возник в результате обработки, обычно где-то во временной папке).
источник
getLayersByName
функция для реестра карт, но я хочу запустить алгоритм из консоли самостоятельно, так что это не очень поможет (слой памяти никогда не загружается в реестр, вот что я пытаюсь сделать) , Но вы говорите, что нет никакого преимущества в использовании вывода памяти по сравнению с передачейNone
и генерацией временного файла? Вы уверены, что?None
просто передается, если слой не может быть найден в реестре. Он не создает временный файл, и вам все равно нужно проверять его вручную. Я использую эту функцию для запроса загруженных слоев в QGIS. Не могу помочь вам снаружи в консоли.None
вprocessing.runalg
качестве выходного параметра, который, я считаю, создает временный выходной файл.mapLayersByName