¿Es posible usar capas de memoria en algoritmos de procesamiento QGIS?

12

Estoy creando un complemento QGIS que se conecta a una base de datos MySQL en la red local, y luego agrega un subconjunto de una de las tablas a una capa en memoria; el subconjunto se basa en la moneda de datos (solo tomando la observación más reciente para cada ubicación donde se realizan las mediciones). Esta capa de memoria se creó con éxito.

Sin embargo, luego quiero ejecutar algunos algoritmos de geoprocesamiento, y tengo problemas para usar la capa en memoria en cualquiera de ellos.

    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

No se genera ninguna excepción, pero no se produce ni se agrega salida a la tabla de contenido, pero se realiza el siguiente registro en 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.Sin embargo self.vlayer.isValid() == True, la parte importante parece ser , así que no veo lo que está mal con mi entrada. He tratado de sustituir self.vlayercon 'memory:scratch'la llamada a processing.runandload, pero luego me sale el siguiente error impreso en la consola (pero no elevado): Error: Wrong parameter value: memory:scratch.

Tengo el mismo problema al ejecutar esto a través de la GUI de QGIS y al usar el menú desplegable para seleccionar mi scratchcapa que está en la tabla de contenido. Esto ocurre si especifico el ráster de salida como en memoria o si especifico una ubicación en el disco.

Esta pregunta parece similar, pero su solución fue agregar la capa de memoria al TOC antes de usarla. Ya estoy haciendo eso y, sin embargo, el error persiste.

Pensé que esto era un problema general con las capas de memoria y los algoritmos de geoprocesamiento QGIS, pero lo siguiente funciona sin problemas:

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

¿Qué estoy haciendo mal? ¿Por qué no se puede "especificar" el conjunto de datos de mi fuente de memoria en algunos de los algoritmos de procesamiento?

EDITAR: aquí está el código fuente de gdalogr:gridinvdistsi eso es útil.

alphabetasoup
fuente

Respuestas:

4

Parece que las capas de memoria no se pueden usar como entrada para los scripts de procesamiento de GDAL / OGR porque el procesamiento no puede preparar adecuadamente los datos para su uso con ogr2ogr. Es por eso que, por ejemplo, la herramienta de búfer QGIS funciona pero la herramienta de búfer GDAL / OGR falla:

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

El procesamiento tendría que preparar de alguna manera los datos (guardarlos en un archivo) y luego alimentarlos a la herramienta GDAL / OGR.

Abrí un ticket: no se pueden usar capas de memoria con herramientas OGR

bajo oscuro
fuente
2

Esa es la forma correcta, como se explica en la documentación http://docs.qgis.org/2.14/es/docs/user_manual/processing/console.html

el siguiente código funciona en la memoria todo, excepto el último que se carga

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

El procesamiento.runalg devuelve un diccionario en este caso bu ['SALIDA'] LA SALIDA ES LA CLAVE, y el valor es una ruta temporal en la que puede ver la clave con processeing.alghelp ("procesamiento de nombres") como procesamiento, alghelp ("hierba : r.drain ")

regreso

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>

en este caso la clave es la salida , tenga cuidado con la letra mayúscula que debe escribir en mayúscula o sin mayúscula, en este caso no mayúscula

corting
fuente