Использование векторного слоя в памяти с обработкой QGIS / SEXTANTE

10

Я пытаюсь запустить qgis:clipалгоритм из консоли, но получаю сообщение об ошибке при использовании слоя в памяти в качестве параметра наложения. Это следовало ожидать, или я делаю что-то не так?

Код:

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

В приведенном выше коде, self.output_layerи layerявляются объектами векторного слоя (QgsVectorLayer - собственно из них, загруженные из шейпфайлов на диске), self.output_layer_pathявляется Python строка объекта с пути.

Вот ошибка, которую я получаю:

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

Если я изменю свой вызов обработки на следующий, он будет выполнен без ошибок:

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

Кроме того, если есть какая-либо помощь, это ошибочный алгоритм, поскольку он регистрируется в 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
источник
1
Это, вероятно, ожидаемо, поскольку инструмент должен обращаться к физическому уровню на жестком диске. Просто идея, но почему бы вам не попытаться временно сохранить слой во временном файле (если вам нужно местоположение import tempfileи tempfile.gettempdir). Вот как работает qgis-обработка
Curlew
Я сделаю это, если мне придется ... Просто и чище работать в памяти для таких слоев, как эти. Если вы уверены, что это ожидается, опубликуйте это как ответ, и я могу принять это.
Ойстейн

Ответы:

12

Оказывается, это работает нормально, если вы добавляете слой памяти в оглавление перед его использованием. Кажется, что dataobjects.getObjectFromUriфункция в источнике QGIS не может обработать это иначе.

Таким образом, следующее работает очень хорошо:

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

Также см. Мой недавний вопрос о том, как использовать слои памяти в качестве выходных данных от функций обработки (в основном использовать processing.runandloadвместо processing.runalg).

Oystein
источник