Một yêu cầu phổ biến trong GIS là áp dụng một công cụ xử lý cho một số tệp hoặc áp dụng một quy trình cho một số tính năng trong một tệp này sang tệp khác.
Phần lớn các hoạt động này song song lúng túng ở chỗ kết quả của các phép tính không ảnh hưởng đến bất kỳ hoạt động nào khác trong vòng lặp. Không chỉ vậy mà thường các tệp đầu vào là mỗi khác biệt.
Một trường hợp kinh điển là việc sắp xếp các tệp hình dạng chống lại các tệp có chứa đa giác để kẹp chúng lại.
Dưới đây là một phương pháp thủ tục cổ điển (đã được thử nghiệm) để đạt được điều này trong tập lệnh python cho QGIS. (fyi đầu ra của các tệp bộ nhớ tạm thời thành các tệp thực hơn một nửa thời gian để xử lý các tệp thử nghiệm của tôi)
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())
Điều này sẽ ổn trừ khi tệp đầu vào của tôi là 2GB và tệp cắt đa giác chứa hơn 400 đa giác. Quá trình kết quả mất hơn một tuần trên máy lõi tứ của tôi. Tất cả trong khi ba lõi chỉ là không hoạt động.
Giải pháp tôi có trong đầu là xuất quy trình ra các tệp script và chạy chúng không đồng bộ bằng cách sử dụng song song gnu. Tuy nhiên, có vẻ xấu hổ khi phải bỏ ra khỏi QGIS vào một giải pháp cụ thể cho hệ điều hành thay vì sử dụng một cái gì đó có nguồn gốc từ con trăn QGIS. Vì vậy, câu hỏi của tôi là:
Tôi có thể song song các hoạt động địa lý song song lúng túng bên trong QGIS trăn không?
Nếu không, thì có lẽ ai đó đã có mã để gửi loại công việc này đến các tập lệnh shell không đồng bộ?