Saya sedang membangun plugin QGIS yang terhubung ke database MySQL di jaringan lokal, dan kemudian menambahkan subset dari salah satu tabel ke lapisan dalam memori; subset didasarkan pada mata uang data (hanya mengambil pengamatan terbaru untuk setiap lokasi di mana pengukuran dilakukan). Lapisan memori ini berhasil dibuat.
Namun saya kemudian ingin menjalankan beberapa algoritma geoprocessing, dan saya mengalami kesulitan menggunakan lapisan dalam memori di salah satu dari mereka.
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
Tidak ada pengecualian yang dinaikkan, tetapi tidak ada output yang dihasilkan atau ditambahkan ke TOC, tetapi log berikut dibuat di 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|
Bagian yang penting tampaknya FAILURE: Source datasource is not specified.
Namun self.vlayer.isValid() == True
, jadi saya tidak melihat apa yang salah dengan masukan saya. Saya telah mencoba mengganti self.vlayer
dengan 'memory:scratch'
dalam panggilan untuk processing.runandload
, tapi kemudian saya mendapatkan error berikut dicetak ke konsol (tapi tidak mengangkat): Error: Wrong parameter value: memory:scratch
.
Saya mendapatkan masalah yang sama ketika menjalankan ini melalui GUI QGIS, dan menggunakan menu dropdown untuk memilih scratch
layer saya yang ada di TOC. Ini terjadi apakah saya menentukan raster output sebagai di memori atau menentukan lokasi pada disk.
Pertanyaan ini tampaknya serupa, tetapi solusi mereka adalah menambahkan lapisan memori ke TOC sebelum menggunakannya. Saya sudah melakukan itu dan kesalahan tetap ada.
Saya pikir ini adalah masalah umum dengan lapisan memori dan algoritma geoprosesing QGIS, tetapi berikut ini berfungsi tanpa masalah:
processing.runandload("qgis:fixeddistancebuffer",self.vlayer, 500, 5, True, "output_buffer.shp")
Apa yang saya lakukan salah? Mengapa dataset sumber memori saya tidak dapat "ditentukan" di beberapa algoritma pemrosesan?
EDIT: inilah kode sumber dari gdalogr:gridinvdist
apakah itu berguna.