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.vlayer
con '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 scratch
capa 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:gridinvdist
si eso es útil.