ข้อกำหนดทั่วไปใน GIS คือการใช้เครื่องมือประมวลผลกับไฟล์จำนวนหนึ่งหรือใช้กระบวนการสำหรับคุณสมบัติจำนวนหนึ่งในไฟล์หนึ่งไปยังไฟล์อื่น
การดำเนินการส่วนใหญ่เหล่านี้ขนานกันอย่างน่าอายซึ่งผลลัพธ์ของการคำนวณไม่ได้มีอิทธิพลต่อการดำเนินการอื่นใดในลูป ไม่เพียงแค่นั้น แต่บ่อยครั้งที่ไฟล์อินพุตนั้นแตกต่างกันไป
เคสแบบคลาสสิกคือไฟล์แบบเรียงต่อกันออกจากไฟล์ที่มีรูปหลายเหลี่ยมเพื่อคลิป
นี่คือวิธีการแบบคลาสสิก (ทดสอบ) เพื่อให้ได้สิ่งนี้ในสคริปต์ไพ ธ อนสำหรับ QGIS (fyi การส่งออกของไฟล์หน่วยความจำชั่วคราวไปยังไฟล์จริงมากกว่าครึ่งเวลาในการประมวลผลไฟล์ทดสอบของฉัน)
import processing
import os
input_file="/path/to/input_file.shp"
clip_polygons_file="/path/to/polygon_file.shp"
output_folder="/tmp/test/"
input_layer = QgsVectorLayer(input_file, "input file", "ogr")
QgsMapLayerRegistry.instance().addMapLayer(input_layer)
tile_layer = QgsVectorLayer(clip_polygons_file, "clip_polys", "ogr")
QgsMapLayerRegistry.instance().addMapLayer(tile_layer)
tile_layer_dp=input_layer.dataProvider()
EPSG_code=int(tile_layer_dp.crs().authid().split(":")[1])
tile_no=0
clipping_polygons = tile_layer.getFeatures()
for clipping_polygon in clipping_polygons:
print "Tile no: "+str(tile_no)
tile_no+=1
geom = clipping_polygon.geometry()
clip_layer=QgsVectorLayer("Polygon?crs=epsg:"+str(EPSG_code)+\
"&field=id:integer&index=yes","clip_polygon", "memory")
clip_layer_dp = clip_layer.dataProvider()
clip_layer.startEditing()
clip_layer_feature = QgsFeature()
clip_layer_feature.setGeometry(geom)
(res, outFeats) = clip_layer_dp.addFeatures([clip_layer_feature])
clip_layer.commitChanges()
clip_file = os.path.join(output_folder,"tile_"+str(tile_no)+".shp")
write_error = QgsVectorFileWriter.writeAsVectorFormat(clip_layer, \
clip_file, "system", \
QgsCoordinateReferenceSystem(EPSG_code), "ESRI Shapefile")
QgsMapLayerRegistry.instance().addMapLayer(clip_layer)
output_file = os.path.join(output_folder,str(tile_no)+".shp")
processing.runalg("qgis:clip", input_file, clip_file, output_file)
QgsMapLayerRegistry.instance().removeMapLayer(clip_layer.id())
สิ่งนี้จะใช้ได้ยกเว้นไฟล์อินพุตของฉันคือ 2GB และไฟล์รูปหลายเหลี่ยมรูปวาดมีรูปหลายเหลี่ยมมากกว่า 400 รูป กระบวนการที่เกิดขึ้นใช้เวลาหนึ่งสัปดาห์ในเครื่อง quad core ของฉัน ทั้งหมดในขณะที่สามแกนเป็นเพียงการทำงาน
ทางออกที่ฉันมีอยู่ในหัวของฉันคือการส่งออกกระบวนการไปยังไฟล์สคริปต์และเรียกใช้แบบอะซิงโครนัสโดยใช้ gnu parallel ตัวอย่างเช่น อย่างไรก็ตามดูเหมือนว่าน่าละอายที่จะต้องเลื่อนออกจาก QGIS ไปสู่โซลูชั่นเฉพาะของ OS แทนที่จะใช้สิ่งที่มีมาจาก QGIS python ดังนั้นคำถามของฉันคือ:
ฉันสามารถขนานการดำเนินงานทางภูมิศาสตร์แบบขนานที่น่าอับอายใน python QGIS ได้หรือไม่?
ถ้าไม่เช่นนั้นอาจมีบางคนที่มีรหัสเพื่อส่งงานประเภทนี้ไปยังสคริปต์เชลล์แบบอะซิงโครนัส?