GIS의 일반적인 요구 사항은 처리 도구를 여러 파일에 적용하거나 한 파일의 여러 기능에 대한 프로세스를 다른 파일에 적용하는 것입니다.
이러한 연산의 대부분은 계산 결과가 루프의 다른 연산에 영향을 미치지 않는다는 점에서 당혹스럽게 평행합니다. 뿐만 아니라 종종 입력 파일이 서로 다릅니다.
전형적인 예는 다각형을 포함하는 파일에 대해 모양 파일을 바둑판 식으로 배열하는 것입니다.
다음은 QGIS 용 파이썬 스크립트에서이를 달성하기위한 (테스트 된) 고전적인 절차 적 방법입니다. (임시 메모리 파일의 출력을 실제 파일로 출력하여 테스트 파일 처리 시간을 절반 이상 줄였습니다)
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 개 이상의 다각형이 포함되어있는 것을 제외하고는 괜찮을 것입니다. 결과 프로세스는 쿼드 코어 시스템에서 일주일 이상 걸립니다. 모든 3 개의 코어는 공전 상태입니다.
내 머리 속에있는 해결책은 프로세스를 스크립트 파일로 내보내고 예를 들어 gnu parallel을 사용하여 비동기 적으로 실행하는 것입니다. 그러나 QGIS python 고유의 것을 사용하는 대신 QGIS에서 OS 특정 솔루션으로 빠져 나가는 것이 부끄러운 것 같습니다. 그래서 내 질문은 :
파이썬 QGIS 내부에서 당황스럽게 병렬 지리 작업을 병렬화 할 수 있습니까?
그렇지 않다면 누군가 이런 종류의 작업을 비동기 쉘 스크립트로 보내는 코드가 이미 있습니까?