熱線電話:13121318867

登錄
首頁精彩閱讀淺談使用ArcPy執行大數據量處理任務
淺談使用ArcPy執行大數據量處理任務
2017-12-27
收藏

淺談使用ArcPy執行大數據量處理任務

Python功能強大而易于學習。對于ArcGIS for Desktop用戶來講,Python是提高工作效率的不二選擇。

Arcpy是esri提供的用于高效數據處理分析、制圖等的Python站點包。 利用ArcPy,我們可以在ArcMap的Python窗口交互執行腳本,還可以創建自定義腳本工具或腳本工具箱,還可以在ArcGIS之外運行獨立腳本,享受更純正的python體驗。
這一篇說說如何利用Python批量執行數據處理任務,這個問題也是前段時間遇到的用戶的實際問題,比較有價值。
需求
還是從實例開始……
有一個簡單但耗體力的裁剪任務,希望通過大量面分割(逐一裁剪)大量的數據,類似Split工具要完成的任務,并且要按照一定的規則命名將分割結果輸出到指定的位置,例如要求有指定前綴。
實現
例如,一種思路是逐一遍歷面要素,然后去裁剪目標數據再輸出,這時你可能會遇到下面的小問題:
我如何通過ArcPy獲取要素的幾何?
在ArcPy中提供了一個數據訪問模塊/Data Access (arcpy.da),我們可以通過游標(Cursor)來查詢要素的幾何或屬性。在這個需求中是逐一遍歷面要素的幾何,我們選擇 SearchCursor,通過 SHAPE@ 可以訪問要素的幾何。
語法: SearchCursor(in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause})
了解詳細的幫助信息點這里。
那么可以把函數主體定義成這樣,即可實現需求:

def MyBatchClip(Parameter):
    # 參數
    inputFC = Parameter[0]
    ClipArea = Parameter[1]
    OutputWS = Parameter[2]
    Prefix = Parameter[3]
    # 字段列表,SHAPE@ 訪問要素幾何對象
    Fields = ['FID','SHAPE@']
    # 遍歷面要素逐一裁剪目標數據并輸出自定義前綴的結果。
    with arcpy.da.SearchCursor(ClipArea,Fields) as cursor:
        for row in cursor:
            outputFC = os.path.join(OutputWS, Prefix+str(row[0])+'.shp')
            arcpy.Clip_analysis(inputFC, row[1], outputFC)
多進程
如果這個批量任務是大量的,如何更高效地開動起來?
這里按照esri以前的一篇 Blog 提到的方法分享給大家,使用Multiprocessing模塊并行處理。 Multiprocessing 模塊是Python的一個標準庫,通過這個庫,我們可以利用多核CPU,來實現多進程處理大數據量的任務。
可以通過 multiprocessing.Pool 來使用進程池,Pool類可以管理固定數目的進程,默認是開啟和機器CPU數目相同的進程。
    語法:
    multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]])
    processes表示pool中進程的數目,默認地為當前CPU的核數。
    initializer表示新進程的初始化函數。
    initargs表示新進程的初始化函數的參數。
    maxtasksperchild表示每個進程執行task的最大數目
把腳本修改下,加上多進程處理的部分:
# -*- coding:utf-8 -*-
__author__ = 'kikita'

import arcpy
import timeit
import time
import multiprocessing
import os

arcpy.env.workspace =  r'D:\LearnAboutPython\MyPythonProject\UsingCurser\DemoDataS.gdb'
arcpy.env.overwriteOutput = True

# 批量裁剪函數
def MyBatchClip(Parameter):
    # 參數
    inputFC = Parameter[0]
    ClipArea = Parameter[1]
    OutputWS = Parameter[2]
    Prefix = Parameter[3]
    # 字段列表,其中 SHAPE@用于訪問數據幾何
    Fields = ['OBJECTID','SHAPE@']
    with arcpy.da.SearchCursor(ClipArea,Fields) as cursor:
        for row in cursor:
            outputFC = os.path.join(OutputWS, Prefix+str(row[0])+'.shp')
            arcpy.Clip_analysis(inputFC, row[1], outputFC)
            print Prefix+str(row[0])+'.shp'


if __name__ == '__main__':
    # 參數
    OutputWS = r'D:\LearnAboutPython\MyPythonProject\UsingCurser\OutputWS'
    # SDE庫輸出
    #OutputWS = r'C:\Connection131.sde'
    Parameter1 = ['CountyPoints','Area_A',OutputWS, 'AAA_']
    Parameter2 = ['hyd_line','Area_B',OutputWS, 'BBB_']
    Parameter3 = ['River_line.shp','Area_C.shp',OutputWS,'CCC_']
    Parameters = [Parameter1,Parameter2,Parameter3 ]
    # 當前CPU核數
    print 'CPU Count:' + str(multiprocessing.cpu_count())
    # 進程池
    MyGPpool = multiprocessing.Pool()
    # 多進程并行處理
    StartTime = time.time()
    results = MyGPpool.map(MyBatchClip,Parameters)
    EndTime = time.time()
    print 'Elapsed:  ' + str(EndTime - StartTime) + '  Seconds...'
結果

CPU Count:8
AAA_0.shp
BBB_0.shp
CCC_0.shp
BBB_1.shp
AAA_1.shp
CCC_1.shp
BBB_2.shp
AAA_2.shp
CCC_2.shp
……
……
……
BBB_28.shp
AAA_27.shp
BBB_29.shp
CCC_28.shp
CCC_29.shp
AAA_28.shp
BBB_30.shp
CCC_30.shp
AAA_29.shp
AAA_30.shp
Elapsed:  28.628000021  Seconds...
一點有用的提示:
1.在使用Multiprocessing時,注意數據鎖定(Schema Lock)的問題,例如這個例子中,當輸出工作空間選擇為FileGDB時出現異常。 使用文件夾輸出 Shapefile,或者以SDE數據庫作為輸出工作空間,都是可以的。
2.我在代碼中也加入了計時,用于比較并行與否的耗時情況。 但是有時確實會發現,較簡單的處理任務時,多進程并行并不比單進程快,因為導入模塊和啟動進程都需要花時間。

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢