Utilizzo del layer vettoriale in memoria con elaborazione QGIS / SEXTANTE


10

Sto provando a eseguire l' qgis:clipalgoritmo dalla console, ma ricevo un errore quando si utilizza un livello in memoria come parametro overlay. È prevedibile o sto facendo qualcosa di sbagliato?

Codice:

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

Nel codice sopra, self.output_layere layersono oggetti livello vettoriale (QgsVectorLayer - quelli propri, caricati da shapefile su disco), self.output_layer_pathè un oggetto stringa python con un percorso.

Ecco l'errore che sto ricevendo:

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

Se cambio la mia chiamata di elaborazione a quanto segue, viene eseguita senza errori:

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

Inoltre, se di qualsiasi aiuto, questo è l'algoritmo in errore in quanto è registrato in 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")

1
Probabilmente è previsto poiché lo strumento deve affrontare un livello fisico sul disco rigido. Solo un'idea, ma perché non provi temporaneamente a salvare il tuo livello in un file temporaneo (se hai bisogno di una posizione import tempfilee tempfile.gettempdir). Ecco come funziona l'elaborazione qgis
Chiurlo

Lo farò, se devo ... Semplicemente più facile e pulito lavorare in memoria per livelli come questi. Se sei sicuro che sia previsto, pubblicalo come risposta e posso accettarlo.
Oystein,

Risposte:


12

A quanto pare, questo funziona bene fintanto che aggiungi il livello di memoria al sommario prima di usarlo. Sembra che la dataobjects.getObjectFromUrifunzione nella sorgente QGIS non possa gestirla diversamente.

Quindi il seguente funziona molto bene:

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

Vedi anche la mia recente domanda su come usare i livelli di memoria come output dalle funzioni di elaborazione (fondamentalmente usa processing.runandloadinvece di processing.runalg).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.