Muchos algoritmos de procesamiento tienen una opción para guardar la salida como memoria. Si se ejecutó desde la caja de herramientas, esto funciona bien, porque puede marcar la casilla "Abrir archivo de salida después de ejecutar el algoritmo".
Mirando el código fuente de QGIS, el código para cargar la capa de memoria parece estar definido en la función Postprocessing.handleAlgorithmResults
. La función utiliza el acceso a una alg.outputs
lista y hace lo siguiente:
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:
# ...
Cuando ejecuta algoritmos de procesamiento desde la consola, ¿hay alguna forma de cargar la capa sin acceso a este objeto? puedo correr
processing.runalg("qgis:intersection", layer1, layer2, "memory:")
o incluso
processing.runalg("qgis:intersection", layer1, layer2, "memory:myLayerName")
Sin embargo, no puedo encontrar una manera de obtener el resultado resultante.
QgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]
intente esto:QgsMapLayerRegistry.instance().mapLayers()
es la forma correcta, se explica en la documentación http://docs.qgis.org/2.14/es/docs/user_manual/processing/console.html
el siguiente código funciona en la memoria todo excepto el último que es carga
el
processing.runalg
devuelve un diccionario en este casobu['OUTPUT']
.OUTPUT
ES LA CLAVE, y el valor es un camino temporal. Puede ver la clave con processeing.alghelp ("procesamiento de nombres") como procesamiento, alghelp ("grass: r.drain")regreso
en este caso la clave es la salida , tenga cuidado con las letras mayúsculas que debe escribir en mayúscula o sin mayúscula, en este caso no mayúscula.
fuente
output['OUTPUT']
camino aQgsVectorLayer
con unaprovider_name
de"ogr"
. Esto se leerá en la ruta .shp y creará una capa en memoria. Este enfoque no agrega la capa al registro, por lo que no parpadea en el Panel de capas.No estoy seguro de si esto lo ayudará en su contexto (¿desea ejecutar su código de forma independiente o dentro de QGIS después de que termine un algoritmo de procesamiento?). Si es lo último, puede consultar fácilmente objetos
QGsVector-
yQGsRasterlayer
objetos cargados al buscar en el registro QGIS MapLayer.En general, todas las capas deben tener una fuente en algún lugar del disco duro, incluso si el resultado se acaba de agregar después de que un alg-tratamiento termine sus cálculos. Si observa los metadatos de las capas, puede encontrar la fuente real de una capa (si se origina del procesamiento normalmente está en algún lugar de una carpeta temporal)
fuente
getLayersByName
función para el registro del mapa, pero quiero ejecutar el algoritmo desde la consola, así que esto realmente no ayudará (la capa de memoria nunca se carga en el registro, eso es lo que estoy tratando de hacer) . ¿Pero estás diciendo que no hay ninguna ventaja en usar una salida de memoria en comparación con pasarNone
y generar un archivo temporal? ¿Estás seguro de eso?None
solo se pasa si la capa no se puede encontrar en el registro. No crea un archivo temporal y de todos modos debe verificarlo manualmente. Utilizo esta función para consultar capas cargadas dentro de QGIS. No puedo ayudarte afuera en la consola.None
aprocessing.runalg
como el parámetro de salida, que creo que crea un archivo de salida temporal.mapLayersByName