秦榮波QIN Rong-bo
(貴州省第一測繪院,貴陽550000)
在數據建庫過程中,常常會面臨著收集到來自多個部門的數據,這些數據格式種類繁多,需要按照入庫要求制作成具有統一字段,或者統一刪除某個不符要求值情況,而野外采集用于內業處理的數據需要制作為統一規格,滿足規定格式的數據。在這些實際數據生產過程,無論是地理信息系統開發人員,還是測繪數據生產人員都免不了數據批處理。過去憑借大量人力的數據生產模式逐漸被計算機批量處理所代替。借助于ArcGIS Desktop 桌面軟件提供的ArcPy 腳本開發,可滿足日常地理信息數據批量數據處理。
ArcPy 是用pyhon 語言封裝的處理地理數據站點包,分有類和函數[1]。ArcPy 提供了訪問與處理空間數據,地圖制圖模塊,具有處理矢量與柵格數據,執行處理任務接口,有制圖、網絡分析、空間分析等功能。ArcPy 遵循python 語言語法,開發人員可使用ArcGIS Desktop 自帶開發環境,或者將站點包導入到第三方python 程序編輯器對ArcPy進行開發。
Esri 公司開發的ArcGIS Desktop 軟件提供一系列開發接口,可供使用人員依據實際項目需要定制數據處理功能,有多種計算機語言開發接口支持,主要為C#、python。在日常開發中基于C#開發主要表現在ArcEngine 二次開發,基于Addin 插件開發,而python 則表現在ArcPy 開發。雖然利用C#語言開發,可提供了豐富的二次開發接口,但需要使用者事先掌握C#語言。相比較而言,python 語言易于學習,使用python 的ArcPy 開發容易入門。ArcPy 提供一系列和ArcToolBox 類似功能的地理信息數據處理接口,能快速滿足功能實現。憑借ArcPy 自身特點,ArcPy 已經用于全國國土三調與地理國情項目[2,3],也可以實現TPK地圖數據包批量制作[4]。
在測繪地理信息各種項目實施過程中,數據往往會遇到這樣的特點。一是數據量大,重復工作。在國土三調項目中,以縣為單位進行數據處理,會有遇到將全縣各個區域分幅影像合并或者按照全縣各個行政村裁剪影像的應用場景。人工的對數據量龐大影像合并或者裁剪可借助ArcGIS Desktop 提供的影像融合或者裁剪工具一一按照要求,重復點擊工具,最后處理成達到目標要求的數據,但這面臨著機械重復同一工作的問題。二是批量數據處理功能需求往往不太復雜,工作簡單。從批量的影像裁剪或者融合情景可以看得出,只是調用ArcPy 提供的裁剪或者融合函數即可。再如在其他場景有這樣的應用,從讀取csv格式經緯度坐標數據,利用ArcPy 創建帶有空間參考的shapefile 矢量點數據文件。同時也會出現結合excel 提取報表數據,利用ArcPy 將屬性值添加到shapefile 中??傮w來說,功能需求不太復雜,結合ArcPy 提供的接口能滿足需求。
依據日常測繪地理信息數據批處理的特點,可以選擇python 作為編程語言開發相應的功能。Esri 公司提供多種基于python 開發模式。①使用模型構建器的功能實現。由ArcGIS Desktop 軟件界面的地理工具欄選擇模型構建器,選擇提供的for,while,要素選擇、行選擇、表、工作空間等迭代器,設置輸入參數變量、數據類型等。同時,可以將ArcToolbox 工具箱中的工具直接拖拽至模型編輯面板作為需要開發功能的一部分或者全部,經過一系列組裝以及模型驗證后,基于模型構建器開發模式就完成功能編寫。該種開發模式可直接拖拽模型,相對而言比較簡單,但對于要求比較靈活的功能而言,不易于實現。②基于ArcGIS自帶的Python Shell 編輯ArcPy 腳本。在Shell 開發編輯器可以直接調用開發接口,開發人員根據列出開發接口直接選擇ArcPy 函數。但在開發界面不易于腳本編寫,初學者往往容易在編寫腳本過程中出現錯誤。③使用添加腳本方式。編寫代碼使用Shell 界面或者其他編輯工具來編寫。代碼編寫完成之后,當腳本功能中有參數時可從ArcGIS Desktop 添加腳本,同時設置相應參數類型等信息即可。④通過pycharm 或者vscode 等工具編寫腳本。該種方式利用第三方開發編輯器,便于代碼編寫。如使用pycharm 來編寫ArcPy 腳本可在ArcGIS Desktop 右側目錄中選擇腳本開發所在的目錄,新建python 工具箱,軟件自動創建pyt后綴文件。如圖1 所示,最后利用pycharm 導入pyt 后綴文件,編寫輸入參數以及執行函數,就完成了整個ArcPy 腳本開發。該開發方式較為直觀,符合一般計算機軟件開發習慣。用戶可以根據自己的開發特點選擇合適開發方式。

圖1 pycharm 的ArcPy 開發環境
根據項目需要,利用pycharm 搭建ArcPy 開發環境,直接接入ArcPy 接口。本次實現的功能是遍歷shapefile 每一條面記錄,逐條讀出每個面數據,通過面數據與影像數據利用裁剪函數進行裁剪,最后得到經過shapefile 記錄中與面相交裁剪后的多個裁切影像。編碼之前,首先需要配置好pycharm 下ArcPy 站點包開發環境,在ArcGIS Desktop 目錄連接腳本目錄所在位置,創建好python 工具箱,之后就可編寫腳本代碼。腳本主體需要利用到屬性遍歷函數,裁切函數。主要功能代碼如下所示:

依據功能需求,在構造裁剪函數時,需要特別注意裁剪區域。裁剪的面不規則,故需要按照幾何圖形進行裁剪。pycharm 完成主體代碼編寫后,封裝為一個完整功能函數。在pyt 文件中編寫好參數的顯示名稱、參數數據類型等,在執行函數中可調用封裝好的功能函數。在ArcGIS Desktop 引用代碼文件,工具界面如圖2 所示。為了便于工具功能說明清晰明了,可以在ArcGIS Desktop 中編輯工具的子項描述,依據需要對工具名稱、參數描述、參考代碼進行編寫具體說明。最后該工具可以用于將shapefile 矢量面數據逐條讀取,將每條數據與tif 格式影像相交并裁剪出相交區域,用該條記錄設置的某一個字段的對應字段值作為影像數據的文件名稱實現成果輸出。

圖2 批量裁剪影像工具
使用ArcPy 開發出的工具與ArcGIS Desktop 桌面軟件緊密結合,即便不了解開發的數據生產者只需要將開發代碼文件拷貝到特定目錄即可運行使用。項目應用了某縣行政區域矢量數據與影像實現一鍵成果正確輸出,省去測繪室內重復工作,減少人工干預,提高工作效率。
本文介紹了ArcPy 基本概念與目前在測繪地理信息數據生產過程中批量開發應用,指出基于ArcPy 開發特點,說明了ArcPy 編寫方式,用戶根據實際需要選擇開發模式。同時使用一個例子說明Arcpy 開發應用,從中可以發現基于ArcPy 在地理信息數據處理中的開發的是重新整合開發接口與實際項目邏輯。雖然ArcPy 在地理信息數據批量處理過程中有著不可替代作用,但也存在著不利于界面交互,接口細粒度遠不如基于C#的ArcGIS 開發的不足。在地理信息數據處理中目前主流的ArcPy 開發是基于ArcGIS10.X Desktop 系列,封裝的站點包使用了python2,而ArcGIS Pro 提供的ArcPy 開發接口使用python3 封裝,相比ArcGIS10.X 的ArcPy 而言,ArcGIS Pro 提供了更加豐富的開發接口,因此這需要使用者去深入學習與了解,并加以應用。