Est-il possible d'utiliser des couches de mémoire dans les algorithmes de traitement QGIS?

12

Je construis un plugin QGIS qui se connecte à une base de données MySQL dans le réseau local, puis ajoute un sous-ensemble de l'une des tables à une couche en mémoire; le sous-ensemble est basé sur la devise des données (en ne prenant que l'observation la plus récente pour chaque emplacement où les mesures sont effectuées). Cette couche mémoire est créée avec succès.

Cependant, je veux ensuite exécuter certains algorithmes de géotraitement et j'ai du mal à utiliser la couche en mémoire dans l'un d'eux.

    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

Aucune exception n'est levée, mais aucune sortie n'est produite ou ajoutée à la table des matières, mais le journal suivant est créé dans 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.Cependant self.vlayer.isValid() == True, la partie importante semble être , donc je ne vois pas ce qui ne va pas avec mon entrée. Je l' ai essayé de remplacer self.vlayeravec 'memory:scratch'dans l'appel à processing.runandload, mais j'obtiens l'erreur suivante imprimé à la console (mais pas élevé): Error: Wrong parameter value: memory:scratch.

J'obtiens le même problème lorsque j'exécute cela via l'interface graphique QGIS et que j'utilise le menu déroulant pour sélectionner ma scratchcouche qui se trouve dans la table des matières. Cela se produit si je spécifie le raster en sortie comme en mémoire ou si je spécifie un emplacement sur le disque.

Cette question semble similaire, mais leur solution a été d'ajouter la couche mémoire à la table des matières avant de l'utiliser. Je le fais déjà et pourtant l'erreur persiste.

Je pensais que c'était un problème général avec les couches de mémoire et les algorithmes de géotraitement QGIS, mais ce qui suit fonctionne sans problème:

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

Qu'est-ce que je fais mal? Pourquoi mon jeu de données source de mémoire ne peut-il pas être "spécifié" dans certains algorithmes de traitement?

EDIT: voici le code source de gdalogr:gridinvdistsi c'est utile.

alphabetasoup
la source

Réponses:

4

Il semble que les couches de mémoire ne puissent pas être utilisées comme entrée pour les scripts de traitement GDAL / OGR car le traitement ne parvient pas à préparer correctement les données à utiliser avec ogr2ogr. C'est pourquoi, par exemple, l'outil de tampon QGIS fonctionne mais l'outil de tampon GDAL / OGR échoue:

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

Le traitement devrait en quelque sorte préparer les données (les enregistrer dans un fichier) puis les alimenter vers l'outil GDAL / OGR.

J'ai ouvert un ticket: impossible d'utiliser des couches de mémoire avec les outils OGR

obscur
la source
2

C'est la bonne façon, comme expliqué dans la documentation http://docs.qgis.org/2.14/es/docs/user_manual/processing/console.html

le prochain code fonctionne avec en mémoire tout sauf le dernier qu'il est chargé

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 retourne un dictionnaire dans ce cas bu ['OUTPUT'] OUTPUT IS THE KEY, et la valeur est un chemin temporaire, vous pouvez voir la clé avec processeing.alghelp ("traitement de nom") comme traitement, alghelp ("herbe : r.drain ")

revenir

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>

dans ce cas la clé est sortie , attention avec majuscule vous devez écrire en majuscule ou sans capital, dans ce cas pas en majuscule

corting
la source