李徐亮,高鵬遠,王春博,徐 斌,劉 偉
(河北省煤田地質局物測地質隊,河北邢臺 054000)
ArcGIS 是一套綜合性的專業地理信息系統(GIS)應用軟件,擁有一套獨立擴展功能的模塊服務于核心產品[1]。它不僅具有處理遙感影像的功能,而且還具有制圖出圖、管理數據、分析數據等能力。但是針對一些項目時,它的部分工具會重復運行或者交叉使用,使其工作量大大增加。
Python 是一種跨平臺面向對象的編程的計算機語言,它不僅處理速度快、功能強大,而且簡單易學。Python 是不需要編譯器就能使用的,因此它被看作是一種腳本(或解釋型)語言。
ArcPy 在ArcGIS 就是Python 的一個站點包,這樣就能通過Python 對其工具箱進行編寫,簡化工作流程,減少部分功能的重復、交叉使用,提高工作效率,促進快速生產。
地理信息數據運用ArcGIS 軟件進行矢量處理完成后在輸出圖和表時,由于軟件限制,只能進行單一處理,但由于項目不同,輸出的圖和表的數量并不統一,對圖和表數據需求量大的時候也是單一輸出,造成了很大的時間浪費。本研究成果能使圖和表批量化輸出,輸出的內容表頭一致、格式一致、命名方式一致,且內容簡潔明了。用Python 對ArcGIS的工具箱進行二次開發使其項目生產的過程方便、快捷,并通過使用Python 來擴展ArcGIS 的功能,使其實現自動化、流程化來完成任務。Python 簡單易學易操作,具有很完善的程序開發功能。Python 被封裝在ArcGIS 的安裝程序中,能直接嵌入到ArcGIS 的許多地理處理工具集中[2]。
本研究以農業特色作物種植面積監測內業數據處理為例,為深入推進農業供給側結構性改革,有效提高畝均產值效益的特色產量,全面提升農業質量效益和競爭力,促進農業增效、村民增收,主要以高效蔬菜(設施蔬菜)、高效水果(蘋果、梨、葡萄等)、高效中藥材(金銀花、麻山藥、半夏等)、高效特色糧油等特色農業產業為重點,探索發展間作套種、林下種植等種植模式。通過利用衛星遙感技術進行月度監測,并運用ArcGIS 對其作物種類、位置、面積進行矢量化,形成可視化圖表進行管理。
項目組根據設計及實際工作需要制定了詳細的技術路線,分為資料數據收集及上報數據初核、遙感影像獲取及處理、制作參考點數據、種植作物遙感監測核實、外業核實、反饋修正、成果匯總等階段。
1)資料數據收集及數據初核階段,對收集到的項目區所需的影像數據及其他相關資料,進行分類核實,統一測繪基準,對填報有誤、漏項的信息進行了反饋重報。
2)遙感影像獲取及處理階段,對項目所需遙感影像數據進行正射校正、數據融合、降位、增強、配準,形成解譯底圖成果。并以景為單位制作了高分遙感成果元數據,標識出每景影像覆蓋的空間范圍圖斑,方便數據索引與調用。
3)種植作物遙感監測核實階段,根據影像特征及解譯標志,結合測量指標進行圖斑的解譯、分類及人工勾繪。
4)外業核實階段,提取內業解譯的新增面積高分衛星遙感監測圖斑當中的“是否外業”為“是”的疑問圖斑,進行外業實地驗證,針對“備注”中填寫的疑問說明進行實地核實。
5)反饋修正階段,根據調查結果,對種植作物認定錯誤的按照外業調查結果修正內業數據,對地塊邊界認定錯誤的結合邊界草圖及遙感影像底圖重新繪制圖斑范圍,測算面積。
6)成果匯總階段,根據遙感數據及解譯成果開展相關分析評價工作,并形成相關圖件、報告、矢量、柵格成果。
由于是月度監測,所以每月匯總數據量很大,各地方上報匯總人員、匯總方式并不相同,格式不統一,給操作人員造成了一定困擾。在圖表輸出時又要根據不同的部門分別匯總成反饋表、區縣匯總表、鄉鎮匯總表、特色類別匯總表等多種表格,運用ArcGIS 的工具箱自帶的工具在輸出圖表時只能單一輸出,浪費時間且容易出現匯總錯誤,給后期數據分析留下很大隱患。
ArcGIS 軟件內的矢量要素分為點矢量要素、線矢量要素和面矢量要素3 種。本研究運用的主要是點矢量數據和面矢量數據,這些數據字段包含區縣名稱、主要作物、經緯度、種植位置等多項信息,如表1所示,它涵蓋了長整型、文本型、雙精度等多種格式。

表1 點和面矢量字段信息單位:字節
最終成果以區縣為單位匯總制作,它主要包括匯總表、明細表及地塊示意圖等資料。表類需細化到村,圖紙按區縣、地塊等進行制作輸出。為了成果管理統一化,縣級特色種植作物分布圖設定為60 cm×80 cm 圖紙,明細表要求A4 橫版打印,野外調查的草圖利用MXD 制作標準的版式,為了方便管理與使用,野外草圖統一設定為A4 橫版打印。野外調查時把所需要調查的野外地塊利用ArcGIS工具箱轉換工具內的轉為KML 工具使其矢量數據轉為KMZ 格式,導入到手機內方便外業調查時進行路線規劃等,分別如圖1、表2 和表3 所示。

圖1 新增地塊分布示意圖

表2 上報地塊核查情況匯總表

表3 主要成果格式及類型
基于項目數據源及成果分析,利用Python 編輯的腳本工具在設計方面主要分為標準模板創建、字段內容檢查、鄉鎮名稱檢查、自動填寫序號及內部序號自動掛接、自動導出表格等幾個模塊,如圖2所示。

圖2 程序設計流程圖
3.1.1 字段標準化模板
由于上報數據混亂,為了方便作業和后期管理,將預先規劃好的標準字段信息寫入腳本代碼,通過腳本工具箱對矢量數據字段信息進行檢查,對不符合標準的或者遺漏的根據腳本編輯的規則進行重新創建,使其形成標準化的字段信息,腳本工具的主要代碼內容如下:
For 矢量字段in arcpy.ListFields(矢量路徑):
字段集合.append(矢量字段.name)
for 標準字段in 標準字段集合:
if 標準字段not in 字段集合:
arcpy.AddField_management(矢量路徑,標準字段,"字段類型","","","字段長度")
3.1.2 MXD制圖模板
利用ArcMap 地圖文檔制作標準的MXD 制圖模板,制作過程是首先遍歷文件目錄中的MXD 文檔,然后將每個文件中所包含的圖層遍歷出來,按版式及變量設置好對應字段[3],輸出MXD 格式制圖模板,如圖3 所示。

圖3 MXD 制圖模板
圖幅自動輸出時由于數據量大,且內部信息不統一,故每次只能單一地替換變量字段,并不能實現自動化。本研究運用ArcGIS 自帶的“數據驅動器”對其數據驅動,調出“數據驅動器”后在索引圖層和索引字段的頁面設置保存MXD 文檔,使用Python 編輯的腳本打開MXD 文檔模板,設置將成果固定存放的文件夾路徑及出圖格式。通過設置的唯一字段進行驅動,結合Python 編輯的語言對其完成表頭自動變換。
表頭索引如下:
XX 市<dyn type= "page" property= "attribute"field="行政區名稱"domainlookup="true"/>特色種植<dyn type="page" property="attribute" field="類型"domainlookup="true"/>野外核查示意圖,具體如圖4所示。

圖4 數據驅動頁面示意圖
字段標準化的創建采用判斷的方式對字段填寫內容進行關鍵字識別判讀,根據Python 編輯的腳本工具對字段縣名、鄉鎮名稱、作物名稱等內容進行檢查,將字段內的非空值、0 值等錯誤信息以.txt格式導出報告。根據報告內容對這些問題字段內容進行修改,并對字段的序號重新進行順序賦值,對字段內的內部序號根據鄉鎮名稱進行統一賦值,賦值后對其后期表格匯總起關鍵作用。主要代碼如下:
矢量數據=arcpy.da.SearchCursor(查詢游標)(矢量路徑,["檢查字段名稱"]
for i in range(1,len(矢量數據)):
if row[i]in["","0"None,"無"]:
文檔.write("必填項空項")
矢量數據= arcpy.da.UpdateCursor(更新游標)(矢量路徑,["序號"])
k=1
for row in 矢量數據:
row[0]=k
k=k+1
矢量數據.updateRow(row)
根據點矢量數據和面矢量數據之間的屬性編號唯一值進行鏈接,使點矢量數據的字段屬性信息賦值更新到面矢量數據字段信息上。這樣就能保證圖標輸出內容一致,方便管理。此功能的主要實現方式為運用 UpdateCursor(更新游標)及SearchCursor(查詢游標)兩個模塊對點矢量數據、面矢量數據值進行讀寫,通過SearchCursor 對點矢量數據內的字段信息遍歷后,運用UpdateCursor 對面矢量數據內相對應的字段通過唯一字段值進行賦值或更新。主要代碼如下:
圖斑路徑=arcpy.GetParameterAsText(0)
參考點路徑=arcpy.GetParameterAsText(1)
圖斑= arcpy.da.UpdateCursor(更新游標)(圖斑路徑,["DKBH","序號","QXMC","XZMC","","導表"])
for row in 圖斑:
導表=format(row[18])
If 導表in["1","1.0"]:
參考點= arcpy.da.SearchCursor(查詢游標)(參考點路徑,
["DKBH","序號","縣名","鄉鎮名","",""導表"])
for row 1 in 參考點:
if int(float(row[0]))==int(float(row1[0])):
圖斑.updateRow(row)
3.4.1 表格自動化輸出
標準化表格自動輸出時需要通過腳本工具箱引入xlwt(一個用于創建XLS 格式Excel 文件的Python 庫)站點包,通過遍歷讀取點矢量數據和面矢量數據字段的全部內容,進行數據的過濾及整理[4],對鄉鎮名稱、面積等信息進行計算并統計,然后分別寫入不同的表格當中,并對不同表格內容進行統計后完成成果表制作。實現方式如下:
1)用xlwt.Workbook 以及book.add_sheet 這兩個模塊創建新的標準化的表格及表單。
2)在腳本工具箱內新建表頭集合,遍歷讀取表頭集合并運用sheet.write 將標準化的表頭寫進Excel 表單內。
3)用arcpy.da.SearchCursor(查詢游標)讀取點矢量數據和面矢量數據字段信息內容。
4)需要分類統計的信息按細化程度創建不同的標準集合,并在點矢量數據和面矢量數據遍歷過程中,根據關鍵字信息將不同的數據放到對應的集合當中。
5)對通過遍歷過濾及整理后的標準集合,用sheet.write 寫入對應的Excel 表單當中,并通過book.save(路徑)進行輸出并保存成各類標準的統計表格。
3.4.2 圖件自動化輸出
使用標準化MXD 制圖模板,通過替換點矢量數據和面矢量數據數據源的方法,替換模板相對應的內容,對多種不同信息,通過唯一屬性字段進行命名[5-7],通過驅動來完成圖件自動化輸出,如圖5所示。

圖5 自動化出圖流程圖
需引入os 站點包,主要代碼如下:
路徑,文件名=os.路徑.split(矢量路徑)
模板= arcpy.mapping.MapDocument(MXD 模板路徑)
數據框=arcpy.mapping.ListDataFrames(模板)
要素=arcpy.mapping.ListLayers(模板,"",數據框[圖層序號])[要素序號]
要素.replaceDataSource(文件名,"SHAPEFILE_WORKSPACE",路徑)#替換數據源
模板.save()
模板.dataDrivenPages.exportToPDF(PDF 路徑,"ALL")#輸出pdf 成果
1)針對該項目,本研究提升了以下幾項流程中的工作效率:
在“資料收集及數據初核階段”運用字段標準化模塊進行統一數據格式,解決了各縣上報不統一問題,為后期管理和作業提供標準信息。
在“種植作物遙感監測核實階段”運用工具箱內的字段內容檢查、自動掛接解模塊解決了數據內容的填寫初核及人為掛接時間長易出錯的問題,通過點矢量數據和面矢量數據的唯一字段進行自動掛接,將點矢量數據內的信息賦予面矢量數據內。
在“外業核實階段”運用MXD 制圖模板一次性將外業調查草圖及表格全部導出,為野外核實提供依據。改變了原來只能單一導出的模式,方便快捷,提高了工作效率。
在“成果匯總階段”運用自動導出反饋表模塊,一次導出各種標準的匯總表、區縣表、鄉鎮表等等匯總表格,對成果形成統一格式進行管理。
2)本研究中,由于數據獲取方式為各區縣自主上報,上報的數據各不相同,數據量大而且混亂,加之參與研究的人員眾多,造成了表格匯總錯誤、制圖樣式不統一等問題。此外制作各種表格所需要的時間長,匯總容易出錯;出圖時只能單一制作處理,耗時耗力,造成人員浪費。
本次研究解決了由于各種原因造成的圖表輸出錯誤、整體匯總難的問題。經測試,以區縣為單位,單人操作運用ArcGIS 自帶工具及Excel 等軟件進行數據整理及圖表輸出時(包含錯誤問題的修改)共用時45 min,運用該工具后全流程總用時9 min,節省了80% 的圖表成果制作時間。相關圖表自動輸出成果如表4 和圖6 所示。

圖6 圖表輸出成果

表4 區縣匯總表
3)本研究代碼經稍許改動后,成功應用到了某省特色產業集群遙感監測、某市人居環境遙感監測、某縣工業企業用地遙感調查等項目中,解決了具體問題。
通過本次研究,運用Python+ArcGIS 進行的二次開發,利用其腳本批處理大量作業時比傳統單一運用ArcGIS 自帶工具操作簡單,節省了大量時間,提高數據處理的效率和準確率,根據研究需求導出的各種匯總表格清晰明了,避免人為匯總出錯,從而獲得高質量的數據成果。
本次研究給矢量數據的圖表成果自動化輸出提供了解決思路,能為后續GIS 相關數據可視化方面研究提供一定思路。