問題描述 - 以一個簡單的arcpy操作為例 - “水文分析中生成streamlink”,進行解釋
批量處理空間數據的時候,一個一個算(串行)實在太慢了,我既沒有耐心也沒有時間,便想著學一下python的并行算法,提高一下數據處理速度。在這里我以一個簡單的arcpy操作為例 - “水文分析中生成streamlink”,進行解釋。讀者可根據自己的需要,自行修改替換。
首先,我們需要定義一個用于數據處理的函數:
def MyStreamLink(Parameters):
#Parameters是一個list,里面存儲著使streamlink運行需要的三個參數
Raster1=Parameters[0]
Raster2=Parameters[1]
outpath=Parameters[2]
print "The program is processing:"+" "os.path.basename(Raster1).split('.')[0] #告訴正在處理哪一個數據
outStreamLink = StreamLink(Raster1, Raster2) #進行streamlink操作需要兩個輸入數據:Raster1是柵格河網,Raster2是流向;outStreamLink是我定義的中間變量,用來儲存結果
outStreamLink.save(outpath) #將結果儲存在路徑outpath里
print os.path.basename(Raster1).split('.')[0]+"has finished." #告訴我哪一個數據已經處理好了
其次,我們需要定義一個主函數:
if __name__ == '__main__':
inws1=r"F:/C_topography/drainage/condition111"
RasterList1 = glob.glob(os.path.join(inws1, "*.tif"))
inws2=r"F:/C_topography/drainage/dir"
RasterList2 = glob.glob(os.path.join(inws2, "*.tif"))
Parameter_1=[]
for Raster1 in RasterList1:
temp1=os.path.basename(Raster1).split('.')[0]
length1=len(temp1)
for Raster2 in RasterList2:
temp2=os.path.basename(Raster2).split('.')[0]
if temp1[0:length1]==temp2:
output_path=r"F:/C_topography/drainage/StreamLinks"
out=output_path+"/"+temp1+".tif"
Parameter_1.append([Raster1,Raster2,out]) #兩個for循環的目的是從文件讀取Parameter_1
mypools=multiprocessing.Pool()
results=mypools.map(MyStreamLink,Parameter_1) #最后將參數列表傳給MyStreamLink這個函數,運行arcpy相關工具,結果返回到results這個列表里
參考文獻
本篇教程主要參考了兩位大神的教程
(1)http://blog.sina.com.cn/s/blog_70728a110102ypuq.html (強烈推薦這個)
(2)http://zhihu.geoscene.cn/article/583
在運行過程中遇見了multiprocessing Attribute Error(識別不了我之前定義的MystreamLink函數,參考https://community.esri.com/t5/python-questions/multiprocessing-attribute-error/td-p/759076)浪費了一些時間,這是因為此并行操作要以文檔的形式整體操作,而不是在python控制行一行一行輸,具體解釋請看https://www.esri.com/arcgis-blog/products/arcgis-desktop/analytics/multiprocessing-with-arcgis-approaches-and-considerations-part-1/?rmedium=blogs_esri_com&rsource=/esri/arcgis/2012/09/26/distributed-processing-with-arcgis-part-1/; 所以各位親們請安裝pycharm運行。
真是汗顏自己的表達能力!!!把問題表達清楚真的不容易,還要繼續修煉!以后慢慢修改吧。
最后再夾帶一些私貨
最近的課余時間都在讀李曉鵬博士的《黃河文明和一帶一路》,前兩卷是關于中國歷史的科普性讀物。作者思路十分新穎,特別是關于明朝太監(東西廠)制度的描述,使我對此有了新的認識。提到王振、汪直、魏忠賢等,我下意識會對他們充滿鄙夷,將其區別于人類。誠然,太監制度是黑暗殘酷、滅絕人性的,但是普通人將對這種制度的鄙夷遷移到可憐的太監身上,恐怕也有點不妥當;其次,東西廠以及錦衣衛相當于明朝的監察機構,起到監督官僚,體察民情,為皇權服務的作用,然而史書是文人官僚書寫的,汪直等人被黑得如此之慘,恐怕正是因為做對了什么事情(比如損害了腐敗官僚的利益?)。有些“老百姓”屁股和腦袋分了家,不把自己當數量更為廣大的“群眾”,總把自己想成“上層人士”,也跟著黑“太監”,殊不知損害自身階級利益的正式那群滿口仁義道德的“東林黨人”。By the way,李博士,恁什么時候出第四卷啊啊啊啊啊!!!