การใช้เลเยอร์เวกเตอร์ในหน่วยความจำพร้อมการประมวลผล 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เป็นวัตถุสตริงหลามที่มีเส้นทาง

นี่คือข้อผิดพลาดที่ฉันได้รับ:

"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 ทำงานต่อไป
Curlew

ฉันจะถ้าฉันต้อง .. ง่ายกว่าและสะอาดกว่าในการทำงานในหน่วยความจำสำหรับเลเยอร์เช่นนี้ หากคุณแน่ใจว่าคาดว่าจะโพสต์เป็นคำตอบและฉันสามารถยอมรับได้
Oystein

คำตอบ:


12

เมื่อเปิดใช้งานจะทำงานได้ดีตราบใดที่คุณเพิ่มเลเยอร์หน่วยความจำลงในสารบัญก่อนใช้งาน ดูเหมือนว่าdataobjects.getObjectFromUriฟังก์ชั่นในแหล่ง QGIS ไม่สามารถจัดการได้

ดังนั้นต่อไปนี้ใช้งานได้ดีมาก:

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.