Usando camada vetorial na memória com processamento QGIS / SEXTANTE

10

Estou tentando executar o qgis:clipalgoritmo no console, mas estou recebendo um erro ao usar uma camada na memória como parâmetro de sobreposição. Isso é de se esperar, ou estou fazendo algo errado?

Código:

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

No código acima, self.output_layere layersão objetos da camada de vetor (QgsVectorLayer - objetos próprios, carregados a partir de shapefiles no disco), self.output_layer_pathé um objeto de string python com um caminho.

Aqui está o erro que estou recebendo:

"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 eu alterar minha chamada de processamento para a seguinte, ela será executada sem erros:

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

Além disso, se houver alguma ajuda, este é o algoritmo com falha, pois está logado 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
fonte
1
Provavelmente, é esperado que a ferramenta precise endereçar uma camada física no disco rígido. Apenas uma idéia, mas por que você não tenta salvar temporariamente a camada em um arquivo temporário (se você precisar de um local import tempfilee tempfile.gettempdir). Isto é como qgis de processamento funciona assim mesmo
maçarico
Eu vou, se for preciso .. Apenas mais fácil e mais limpo para trabalhar na memória para camadas como estas. Se você tem certeza de que isso é esperado, poste-o como resposta e eu posso aceitá-lo.
Oystein

Respostas:

12

Como se vê, isso funciona bem desde que você adicione a camada de memória ao índice antes de usá-lo. Parece que a dataobjects.getObjectFromUrifunção na fonte QGIS não pode lidar com isso de outra maneira.

Portanto, o seguinte funciona muito bem:

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

Veja também minha pergunta recente sobre como usar as camadas de memória como saída das funções de processamento (basicamente use em processing.runandloadvez de processing.runalg).

Oystein
fonte