Tôi đang xây dựng một plugin QGIS kết nối với cơ sở dữ liệu MySQL trong mạng cục bộ và sau đó thêm một tập hợp con của một trong các bảng vào một lớp trong bộ nhớ; tập hợp con dựa trên tiền tệ dữ liệu (chỉ thực hiện quan sát gần đây nhất cho từng vị trí thực hiện phép đo). Lớp bộ nhớ này được tạo thành công.
Tuy nhiên, sau đó tôi muốn chạy một số thuật toán xử lý địa lý và tôi gặp sự cố khi sử dụng lớp trong bộ nhớ trong bất kỳ thuật toán nào.
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
Không có ngoại lệ nào được nêu ra, nhưng không có đầu ra nào được tạo ra hoặc thêm vào TOC, nhưng nhật ký sau được thực hiện trong 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|
FAILURE: Source datasource is not specified.
Tuy nhiên self.vlayer.isValid() == True
, phần quan trọng dường như là vậy, vì vậy tôi không thấy có gì sai với đầu vào của mình. Tôi đã thử thay thế self.vlayer
bằng 'memory:scratch'
trong cuộc gọi đến processing.runandload
, nhưng sau đó tôi nhận được lỗi sau được in ra bàn điều khiển (nhưng không được nêu ra) : Error: Wrong parameter value: memory:scratch
.
Tôi gặp vấn đề tương tự khi chạy nó thông qua GUI QGIS và sử dụng menu thả xuống để chọn scratch
lớp của tôi trong TOC. Điều này xảy ra cho dù tôi chỉ định raster đầu ra là trong bộ nhớ hoặc chỉ định vị trí trên đĩa.
Câu hỏi này có vẻ tương tự, nhưng giải pháp của họ là thêm lớp bộ nhớ vào TOC trước khi sử dụng nó. Tôi đã làm điều đó và lỗi vẫn còn.
Tôi nghĩ rằng đây là một vấn đề chung với các lớp bộ nhớ và các thuật toán xử lý địa lý của QGIS, nhưng các công việc sau đây không có vấn đề gì:
processing.runandload("qgis:fixeddistancebuffer",self.vlayer, 500, 5, True, "output_buffer.shp")
Tôi đang làm gì sai? Tại sao bộ dữ liệu nguồn bộ nhớ của tôi không thể "được chỉ định" trong một số thuật toán xử lý?
EDIT: đây là mã nguồn của gdalogr:gridinvdist
nếu điều đó hữu ích.