Menggunakan lapisan vektor dalam memori dengan pemrosesan QGIS / SEXTANTE

10

Saya mencoba menjalankan qgis:clipalgoritme dari konsol, tetapi saya mendapatkan kesalahan saat menggunakan lapisan dalam memori sebagai parameter overlay. Apakah ini yang diharapkan, atau saya melakukan sesuatu yang salah?

Kode:

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

Dalam kode di atas, self.output_layerdan layerobjek layer vektor (QgsVectorLayer - yang tepat, diambil dari shapefile pada disk), self.output_layer_pathadalah objek string python dengan path.

Inilah kesalahan yang saya dapatkan:

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

Jika saya mengubah panggilan pemrosesan saya ke yang berikut, ini berjalan tanpa kesalahan:

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

Juga, jika ada bantuan, ini adalah algoritme yang gagal karena masuk log 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
sumber
1
Ini mungkin diharapkan karena alat perlu mengatasi lapisan fisik pada hard-drive. Hanya sebuah ide, tetapi mengapa Anda tidak mencoba sementara waktu untuk menyimpan layer Anda ke file sementara (Jika Anda memerlukan lokasi import tempfiledan tempfile.gettempdir). Beginilah cara pemrosesan qgis bekerja
Curlew
Saya akan, jika saya harus .. Hanya lebih mudah dan lebih bersih untuk bekerja dalam memori untuk lapisan seperti ini. Jika Anda yakin itu diharapkan, posting sebagai jawaban dan saya dapat menerimanya.
Oystein

Jawaban:

12

Ternyata, ini berfungsi dengan baik selama Anda menambahkan lapisan memori ke daftar isi sebelum menggunakannya. Tampaknya dataobjects.getObjectFromUrifungsi dalam sumber QGIS tidak dapat menanganinya sebaliknya.

Jadi, berikut ini bekerja dengan sangat baik:

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

Juga lihat pertanyaan terakhir saya untuk bagaimana menggunakan lapisan memori sebagai output dari fungsi pemrosesan (pada dasarnya gunakan processing.runandloadbukan processing.runalg).

Oystein
sumber