Muitos algoritmos de processamento têm uma opção para salvar a saída como memória. Se executado a partir da caixa de ferramentas, isso funciona bem, porque você pode marcar a caixa "Abrir arquivo de saída após executar o algoritmo".
Observando o código fonte do QGIS, o código para carregar a camada de memória parece estar definido na função Postprocessing.handleAlgorithmResults
. A função usa o acesso a uma alg.outputs
lista e faz o seguinte:
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:
# ...
Quando você executa algoritmos de processamento no console, existe uma maneira de carregar a camada sem acesso a esse objeto? eu posso correr
processing.runalg("qgis:intersection", layer1, layer2, "memory:")
ou mesmo
processing.runalg("qgis:intersection", layer1, layer2, "memory:myLayerName")
No entanto, não consigo encontrar uma maneira de obter a saída resultante.
QgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]
tente o seguinte:QgsMapLayerRegistry.instance().mapLayers()
é o caminho correto, está explicado na documentação http://docs.qgis.org/2.14/es/docs/user_manual/processing/console.html
o próximo código funciona na memória, exceto o último que é carregado
o
processing.runalg
retorna um dicionário neste casobu['OUTPUT']
.OUTPUT
É A CHAVE, e o valor é um caminho temporário. Você pode ver a chave com processeing.alghelp ("name processing") como processing, alghelp ("grass: r.drain")Retorna
neste caso, a chave é emitida , tome cuidado com letras maiúsculas que você deve escrever em maiúsculas ou sem maiúsculas, neste caso não maiúsculas.
fonte
output['OUTPUT']
caminhoQgsVectorLayer
com umprovider_name
de"ogr"
. Isso será lido no caminho .shp e criará uma camada na memória. Essa abordagem não adiciona a camada ao registro e, portanto, não pisca no painel Camadas.Não tenho certeza se isso o ajudará em seu contexto (você deseja executar seu código como autônomo ou no QGIS após a conclusão de um algoritmo de processamento?). Se for o último, você poderá consultar facilmente objetos
QGsVector-
e carregadosQGsRasterlayer
, olhando para o registro do QGIS MapLayer.Em geral, todas as camadas devem ter uma fonte em algum lugar no disco rígido, mesmo que o resultado seja adicionado apenas após um alg de processamento concluir seus cálculos. Se você examinar os metadados das camadas, poderá encontrar a fonte real de uma camada (se originada do processamento normalmente estiver em algum lugar de uma pasta temporária)
fonte
getLayersByName
função para o registro do mapa, mas quero executar o algoritmo a partir do console, para que isso realmente não ajude (a camada de memória nunca é carregada no registro, é isso que estou tentando fazer) . Mas você está dizendo que não há vantagem em usar uma saída de memória comparada à passagemNone
e geração de um arquivo temporário? Você tem certeza sobre isso?None
é passado apenas se a camada não puder ser encontrada no registro. Ele não cria um arquivo temporário e você precisa procurá-lo manualmente de qualquer maneira. Eu uso essa função para consultar camadas carregadas no QGIS. Não posso ajudá-lo fora no console.None
paraprocessing.runalg
como o parâmetro de saída, que acredito criar um arquivo de saída temporário.mapLayersByName