秦榮波QIN Rong-bo
(貴州省第一測繪院,貴陽550000)
在數(shù)據(jù)建庫過程中,常常會面臨著收集到來自多個(gè)部門的數(shù)據(jù),這些數(shù)據(jù)格式種類繁多,需要按照入庫要求制作成具有統(tǒng)一字段,或者統(tǒng)一刪除某個(gè)不符要求值情況,而野外采集用于內(nèi)業(yè)處理的數(shù)據(jù)需要制作為統(tǒng)一規(guī)格,滿足規(guī)定格式的數(shù)據(jù)。在這些實(shí)際數(shù)據(jù)生產(chǎn)過程,無論是地理信息系統(tǒng)開發(fā)人員,還是測繪數(shù)據(jù)生產(chǎn)人員都免不了數(shù)據(jù)批處理。過去憑借大量人力的數(shù)據(jù)生產(chǎn)模式逐漸被計(jì)算機(jī)批量處理所代替。借助于ArcGIS Desktop 桌面軟件提供的ArcPy 腳本開發(fā),可滿足日常地理信息數(shù)據(jù)批量數(shù)據(jù)處理。
ArcPy 是用pyhon 語言封裝的處理地理數(shù)據(jù)站點(diǎn)包,分有類和函數(shù)[1]。ArcPy 提供了訪問與處理空間數(shù)據(jù),地圖制圖模塊,具有處理矢量與柵格數(shù)據(jù),執(zhí)行處理任務(wù)接口,有制圖、網(wǎng)絡(luò)分析、空間分析等功能。ArcPy 遵循python 語言語法,開發(fā)人員可使用ArcGIS Desktop 自帶開發(fā)環(huán)境,或者將站點(diǎn)包導(dǎo)入到第三方python 程序編輯器對ArcPy進(jìn)行開發(fā)。
Esri 公司開發(fā)的ArcGIS Desktop 軟件提供一系列開發(fā)接口,可供使用人員依據(jù)實(shí)際項(xiàng)目需要定制數(shù)據(jù)處理功能,有多種計(jì)算機(jī)語言開發(fā)接口支持,主要為C#、python。在日常開發(fā)中基于C#開發(fā)主要表現(xiàn)在ArcEngine 二次開發(fā),基于Addin 插件開發(fā),而python 則表現(xiàn)在ArcPy 開發(fā)。雖然利用C#語言開發(fā),可提供了豐富的二次開發(fā)接口,但需要使用者事先掌握C#語言。相比較而言,python 語言易于學(xué)習(xí),使用python 的ArcPy 開發(fā)容易入門。ArcPy 提供一系列和ArcToolBox 類似功能的地理信息數(shù)據(jù)處理接口,能快速滿足功能實(shí)現(xiàn)。憑借ArcPy 自身特點(diǎn),ArcPy 已經(jīng)用于全國國土三調(diào)與地理國情項(xiàng)目[2,3],也可以實(shí)現(xiàn)TPK地圖數(shù)據(jù)包批量制作[4]。
在測繪地理信息各種項(xiàng)目實(shí)施過程中,數(shù)據(jù)往往會遇到這樣的特點(diǎn)。一是數(shù)據(jù)量大,重復(fù)工作。在國土三調(diào)項(xiàng)目中,以縣為單位進(jìn)行數(shù)據(jù)處理,會有遇到將全縣各個(gè)區(qū)域分幅影像合并或者按照全縣各個(gè)行政村裁剪影像的應(yīng)用場景。人工的對數(shù)據(jù)量龐大影像合并或者裁剪可借助ArcGIS Desktop 提供的影像融合或者裁剪工具一一按照要求,重復(fù)點(diǎn)擊工具,最后處理成達(dá)到目標(biāo)要求的數(shù)據(jù),但這面臨著機(jī)械重復(fù)同一工作的問題。二是批量數(shù)據(jù)處理功能需求往往不太復(fù)雜,工作簡單。從批量的影像裁剪或者融合情景可以看得出,只是調(diào)用ArcPy 提供的裁剪或者融合函數(shù)即可。再如在其他場景有這樣的應(yīng)用,從讀取csv格式經(jīng)緯度坐標(biāo)數(shù)據(jù),利用ArcPy 創(chuàng)建帶有空間參考的shapefile 矢量點(diǎn)數(shù)據(jù)文件。同時(shí)也會出現(xiàn)結(jié)合excel 提取報(bào)表數(shù)據(jù),利用ArcPy 將屬性值添加到shapefile 中。總體來說,功能需求不太復(fù)雜,結(jié)合ArcPy 提供的接口能滿足需求。
依據(jù)日常測繪地理信息數(shù)據(jù)批處理的特點(diǎn),可以選擇python 作為編程語言開發(fā)相應(yīng)的功能。Esri 公司提供多種基于python 開發(fā)模式。①使用模型構(gòu)建器的功能實(shí)現(xiàn)。由ArcGIS Desktop 軟件界面的地理工具欄選擇模型構(gòu)建器,選擇提供的for,while,要素選擇、行選擇、表、工作空間等迭代器,設(shè)置輸入?yún)?shù)變量、數(shù)據(jù)類型等。同時(shí),可以將ArcToolbox 工具箱中的工具直接拖拽至模型編輯面板作為需要開發(fā)功能的一部分或者全部,經(jīng)過一系列組裝以及模型驗(yàn)證后,基于模型構(gòu)建器開發(fā)模式就完成功能編寫。該種開發(fā)模式可直接拖拽模型,相對而言比較簡單,但對于要求比較靈活的功能而言,不易于實(shí)現(xiàn)。②基于ArcGIS自帶的Python Shell 編輯ArcPy 腳本。在Shell 開發(fā)編輯器可以直接調(diào)用開發(fā)接口,開發(fā)人員根據(jù)列出開發(fā)接口直接選擇ArcPy 函數(shù)。但在開發(fā)界面不易于腳本編寫,初學(xué)者往往容易在編寫腳本過程中出現(xiàn)錯(cuò)誤。③使用添加腳本方式。編寫代碼使用Shell 界面或者其他編輯工具來編寫。代碼編寫完成之后,當(dāng)腳本功能中有參數(shù)時(shí)可從ArcGIS Desktop 添加腳本,同時(shí)設(shè)置相應(yīng)參數(shù)類型等信息即可。④通過pycharm 或者vscode 等工具編寫腳本。該種方式利用第三方開發(fā)編輯器,便于代碼編寫。如使用pycharm 來編寫ArcPy 腳本可在ArcGIS Desktop 右側(cè)目錄中選擇腳本開發(fā)所在的目錄,新建python 工具箱,軟件自動(dòng)創(chuàng)建pyt后綴文件。如圖1 所示,最后利用pycharm 導(dǎo)入pyt 后綴文件,編寫輸入?yún)?shù)以及執(zhí)行函數(shù),就完成了整個(gè)ArcPy 腳本開發(fā)。該開發(fā)方式較為直觀,符合一般計(jì)算機(jī)軟件開發(fā)習(xí)慣。用戶可以根據(jù)自己的開發(fā)特點(diǎn)選擇合適開發(fā)方式。
圖1 pycharm 的ArcPy 開發(fā)環(huán)境
根據(jù)項(xiàng)目需要,利用pycharm 搭建ArcPy 開發(fā)環(huán)境,直接接入ArcPy 接口。本次實(shí)現(xiàn)的功能是遍歷shapefile 每一條面記錄,逐條讀出每個(gè)面數(shù)據(jù),通過面數(shù)據(jù)與影像數(shù)據(jù)利用裁剪函數(shù)進(jìn)行裁剪,最后得到經(jīng)過shapefile 記錄中與面相交裁剪后的多個(gè)裁切影像。編碼之前,首先需要配置好pycharm 下ArcPy 站點(diǎn)包開發(fā)環(huán)境,在ArcGIS Desktop 目錄連接腳本目錄所在位置,創(chuàng)建好python 工具箱,之后就可編寫腳本代碼。腳本主體需要利用到屬性遍歷函數(shù),裁切函數(shù)。主要功能代碼如下所示:
依據(jù)功能需求,在構(gòu)造裁剪函數(shù)時(shí),需要特別注意裁剪區(qū)域。裁剪的面不規(guī)則,故需要按照幾何圖形進(jìn)行裁剪。pycharm 完成主體代碼編寫后,封裝為一個(gè)完整功能函數(shù)。在pyt 文件中編寫好參數(shù)的顯示名稱、參數(shù)數(shù)據(jù)類型等,在執(zhí)行函數(shù)中可調(diào)用封裝好的功能函數(shù)。在ArcGIS Desktop 引用代碼文件,工具界面如圖2 所示。為了便于工具功能說明清晰明了,可以在ArcGIS Desktop 中編輯工具的子項(xiàng)描述,依據(jù)需要對工具名稱、參數(shù)描述、參考代碼進(jìn)行編寫具體說明。最后該工具可以用于將shapefile 矢量面數(shù)據(jù)逐條讀取,將每條數(shù)據(jù)與tif 格式影像相交并裁剪出相交區(qū)域,用該條記錄設(shè)置的某一個(gè)字段的對應(yīng)字段值作為影像數(shù)據(jù)的文件名稱實(shí)現(xiàn)成果輸出。
圖2 批量裁剪影像工具
使用ArcPy 開發(fā)出的工具與ArcGIS Desktop 桌面軟件緊密結(jié)合,即便不了解開發(fā)的數(shù)據(jù)生產(chǎn)者只需要將開發(fā)代碼文件拷貝到特定目錄即可運(yùn)行使用。項(xiàng)目應(yīng)用了某縣行政區(qū)域矢量數(shù)據(jù)與影像實(shí)現(xiàn)一鍵成果正確輸出,省去測繪室內(nèi)重復(fù)工作,減少人工干預(yù),提高工作效率。
本文介紹了ArcPy 基本概念與目前在測繪地理信息數(shù)據(jù)生產(chǎn)過程中批量開發(fā)應(yīng)用,指出基于ArcPy 開發(fā)特點(diǎn),說明了ArcPy 編寫方式,用戶根據(jù)實(shí)際需要選擇開發(fā)模式。同時(shí)使用一個(gè)例子說明Arcpy 開發(fā)應(yīng)用,從中可以發(fā)現(xiàn)基于ArcPy 在地理信息數(shù)據(jù)處理中的開發(fā)的是重新整合開發(fā)接口與實(shí)際項(xiàng)目邏輯。雖然ArcPy 在地理信息數(shù)據(jù)批量處理過程中有著不可替代作用,但也存在著不利于界面交互,接口細(xì)粒度遠(yuǎn)不如基于C#的ArcGIS 開發(fā)的不足。在地理信息數(shù)據(jù)處理中目前主流的ArcPy 開發(fā)是基于ArcGIS10.X Desktop 系列,封裝的站點(diǎn)包使用了python2,而ArcGIS Pro 提供的ArcPy 開發(fā)接口使用python3 封裝,相比ArcGIS10.X 的ArcPy 而言,ArcGIS Pro 提供了更加豐富的開發(fā)接口,因此這需要使用者去深入學(xué)習(xí)與了解,并加以應(yīng)用。