Uso de capa vectorial en memoria con procesamiento QGIS / SEXTANTE

10

Estoy tratando de ejecutar el qgis:clipalgoritmo desde la consola, pero obtengo un error al usar una capa en memoria como parámetro de superposición. ¿Es esto de esperar o estoy haciendo algo mal?

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

En el código anterior, self.output_layery layerson objetos de capa vectorial (QgsVectorLayer - los propios, cargados de archivos de forma en el disco), self.output_layer_pathes un objeto de cadena de Python con una ruta.

Aquí está el error que recibo:

"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 cambio mi llamada de procesamiento a la siguiente, se ejecuta sin error:

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

Además, si es de alguna ayuda, este es el algoritmo que falla ya que está registrado en 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
fuente
1
Probablemente se espera ya que la herramienta necesita abordar una capa física en el disco duro. Es solo una idea, pero ¿por qué no intentas guardar temporalmente tu capa en un archivo temporal? (Si necesitas una ubicación import tempfiley tempfile.gettempdir). Así es como funciona el procesamiento de qgis de todos modos
Curlew
Lo haré, si es necesario. Simplemente más fácil y limpio trabajar en la memoria para capas como estas. Si está seguro de que se espera, publíquelo como respuesta y puedo aceptarlo.
Oystein

Respuestas:

12

Como resultado, esto funciona bien siempre que agregue la capa de memoria a la tabla de contenido antes de usarla. Parece que la dataobjects.getObjectFromUrifunción en la fuente QGIS no puede manejarlo de otra manera.

Entonces lo siguiente funciona muy bien:

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

También vea mi pregunta reciente sobre cómo usar las capas de memoria como salida de las funciones de procesamiento (básicamente usar en processing.runandloadlugar de processing.runalg).

Oystein
fuente