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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.