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.vlayer
mit '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 scratch
Ebene 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:gridinvdist
wenn das ist nützlich.