Buduję wtyczkę QGIS, która łączy się z bazą danych MySQL w sieci lokalnej, a następnie dodaje podzbiór jednej z tabel do warstwy w pamięci; podzbiór oparty jest na walucie danych (biorąc najnowszą obserwację dla każdej lokalizacji, w której dokonywane są pomiary). Ta warstwa pamięci została pomyślnie utworzona.
Jednak potem chcę uruchomić algorytmy geoprzetwarzania i mam problem z użyciem warstwy w pamięci w którymkolwiek z nich.
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
Nie jest zgłaszany żaden wyjątek, ale do spisu treści nie jest generowane ani dodawane żadne wyjście, ale zapisywany jest następujący dziennik 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|
Ważną częścią wydaje się być FAILURE: Source datasource is not specified.
jednak self.vlayer.isValid() == True
, więc nie widzę, co jest nie tak z moimi danymi wejściowymi. Próbowałem zastępując self.vlayer
ze 'memory:scratch'
w wywołaniu processing.runandload
, ale potem pojawia się następujący błąd wydrukowany do konsoli (ale nie podniesiony) Error: Wrong parameter value: memory:scratch
.
Ten sam problem pojawia się podczas uruchamiania przez QGIS GUI i przy użyciu menu rozwijanego, aby wybrać moją scratch
warstwę, która jest w spisie treści. Dzieje się tak niezależnie od tego, czy określę wyjściowy raster jako w pamięci, czy też określam lokalizację na dysku.
To pytanie wydaje się podobne, ale ich rozwiązaniem było dodanie warstwy pamięci do spisu treści przed jej użyciem. Już to robię, ale błąd nadal występuje.
Myślałem, że to ogólny problem z warstwami pamięci i algorytmami geoprzetwarzania QGIS, ale następujące działania działają bez problemu:
processing.runandload("qgis:fixeddistancebuffer",self.vlayer, 500, 5, True, "output_buffer.shp")
Co ja robię źle? Dlaczego nie można określić mojego źródła danych pamięci w niektórych algorytmach przetwarzania?
EDIT: oto kod źródłowy z gdalogr:gridinvdist
, czy to pożyteczne.