1、總述
通過使用Map函數,對ArcPy中的GP工具進行少量的改造,從而達到并行化調用的目的。
2、Map函數
在使用ArcPy進行批處理的過程中,雖然簡化了很多手動的操作,但是對于大量重復性的操作并沒有一個效率上的考慮。因此在這一部分通過使用Python自帶的map函數,在講GP工具的函數稍加改造的基礎之上采用并行的方式來提高處理效率。
簡而言之,就是將原本的循環操作,改成map函數可以使用的形式,從而采用并行的方式進行處理。前提是相應的GP工具是支持同時操作,并避免同時寫入的操作等。
Map函數的詳細介紹,參考http://blog.jobbole.com/58700/
3、GP工具改造示例
如下所示為GP工具函數改造的過程,改造起來也比較簡單,將原本GP工具中的函數的參數作為一個列表傳入,對于一些默認的參數可以不傳入,在改造過程中寫死,從而減少不必要的參數。如下圖所示,是對求交函數進行的改造,對于求交函數,一般情況下,必備的參數有兩個需要相交的圖層以及結果圖層。如下圖所示:
# -*- coding: utf-8 -*-
import arcpy
from arcpy import env
from multiprocessing import Pool
# obtains the intersect
def mapIntersect_analysis(d):
print(d)
a = d[0]
b = d[1]
c = d[2]
if arcpy.Exists(c):
arcpy.Delete_management(c)
arcpy.Intersect_analysis ([a,b], c, "ALL", "", "")
return "successful!"
if __name__=="__main__":
# 改成自己的路徑
src = r"H:\tt"
env.workspace = src
workspaceList = arcpy.ListWorkspaces("","FileGDB")
parameters = []
for w in workspaceList:
first = "{0}\\{1}".format(w, 'data01')
second = "{0}\\{1}".format(w, 'data02')
third = "{0}\\{1}".format(w, 'data03')
d = [first,second,third]
parameters.append(d)
pool = Pool(4)
results = pool.map(mapIntersect_analysis,parameters)
# print the results
print(results)
pool.close()
pool.join()