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_layerlayerは、ベクターレイヤーオブジェクト(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")

1
ツールがハードドライブの物理層に対処する必要があるため、それはおそらく予想されます。単なるアイデアですが、レイヤーを一時ファイルに一時的に保存してみませんか(場所import tempfileとが必要な場合tempfile.gettempdir)。これがqgis-processingの動作方法です
Curlew

必要に応じて、このようにします。このようなレイヤーのメモリで作業するのは、より簡単でクリーンです。それが期待どおりであると確信している場合は、回答として投稿してください。
オイスタイン2013年

回答:


12

結局のところ、使用する前にメモリレイヤーを目次に追加する限り、これは問題なく機能します。そうですdataobjects.getObjectFromUriQGISソース内の関数は、それ以外の場合を扱うことができません。

したがって、以下は非常にうまく機能します。

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

また、メモリレイヤーを処理関数からの出力として使用する方法については、最近の質問も参照してください(基本的にのprocessing.runandload代わりに使用processing.runalg)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.