Có thể sử dụng các lớp bộ nhớ trong thuật toán xử lý QGIS không?


12

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.vlayerbằ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 scratchlớ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:gridinvdistnếu điều đó hữu ích.

Câu trả lời:


4

Có vẻ như các lớp bộ nhớ không thể được sử dụng làm đầu vào cho các tập lệnh xử lý GDAL / OGR vì Xử lý không chuẩn bị đúng dữ liệu để sử dụng với ogr2ogr. Đó là lý do tại sao, ví dụ, công cụ bộ đệm QGIS hoạt động nhưng công cụ bộ đệm GDAL / OGR không thành công:

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 
...

Việc xử lý sẽ phải bằng cách nào đó chuẩn bị dữ liệu (lưu nó vào một tệp) và sau đó đưa dữ liệu đó vào công cụ GDAL / OGR.

Tôi đã mở một vé: Không thể sử dụng các lớp bộ nhớ với các công cụ OGR


2

Đó là cách chính xác, như được giải thích trong tài liệu http://docs.qgis.org/2.14/es/docs/user_manual/ process /console.html

mã tiếp theo hoạt động với tất cả trong bộ nhớ ngoại trừ mã cuối cùng được tải

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

the process.runache trả lại một từ điển trong trường hợp này bu ['OUTPUT'] OUTPUT là chìa khóa và giá trị là một đường dẫn tạm thời mà bạn có thể thấy khóa với processeing.alghelp ("xử lý tên") khi xử lý, alghelp ("cỏ : r.drain ")

trở về

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>

trong trường hợp này, chìa khóa là đầu ra , hãy cẩn thận với chữ in hoa, bạn phải viết hoa hoặc bỏ vốn, trong trường hợp này không phải là vốn


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.