जीआईएस में एक सामान्य आवश्यकता एक प्रोसेसिंग टूल को कई फाइलों में लगाने या एक फाइल में एक फाइल में दूसरी सुविधाओं के लिए एक प्रक्रिया लागू करने की है।
इनमें से अधिकांश ऑपरेशन शर्मनाक रूप से समानांतर हैं कि गणना के परिणाम किसी भी तरह से लूप में किसी अन्य ऑपरेशन को प्रभावित नहीं करते हैं। इतना ही नहीं बल्कि अक्सर इनपुट फाइलें प्रत्येक विशिष्ट होती हैं।
बिंदु में एक क्लासिक मामला है, फाइलों को पॉलीगनों से युक्त करने के लिए उनके खिलाफ क्लिप करने के लिए आकार की फाइलों के बाहर टाइलिंग।
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+ पॉलीगॉन हैं। परिणामी प्रक्रिया को मेरी क्वाड कोर मशीन पर एक सप्ताह से अधिक समय लगता है। जबकि सभी तीन कोर सिर्फ सुस्ती हैं।
मेरे पास जो समाधान मेरे सिर में है, वह प्रक्रिया को स्क्रिप्ट फ़ाइलों में निर्यात करने और उदाहरण के लिए ग्नू समानांतर का उपयोग करते हुए उन्हें अतुल्यकालिक रूप से चलाने के लिए है। हालाँकि यह QGIS से बाहर निकलने के लिए एक OS विशिष्ट समाधान में QGIS से बाहर निकलने के लिए शर्म की बात है, QGIS अजगर के लिए कुछ देशी का उपयोग करें। तो मेरा सवाल है:
क्या मैं अजगर QGIS के अंदर शर्मनाक ढंग से समानांतर भौगोलिक संक्रियाओं को समानांतर कर सकता हूं?
यदि नहीं, तो शायद किसी के पास पहले से ही अतुल्यकालिक खोल लिपियों के लिए इस तरह के काम को भेजने के लिए कोड है?