Utilisation d'une couche vectorielle en mémoire avec le traitement QGIS / SEXTANTE

10

J'essaie d'exécuter l' qgis:clipalgorithme à partir de la console, mais j'obtiens une erreur lors de l'utilisation d'une couche en mémoire comme paramètre de superposition. Est-ce à prévoir ou est-ce que je fais quelque chose de mal?

Code:

mem_layer = QgsVectorLayer("Polygon?crs=epsg:4326", "temp_layer", "memory")
if not mem_layer.isValid(): raise Exception("Failed to create memory layer")            
mem_layer_provider = mem_layer.dataProvider()

clip_polygon = QgsFeature()
clip_polygon.setGeometry(QgsGeometry.fromRect( 
    QgsRectangle(
        self.output_layer.extent().xMinimum() + 10,
        self.output_layer.extent().yMinimum() + 10,
        self.output_layer.extent().xMaximum() - 10,
        self.output_layer.extent().yMaximum() - 10
    )
))
mem_layer_provider.addFeatures([clip_polygon])
mem_layer.updateExtents()

output = self.output_layer_path + "2"
processing.runalg("qgis:clip", layer, mem_layer, output) # Fails

Dans le code ci-dessus, self.output_layeret layersont des objets de couche vectorielle (QgsVectorLayer - ceux appropriés, chargés à partir de fichiers de formes sur le disque), self.output_layer_pathest un objet chaîne python avec un chemin.

Voici l'erreur que j'obtiens:

"C:/OSGEO4~1/apps/qgis/./python/plugins\processing\core\GeoAlgorithm.py", line 150, in     
    execute self.processAlgorithm(progress)
File "C:/OSGEO4~1/apps/qgis/./python/plugins\processing\algs\ftools\Clip.py", line 72, 
    in processAlgorithm index = utils.createSpatialIndex(layerB)
File "C:/OSGEO4~1/apps/qgis/./python/plugins\processing\algs\ftools\FToolsUtils.py", 
    line 31, in createSpatialIndex features = QGisLayers.features(layer)
File "C:/OSGEO4~1/apps/qgis/./python/plugins\processing\core\QGisLayers.py", line 211, 
    in features return Features(layer)
File "C:/OSGEO4~1/apps/qgis/./python/plugins\processing\core\QGisLayers.py", line 218, 
    in __init__ self.iter = layer.getFeatures()
AttributeError: 'NoneType' object has no attribute 'getFeatures'

Si je modifie mon appel de traitement comme suit, il s'exécute sans erreur:

processing.runalg("qgis:clip", layer, self.output_layer, output) # Runs fine

En outre, si vous avez besoin d'aide, il s'agit de l'algorithme défaillant car il est connecté dans processing_qgis.log:

processing.runalg("qgis:clip","C:/path/to/shapefile.shp|layerid=0|subset=CONTINENT = 
    'Europe'","Polygon?crs=epsg:4326","C:/path/to/output")
Oystein
la source
1
Il est probablement attendu car l'outil doit adresser une couche physique sur le disque dur. Juste une idée, mais pourquoi n'essayez-vous pas temporairement d'enregistrer votre calque dans un fichier temporaire (si vous avez besoin d'un emplacement import tempfileet tempfile.gettempdir). Voici comment fonctionne le traitement qgis
Curlew
Je le ferai, si je le dois. Simplement plus simple et plus propre pour travailler en mémoire pour des couches comme celles-ci. Si vous êtes sûr qu'il est attendu, postez-le comme réponse et je peux l'accepter.
Oystein du

Réponses:

12

En fin de compte, cela fonctionne bien tant que vous ajoutez la couche de mémoire à la table des matières avant de l'utiliser. Il semble que la dataobjects.getObjectFromUrifonction de la source QGIS ne puisse pas la gérer autrement.

Donc, ce qui suit fonctionne très bien:

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)
processing.runalg("qgis:clip", layer, mem_layer, output)

Voir également ma question récente pour savoir comment utiliser les couches de mémoire en tant que sortie des fonctions de traitement (essentiellement utiliser processing.runandloadau lieu de processing.runalg).

Oystein
la source