Viele Verarbeitungsalgorithmen bieten die Möglichkeit, die Ausgabe als Speicher zu speichern. Wenn es von der Toolbox ausgeführt wird, funktioniert dies einwandfrei, da Sie das Kontrollkästchen "Ausgabedatei nach dem Ausführen des Algorithmus öffnen" aktivieren können.
Betrachtet man den Quellcode für QGIS, so scheint der Code zum Laden der Speicherschicht in der Funktion definiert zu sein Postprocessing.handleAlgorithmResults
. Die Funktion verwendet den Zugriff auf eine alg.outputs
Liste und führt folgende Aktionen aus:
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:
# ...
Gibt es eine Möglichkeit, die Ebene ohne Zugriff auf dieses Objekt zu laden, wenn Sie Verarbeitungsalgorithmen über die Konsole ausführen? Ich kann rennen
processing.runalg("qgis:intersection", layer1, layer2, "memory:")
oder auch
processing.runalg("qgis:intersection", layer1, layer2, "memory:myLayerName")
Ich kann jedoch keinen Weg finden, die resultierende Ausgabe zu erfassen.
QgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]
versuchen Sie Folgendes:QgsMapLayerRegistry.instance().mapLayers()
Es ist der richtige Weg, es wird in der Dokumentation http://docs.qgis.org/2.14/es/docs/user_manual/processing/console.html erklärt
Der nächste Code arbeitet mit allen im Speicher, außer dem letzten, der geladen wird
das
processing.runalg
gibt einen Wörterbuch in diesem Fallbu['OUTPUT']
.OUTPUT
IST DER SCHLÜSSEL, und der Wert ist ein temporärer Pfad. Sie können den Schlüssel mit processeing.alghelp ("Namensverarbeitung") als Verarbeitung sehen, alghelp ("grass: r.drain")Rückkehr
In diesem Fall wird der Schlüssel ausgegeben. Achten Sie auf Großbuchstaben, die Sie in Großbuchstaben oder ohne Großbuchstaben schreiben müssen, in diesem Fall nicht in Großbuchstaben.
quelle
output['OUTPUT']
PfadQgsVectorLayer
mit einemprovider_name
von übergeben können"ogr"
. Dadurch wird der .shp-Pfad eingelesen und eine In-Memory-Schicht erstellt. Bei diesem Ansatz wird die Ebene nicht zur Registrierung hinzugefügt, sodass sie im Ebenenbedienfeld nicht blinkt.Ich bin nicht sicher, ob dies Ihnen in Ihrem Kontext helfen wird (möchten Sie Ihren Code nach Abschluss eines Verarbeitungsalgorithmus als eigenständig oder in QGIS ausführen?). In letzterem Fall können Sie geladene Objekte
QGsVector-
undQGsRasterlayer
Objekte einfach abfragen, indem Sie in die QGIS MapLayer-Registrierung schauen.Im Allgemeinen müssen alle Layer irgendwo auf der Festplatte eine Quelle haben, auch wenn das Ergebnis erst hinzugefügt wird, nachdem ein Verarbeitungsalg seine Berechnungen abgeschlossen hat. Wenn Sie sich die Ebenen-Metadaten ansehen, können Sie die tatsächliche Quelle einer Ebene finden (wenn sie aus der Verarbeitung stammt, befindet sie sich normalerweise irgendwo in einem temporären Ordner).
quelle
getLayersByName
Funktion für die Kartenregistrierung, aber ich möchte den Algorithmus von der Konsole aus ausführen, daher hilft dies nicht wirklich (die Speicherschicht wird nie in die Registrierung geladen, das versuche ich zu tun). . Aber sagen Sie, dass die Verwendung einer Speicherausgabe keinen Vorteil gegenüber dem ÜbergebenNone
und Generieren einer temporären Datei hat? Bist du dir da sicher?None
wird nur übergeben, wenn der Layer nicht in der Registrierung gefunden werden kann. Es wird kein Tempfile erstellt, und Sie müssen es trotzdem manuell überprüfen. Ich benutze diese Funktion, um geladene Layer in QGIS abzufragen. Kann dir draußen in der Konsole nicht helfen.None
anprocessing.runalg
als Output - Parameter, die ich glaube , eine temporäre Ausgabedatei erstellt.mapLayersByName