Verwendung der speicherinternen Vektorschicht mit QGIS-Verarbeitung / SEXTANTE

10

Ich versuche, den qgis:clipAlgorithmus von der Konsole aus auszuführen , erhalte jedoch eine Fehlermeldung, wenn eine In-Memory-Schicht als Overlay-Parameter verwendet wird. Ist das zu erwarten oder mache ich etwas falsch?

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

In dem obigen Code, self.output_layerund layersind Vektorschicht - Objekte (QgsVectorLayer - richtig diejenigen, von Shape - Dateien auf der Festplatte geladen werden ), self.output_layer_pathist ein Python - String - Objekt mit einem Pfad.

Hier ist der Fehler, den ich bekomme:

"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'

Wenn ich meinen Verarbeitungsaufruf wie folgt ändere, wird er fehlerfrei ausgeführt:

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

Wenn dies hilfreich ist, ist dies auch der fehlerhafte Algorithmus, da er in process_qgis.log protokolliert wird:

processing.runalg("qgis:clip","C:/path/to/shapefile.shp|layerid=0|subset=CONTINENT = 
    'Europe'","Polygon?crs=epsg:4326","C:/path/to/output")
Oystein
quelle
1
Dies wird wahrscheinlich erwartet, da das Tool eine physische Schicht auf der Festplatte adressieren muss. Nur eine Idee, aber warum versuchen Sie nicht vorübergehend, Ihre Ebene in einer temporären Datei zu speichern (wenn Sie einen Speicherort benötigen import tempfileund tempfile.gettempdir). So funktioniert die QGIS-Verarbeitung sowieso
Curlew
Ich werde, wenn ich muss ... Einfacher und sauberer, um für solche Schichten im Speicher zu arbeiten. Wenn Sie sicher sind, dass es erwartet wird, posten Sie es als Antwort und ich kann es akzeptieren.
Oystein

Antworten:

12

Wie sich herausstellt, funktioniert dies einwandfrei, solange Sie die Speicherebene zum Inhaltsverzeichnis hinzufügen, bevor Sie sie verwenden. Es scheint, dass die dataobjects.getObjectFromUriFunktion in der QGIS-Quelle nicht anders damit umgehen kann.

Folgendes funktioniert also sehr gut:

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

Siehe auch meine aktuelle Frage zur Verwendung von Speicherebenen als Ausgabe von Verarbeitungsfunktionen (im Grunde genommen processing.runandloadanstelle von processing.runalg).

Oystein
quelle