Apakah mungkin menggunakan lapisan memori dalam algoritma pemrosesan QGIS?

12

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.vlayerdengan '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 scratchlayer 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:gridinvdistapakah itu berguna.

alphabetasoup
sumber

Jawaban:

4

Sepertinya lapisan memori tidak dapat digunakan sebagai input untuk skrip pemrosesan GDAL / OGR karena Pemrosesan gagal mempersiapkan data untuk digunakan dengan ogr2ogr dengan benar. Itulah sebabnya, misalnya, alat penyangga QGIS berfungsi tetapi alat penyangga GDAL / OGR gagal:

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

Pemrosesan harus entah bagaimana menyiapkan data (menyimpannya ke file) dan kemudian mengumpannya ke alat GDAL / OGR.

Saya membuka tiket: Tidak bisa menggunakan lapisan memori dengan alat OGR

underdark
sumber
2

Itu adalah cara yang benar, seperti dijelaskan dalam dokumentasi http://docs.qgis.org/2.14/es/docs/user_manual/processing/console.html

kode selanjutnya berfungsi dengan semua kecuali yang terakhir dimuat

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 processing.runalg mengembalikan kamus dalam kasus ini bu ['OUTPUT'] OUTPUT ADALAH KUNCI, dan nilainya adalah jalur temp yang Anda dapat melihat kunci dengan processeing.alghelp ("pemrosesan nama") sebagai pemrosesan, alghelp ("grass : r.drain ")

kembali

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>

dalam hal ini kuncinya adalah output , berhati-hatilah dengan huruf kapital Anda harus menulis dalam modal atau tanpa modal, dalam hal ini bukan modal

corting
sumber