QGIS işleme algoritmalarında bellek katmanları kullanmak mümkün müdür?


12

Yerel ağdaki bir MySQL veritabanına bağlanan ve daha sonra bir bellek katmanına tablolardan birinin bir alt kümesini ekleyen bir QGIS eklentisi inşa ediyorum; alt küme veri para birimini temel alır (yalnızca ölçümlerin yapıldığı her konum için en son gözlemi alır). Bu bellek katmanı başarıyla oluşturuldu.

Ancak daha sonra bazı geoprocessing algoritmaları çalıştırmak istiyorum ve bunların herhangi birinde bellek içi katmanı kullanarak sorun yaşıyorum.

    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

İstisna oluşturulmaz, ancak TOC'ye herhangi bir çıktı üretilmez veya eklenmez, ancak aşağıdaki günlük yapılır 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|

Önemli kısmı FAILURE: Source datasource is not specified.Ancak görünüyor self.vlayer.isValid() == True, bu yüzden girdi ile neyin yanlış olduğunu görmüyorum. Ben yerine çalıştı gelmiş self.vlayerolan 'memory:scratch'çağrısında processing.runandloadama sonra aşağıdaki hata konsoluna basılmış (ancak yükseltilmiş değil) olsun: Error: Wrong parameter value: memory:scratch.

Bu sorunu QGIS GUI aracılığıyla çalıştırırken ve açılır menüde TOC'de bulunan scratchkatmanımı seçmek için de aynı sorunu alıyorum . Bu, çıkış rasterini bellekte veya diskte bir konum belirlesem de oluşur.

Bu soru benzer görünüyor, ancak çözümleri kullanmadan önce bellek katmanını TOC'ye eklemekti. Bunu zaten yapıyorum ve hata devam ediyor.

Bunun bellek katmanları ve QGIS coğrafi işlem algoritmaları ile ilgili genel bir sorun olduğunu düşündüm, ancak aşağıdakiler sorunsuz çalışıyor:

processing.runandload("qgis:fixeddistancebuffer",self.vlayer, 500, 5, True, "output_buffer.shp")

Neyi yanlış yapıyorum? Bellek kaynağı veri kümem neden bazı işleme algoritmalarında "belirtilemiyor"?

EDIT: işte yararlı olup olmadığının kaynak kodugdalogr:gridinvdist .

Yanıtlar:


4

Bellek katmanları GDAL / OGR işleme komut dosyaları için girdi olarak kullanılamıyor gibi görünüyor çünkü İşlem ogr2ogr ile kullanım için verileri düzgün şekilde hazırlayamıyor. Bu nedenle, örneğin, QGIS arabellek aracı çalışır, ancak GDAL / OGR arabellek aracı başarısız olur:

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

İşleme bir şekilde verileri hazırlamalı (bir dosyaya kaydetmeli) ve daha sonra GDAL / OGR aracına beslemelidir.

Bilet açtım: OGR araçlarıyla bellek katmanları kullanılamıyor


2

Http://docs.qgis.org/2.14/es/docs/user_manual/processing/console.html belgelerinde açıklandığı gibi bu doğru yoldur

bir sonraki kod, son yüklendiği dışında bellekte çalışır

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

process.runalg bu durumda bir sözlük döndürür : r.drain ")

dönüş

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>

bu durumda anahtar çıktıdır , büyük harfle veya büyük harfle yazmanız gereken büyük harfle dikkat edin, bu durumda sermaye değil


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.