Використання векторного шару пам'яті з обробкою 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

Крім того, якщо це допоможе, це невдалий алгоритм, коли він увійшов до файлу Process_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
Це, ймовірно, очікується, оскільки інструменту потрібно вирішити фізичний рівень на жорсткому диску. Просто ідея, але чому б ви тимчасово не спробували зберегти ваш шар у тимчасовому файлі (Якщо вам потрібно розташування 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).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.