Korzystanie z wektorowej warstwy w pamięci z przetwarzaniem QGIS / SEXTANTE

10

Próbuję uruchomić qgis:clipalgorytm z konsoli, ale pojawia się błąd podczas używania warstwy w pamięci jako parametru nakładki. Czy należy się tego spodziewać, czy robię coś złego?

Kod:

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

W powyższym kodzie self.output_layeri layersą obiektami warstwy wektorowej (QgsVectorLayer - odpowiednie, ładowane z plików kształtów na dysku), self.output_layer_pathto obiekt ciągu pythonowego ze ścieżką.

Oto błąd, który otrzymuję:

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

Jeśli zmienię moje wywołanie przetwarzania na następujące, działa ono bezbłędnie:

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

Ponadto w przypadku jakiejkolwiek pomocy jest to algorytm, który nie działa, ponieważ jest on logowany w przetwarzaniu_qgis.log:

processing.runalg("qgis:clip","C:/path/to/shapefile.shp|layerid=0|subset=CONTINENT = 
    'Europe'","Polygon?crs=epsg:4326","C:/path/to/output")
Oysteina
źródło
1
Jest to prawdopodobnie oczekiwane, ponieważ narzędzie musi zająć się fizyczną warstwą na dysku twardym. To tylko pomysł, ale dlaczego nie spróbujesz tymczasowo zapisać warstwy w pliku tymczasowym (jeśli potrzebujesz lokalizacji import tempfilei tempfile.gettempdir). Tak właśnie działa przetwarzanie qgis
Curlew
Będę musiał, jeśli będę musiał ... Po prostu łatwiej i łatwiej pracować w pamięci dla takich warstw. Jeśli masz pewność, że jest to oczekiwane, opublikuj je jako odpowiedź, a ja mogę je zaakceptować.
Oystein

Odpowiedzi:

12

Jak się okazuje, działa to dobrze, dopóki dodasz warstwę pamięci do spisu treści przed jej użyciem. Wygląda na to, że dataobjects.getObjectFromUrifunkcja w źródle QGIS nie poradziłaby sobie inaczej.

Więc następujące działa bardzo dobrze:

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

Zobacz także moje ostatnie pytanie, w jaki sposób używać warstw pamięci jako danych wyjściowych z funkcji przetwarzania (w zasadzie użyj processing.runandloadzamiast processing.runalg).

Oysteina
źródło