Wie lade ich die Speicherausgabe der QGIS-Verarbeitung?


11

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.outputsListe 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.

Antworten:


15

Aaaund ich habe es gefunden. Verwenden Sie processing.runandloaddiese Option, um die Ausgabeebene nach dem Ausführen des Algorithmus in das Inhaltsverzeichnis zu laden.

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
Ich bin fasziniert von der Antwort, die Sie gefunden haben. Wissen Sie, ob es eine ähnliche Möglichkeit gibt, eine Speicherschicht zu erstellen - und darauf zugreifen zu können, ohne runandload zu implementieren? Ich hoffe, dass ich einige Nachbearbeitungen an der Verarbeitungsausgabe vornehmen kann, bevor ich sie der Leinwand hinzufüge - und frage mich, ob dies überhaupt möglich ist ...
Katalpa

1
Ich konnte damals keinen finden, um nicht zu sagen, dass es unmöglich ist ... Ich denke, Sie könnten ihn laden und verstecken, wenn das hilft.
Oystein

Wenn Sie den Ebenennamen nicht finden können, QgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]versuchen Sie Folgendes:QgsMapLayerRegistry.instance().mapLayers()
Mr. Che

@Katalpa können Sie versuchen, verarbeiten.runalg ("qgis: Kreuzung", Ebene1, Ebene2, 'out.shp')
Drama

4

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

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])

das processing.runalggibt einen Wörterbuch in diesem Fall bu['OUTPUT']. OUTPUTIST 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

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>

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.


Bitte vermeiden Sie doppelte Antworten ( gis.stackexchange.com/a/211730/8104 ) gemäß den Stack Exchange-Richtlinien. Weitere Details: meta.stackexchange.com/q/104227
Aaron

Dies war derjenige, der letztendlich für mich funktioniert hat. Die Schlüsselinformation, die an anderer Stelle fehlte, war, dass Sie den output['OUTPUT']Pfad QgsVectorLayermit einem provider_namevon ü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.
Nick K9

Laut der Handbuchseite, auf die Sie verweisen, "gibt die runalg-Methode ein Wörterbuch mit den Ausgabenamen (die in der Algorithmusbeschreibung gezeigt sind) als Schlüssel und den Dateipfaden dieser Ausgaben als Werte zurück." Dieser Ansatz scheint also keine Speicherebenen zu verwenden - alle Zwischenergebnisse werden im Dateisystem gespeichert.
Håvard Tveite

0

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-und QGsRasterlayerObjekte einfach abfragen, indem Sie in die QGIS MapLayer-Registrierung schauen.

# 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

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).


Vielen Dank für Ihre Antwort. Ich denke, es gibt bereits eine getLayersByNameFunktion 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 Übergeben Noneund Generieren einer temporären Datei hat? Bist du dir da sicher?
Oystein

Nonewird 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.
Brachvogel

Ich glaube , Sie falsch verstanden, ich sprach über die Weitergabe Nonean processing.runalgals Output - Parameter, die ich glaube , eine temporäre Ausgabedatei erstellt.
Oystein

Zu Ihrer Information: Ich bin gerade wieder auf die QgsMapLayerRegistry-Funktion gestoßen, sie heißtmapLayersByName
Oystein
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.