Ist es möglich, Speicherschichten in QGIS-Verarbeitungsalgorithmen zu verwenden?

12

Ich erstelle ein QGIS-Plugin, das eine Verbindung zu einer MySQL-Datenbank im lokalen Netzwerk herstellt, und füge dann einer In-Memory-Schicht eine Teilmenge einer der Tabellen hinzu. Die Teilmenge basiert auf der Datenwährung (wobei nur die aktuellste Beobachtung für jeden Ort, an dem Messungen durchgeführt werden, berücksichtigt wird). Diese Speicherschicht wurde erfolgreich erstellt.

In diesem Fall möchte ich jedoch einige Geoverarbeitungsalgorithmen ausführen, und es treten Probleme bei der Verwendung des In-Memory-Layers auf.

    self.stationuri = "point?crs=epsg:4326&field=id:integer&field={}:double&index=yes".format(self.cb_field.currentText())
    self.vlayer = QgsVectorLayer(self.stationuri,"scratch","memory")
    if not self.vlayer.isValid():
        raise Exception("Failed to create in-memory layer")
    self.vlayer.startEditing()
    for i,r in enumerate(result): # Result is row-by-row result of SQL query
        # Add features
        ...
    self.vlayer.commitChanges()
    self.vlayer.updateExtents()
    # Add layer to map
    QgsMapLayerRegistry.instance().addMapLayer(self.vlayer)
    # Layer is successfully added to map with all features and geometry
    # BELOW IS WHERE IT FALLS APART
    try:
        processing.runandload("gdalogr:gridinvdist",self.vlayer,self.cb_field.currentText(),2,0,0,0,0,0,0,0,'Float32',None) # None = in-memory output; I get the same error if I specify a string path and filename.
    except Exception, e:
        raise e

Es wird keine Ausnahme ausgelöst, aber es wird keine Ausgabe erstellt oder zum Inhaltsverzeichnis hinzugefügt. Das folgende Protokoll wird jedoch erstellt processing.log:

INFO|Mon May 04 2015 11:28:23|GDAL execution console output|/bin/sh: 1: /tmp/processing/bbebe7599c83446d9c2b03a251879657/OUTPUT.tif: not found|/bin/sh: 1: -zfield: not found||FAILURE: Source datasource is not specified.|Usage: gdal_grid [--help-general] [--formats]|    [-ot {Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/|          CInt16/CInt32/CFloat32/CFloat64}]|    [-of format] [-co "NAME=VALUE"]|    [-zfield field_name] [-z_increase increase_value] [-z_multiply multiply_value]|    [-a_srs srs_def] [-spat xmin ymin xmax ymax]|    [-clipsrc <xmin ymin xmax ymax>|WKT|datasource|spat_extent]|    [-clipsrcsql sql_statement] [-clipsrclayer layer]|    [-clipsrcwhere expression]|    [-l layername]* [-where expression] [-sql select_statement]|    [-txe xmin xmax] [-tye ymin ymax] [-outsize xsize ysize]|    [-a algorithm[:parameter1=value1]*]    [-q]|    <src_datasource> <dst_filename>||Available algorithms and parameters with their's defaults:|    Inverse distance to a power (default)|        invdist:power=2.0:smoothing=0.0:radius1=0.0:radius2=0.0:angle=0.0:max_points=0:min_points=0:nodata=0.0|    Moving average|        average:radius1=0.0:radius2=0.0:angle=0.0:min_points=0:nodata=0.0|    Nearest neighbor|        nearest:radius1=0.0:radius2=0.0:angle=0.0:nodata=0.0|    Various data metrics|        <metric name>:radius1=0.0:radius2=0.0:angle=0.0:min_points=0:nodata=0.0|        possible metrics are:|            minimum|            maximum|            range|            count|            average_distance|            average_distance_pts|

Der wichtige Teil scheint zu sein , FAILURE: Source datasource is not specified.aber self.vlayer.isValid() == True, so sehe ich nicht , was mit meiner Eingabe falsch ist. Ich habe versucht , Substitution self.vlayermit 'memory:scratch'in dem Aufruf processing.runandload, aber dann bekomme ich die folgende Fehlermeldung auf die Konsole ausgegeben (aber nicht angehoben): Error: Wrong parameter value: memory:scratch.

Ich bekomme das gleiche Problem, wenn ich dies über die QGIS-Benutzeroberfläche ausführe und über das Dropdown-Menü meine scratchEbene im Inhaltsverzeichnis auswähle . Dies geschieht unabhängig davon, ob ich das Ausgabe-Raster als speicherintern oder als Speicherort auf der Festplatte angebe.

Diese Frage scheint ähnlich zu sein, aber ihre Lösung bestand darin, die Speicherschicht vor der Verwendung zum Inhaltsverzeichnis hinzuzufügen. Ich mache das schon und trotzdem bleibt der Fehler bestehen.

Ich dachte, dass dies ein allgemeines Problem mit Speicherebenen und den QGIS-Geoverarbeitungsalgorithmen ist, aber das Folgende funktioniert problemlos:

processing.runandload("qgis:fixeddistancebuffer",self.vlayer, 500, 5, True, "output_buffer.shp")

Was mache ich falsch? Warum kann mein Speicherquellendatensatz in einigen Verarbeitungsalgorithmen nicht "angegeben" werden?

EDIT: Hier ist der Quellcode von , gdalogr:gridinvdistwenn das ist nützlich.

alphabetasoup
quelle

Antworten:

4

Es scheint, als könnten Speicherschichten nicht als Eingabe für GDAL / OGR-Verarbeitungsskripten verwendet werden, da die Verarbeitung die Daten nicht ordnungsgemäß für die Verwendung mit ogr2ogr vorbereitet. Aus diesem Grund funktioniert beispielsweise das QGIS-Puffer-Tool, das GDAL / OGR-Puffer-Tool schlägt jedoch fehl:

Algorithm Buffer vectors starting...
GDAL command:
cmd.exe /C ogr2ogr.exe "C:\Users\anita\AppData\Local\Temp\processing70e5e0852cb9456ba2e3780f8386122e\86d237c8f41443f58a230a8133172047\OUTPUTLAYER.shp" point?crs=EPSG:4326&memoryid={6772bccd-f55d-461d-aff6-6271ded02eea} point?crs=EPSG:4326&memoryid={6772bccd-f55d-461d-aff6-6271ded02eea} -dialect sqlite -sql "SELECT ST_Buffer( geometry , 1000 ),* FROM 'point?crs=EPSG:4326&memoryid={6772bccd-f55d-461d-aff6-6271ded02eea}' " 
GDAL command output:
FAILURE: 
Unable to open datasource `point?crs=EPSG:4326' with the following drivers. 
-> JP2ECW 
-> OCI 
-> SOSI 
...

Die Verarbeitung müsste die Daten irgendwie vorbereiten (in einer Datei speichern) und sie dann dem GDAL / OGR-Tool zuführen.

Ich habe ein Ticket geöffnet: Mit OGR-Tools können keine Speicherebenen verwendet werden

Underdunkel
quelle
2

Dies ist der richtige Weg, wie in der Dokumentation http://docs.qgis.org/2.14/es/docs/user_manual/processing/console.html erläutert

Der nächste Code arbeitet mit allen im Speicher, außer dem letzten, mit dem er geladen wurde

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

Die Datei processing.runalg gibt in diesem Fall ein Wörterbuch zurück. bu ['OUTPUT'] OUTPUT IST DER SCHLÜSSEL, und der Wert ist ein temporärer Pfad. Sie können den Schlüssel mit processeing.alghelp ("name processing") als processing, alghelp ("grass") ansehen : 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 darauf, dass Sie mit Großbuchstaben oder ohne Großbuchstaben schreiben, in diesem Fall nicht mit Großbuchstaben

corting
quelle