QGIS işleme / SEXTANTE ile bellek içi vektör katmanı kullanma


10

qgis:clipKonsoldan algoritmayı çalıştırmaya çalışıyorum , ancak overlay parametresi olarak bir bellek içi katman kullanırken bir hata alıyorum. Bu beklenecek mi yoksa yanlış bir şey mi yapıyorum?

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

Yukarıdaki kodda self.output_layerve layervektör katmanı nesneleri (QgsVectorLayer - diskteki şekil dosyalarından yüklenen uygun olanlar), self.output_layer_pathyolu olan bir python dize nesnesidir.

İşte hata alıyorum:

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

İşleme çağrımı aşağıdaki şekilde değiştirirsem, hatasız çalışır:

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

Ayrıca, herhangi bir yardım varsa, işleme_qgis.log girişinde başarısız algoritma:

processing.runalg("qgis:clip","C:/path/to/shapefile.shp|layerid=0|subset=CONTINENT = 
    'Europe'","Polygon?crs=epsg:4326","C:/path/to/output")

1
Muhtemelen, aracın sabit sürücüdeki fiziksel bir katmanı ele alması gerekir. Sadece bir fikir, ama neden geçici olarak katmanınızı geçici bir dosyaya kaydetmeye çalışmıyorsunuz (bir konuma ihtiyacınız varsa import tempfileve tempfile.gettempdir). Qgis-işleme bu şekilde çalışır
Curlew

Yapmam gerekecekse .. Böyle katmanlar için bellekte çalışmak daha kolay ve temiz. Beklendiğinden eminseniz, yanıt olarak gönderin ve kabul edebilirim.
Oystein

Yanıtlar:


12

Anlaşıldığı gibi, kullanmadan önce bellek katmanını içindekiler tablosuna eklediğiniz sürece bu iyi çalışır. dataobjects.getObjectFromUriQGIS kaynağındaki fonksiyon başka türlü işleyemiyor gibi görünüyor .

Yani aşağıdakiler çok iyi çalışıyor:

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

Ayrıca, bellek katmanlarının işleme işlevlerinden çıktı olarak nasıl kullanılacağına dair son soruma bakın (temelde processing.runandloadbunun yerine kullanın processing.runalg).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.