崔文化
(1.安徽省第二測繪院,安徽 合肥 230601)
基礎地理信息數據是國家信息化建設中重要的基礎性與戰略性資源,主要由水系、地貌、植被等自然要素以及居民地、交通、境界、特殊地物、地理名稱等社會要素構成。作為地理要素統一的定位基礎和空間載體,基礎地理信息數據主要包括地形要素數據、數字正射影像數據、數字高程模型數據、地形圖制圖數據等。
近年來,隨著國家經濟建設與社會公共事業的快速發展,基礎設施和公共服務設施的逐步完善,基礎地理信息數據在城鄉建設規劃和社區事務管理中的作用愈加重要[1]。城市化建設的持續進展,使得地表地形變化日益頻繁、復雜,實時、快速、準確地實現地理信息數據更新,對基礎地理信息數據的規范性、完整性、現勢性等也提出了迫切要求。因此,在發現、采集、核查、編輯、整理等數據實時快速更新時,數據的質量控制,特別是數據的屬性檢查至關重要。屬性是地理信息要素重要的組成部分,若要素的屬性錄入錯誤,則可能導致非此即彼、似是而非、含糊不清等后果。要素屬性檢查采用人機交互的方式,不僅工作量大、效率低,而且不具備直觀性,因此“迫切需要可快速而有效地對數據進行處理和檢驗的軟件工具”[2]。本文利用Python語言和ArcGIS自帶的ArcPy站點包開發腳本工具[3],對gdb格式的基礎地理信息數據結構以及屬性字段錄入的正確性和一致性進行了自動檢查,提高了工作效率,減少甚至消除了質量問題,提升了數據質量。
基于Python開發的軟件可用于處理地理信息數據庫的相關屬性[4],已被廣泛應用于氣象地理信息數據處理和城市規劃建設中[5-7]。在ArcGIS桌面環境中,基礎地理信息數據由點、線、面要素組成,存儲在被稱作數據庫的數據文件里。這些要素被放置在對應的點、線、面要素類中(如HYDP、HYDL、HYDA等),每個要素類設置若干個字段(如NAME、TYPE、GB等)分別記錄要素不同的屬性。地球表面紛繁復雜的萬事萬物,通過人們的綜合取舍,均以要素的形式歸類在相應的要素類中,要素類又以屬性表的形式記錄每一個要素,每個要素在屬性表中就是一個記錄。
利用Python語言來創建地理處理腳本軟件,即對屬性表中的記錄進行操作。首先在確保庫數據結構正確的前提下,導入ArcGIS開發的Arcpy站點包和Python內置的os、sys等處理模塊;然后設置工作空間環境env.workspace,調用Arcpy.da數據訪問模塊創建搜索游標SearchCursor或更新游標UpdateCursor;再基于for循環迭代游標中的每一個記錄,比較記錄的屬性值是否與技術要求規定閾值一致,以確定屬性的正確與否,并可實現對某些屬性的自動修改。屬性檢查和更改流程如圖1所示。

圖1 屬性檢查和更改流程圖
軟件是根據《安徽省1∶10 000基礎地理信息數據更新工程技術規程(2019 版)》(以下簡稱《規程》)和《2020年1∶10 000基礎地理信息數據更新補充規定》的技術要求,采用Python語言編寫的一個數據屬性檢查和處理工具,包括1∶10 000基礎地理信息數據32個字段值正確性檢查程序、數據結構正確性檢查程序、數據更新版本標識VERS修改程序、“可以為空”字段空格字符和隱性空字符置空程序。所有程序均封裝在“2020版10000屬性檢查”文件夾內,并提供了使用說明。
軟件采用Python內置的Tkinter模塊,創建了一個用戶界面,如圖2所示。所有功能均在用戶界面上創建按鈕,通過點擊按鈕驅動程序運行,實現對應屬性的檢查或修改;同時設置了一個“選擇文件夾”按鈕和一個輸入框,用以選擇數據文件放置的文件夾和顯示選擇的文件夾位置(程序運行的工作環境);界面中還有一個“Attribute”按鈕,點擊后即可對所有數據屬性進行一次性檢查。

圖2 1∶10 000屬性檢查程序窗口
主程序用于創建用戶界面窗口、生成界面元素,并通過點擊按不同鈕運行應用程序的相應模塊。首先利用import語句導入Python內置模塊os、sys、Tkinter,建立一個文件夾查找函數,用以定位存放需檢查的gdb數據的文件夾對象;再賦值給變量PathName。這里PathName設置為全局變量,其他所有子程序均需共享這一變量,代碼為:

采用Tkinter模塊定制Tk對話框用戶界面,對話框的標題設置為“2020版10000屬性檢查”。界面設置一個數據輸入框,用以接收并顯示PathName變量代表的文件夾,代碼為:

以Button(root,text = u''選擇文件夾'',width =23,command = askdirectory,fg = ''white'',bg = ''red'',font =(''Arial'',12)).grid(row = 1,column = 2)語句創建“選擇文件夾”按鈕,并與輸入框顯示內容形成聯動機制。利用from(ANGLE…) import *等語句調用自定義的字段屬性檢查模塊,并創建各檢查模塊的調用函數,代碼為:

以Button(root,text = ''ANGLE'',width = 10,command= checkangle).grid(row = 3,column = 0)等語句創建執行各字段檢查程序的按鈕,并以按鈕Button(root,text =''Attribute'',width = 15,command = attr,fg = ''red'').grid(row= 10,column = 2)實現對所有屬性的檢查。界面中還添加了“FIELD”、“字段置空”、“VERS值修改”等按鈕,以執行相應的功能。
子程序包括33個屬性檢查模塊和2個屬性處理模塊,且均被打包在文件夾Attr內,點擊用戶界面窗口對應按鈕即可調用該子程序。
1)數據結構檢查程序。數據屬性檢查時,首先點擊“FIELD”按鈕,檢查數據庫數據結構是否與規程要求一致,若數據結構錯誤,則會影響數據使用,甚至可能引發嚴重問題。編寫數據庫數據結構檢查程序,需導入內置模塊和ArcGIS站點包ArcPy模塊,因此需安裝ArcGIS平臺。程序以folder= os.listdir(PathName)語句接收主程序選擇的文件夾對象,并進行循環迭代,遍歷文件夾內所有文件,對文件夾內所有gdb數據文件執行操作。通過語句fcs=arcpy.ListFeatureClasses('','','')迭代循環,檢索文件中的每個要素類,獲取每個要素類的字段描述信息列表。提取每個字段的名稱并創建字段列表的語句為:

根據該列表分別獲取字段的數據類型列表和“可以為空”的True和False屬性列表。程序還編制了《規程》規定的每個要素類的字段屬性列表oldFlds、oldTyps、oldIsNuls。通過運行以下代碼與規程字段結構進行比較,以檢查數據結構的正確性。

在對數據類型和“可以為空”屬性進行檢查時,必須保證字段名稱列表名稱、數量、順序與《規程》一致,在保證數據結構正確的前提下,再進行其他屬性檢查,因為數據結構錯誤屬于嚴重錯誤。
2)TYPE屬性檢查程序。本文以TYPE屬性檢查模塊為例,示意程序編寫思路,其他檢查模塊與其編寫結構基本一致。
從主程序獲取變量PathName代表的文件夾,通過os.listdir、Arcpy.ListFeatureClasses函數以及for語句得到gdb文件及其要素類。根據要素類建立搜索游標并運行arcpy.da.SearchCursor(fc,(“GB”, “TYPE”,“OBJECTID”) as cursor語句,對cursor進行循環迭代,得到該要素類下每一條記錄的row[1]值;再通過if語句與《規程》的GB國標碼要素TYPE屬性進行比較,二者若不一致則記錄一條錯誤,并標出要素的OBJECTID序號,供修改參考。另外,程序還添加了“字段置空”和“VERS值修改”兩個數據批處理程序。
在檢查各要素屬性時,為統一數據標準,針對“可以為空”的字段,通常把屬性值作刪除操作而遺留的空格字符“ ”和沒有內容的空字符“”均作為問題列出,以修改為ArcGIS的None值,“字段置空”按鈕及其功能就是為實現該目的而建立的。通過代碼descFC=arcpy.Describe(fc)和flds=descFC.fields得到數據要素類和字段的描述信息;然后迭代循環過濾出“可以為空”的字段fld.isNullable;再利用arcpy.da.UpdateCursor語句創建更新游標,將屬性值為“ ”和“”的row[i]賦值為None;最后運行cursor.updateRow(row)語句,使修改生效。“VERS值修改”用于修改年度更新版本號,一般在數據更新完畢,合并和融合時使用。程序運行過程中還生成了一個彈出界面,如圖3所示。修改VERS值是默認設置,還可統一修改其他屬性值,如DATE,不再贅述。

圖3 字段值修改彈出窗口
本文以安徽省某市1∶10 000基礎地理信息數據執行操作為驗證實例,由于篇幅有限,只對部分模塊功能進行驗證。
該數據庫數據屬性表字段結構的檢查結果如圖4所示,可以看出,LFCA要素類中數據字段列表與《規程》要求不一致,缺少TYPE字段;LFCL和LFCP要素類中STACOD字段的isNullable(是否允許為空)屬性定義與《規程》要求不一致,數據為False,而《規程》為True。

圖4 數據結構檢查問題截圖
該數據庫數據的TYPE屬性檢查結果如圖5所示。對于有該屬性而又必填的要素,必須填寫真值或缺省值“/”;對于非必填且屬性不確定的以及沒有該屬性的要素,則應為None(真的空值)。內容中“TYPE屬性[]錯誤”的要素,TYPE皆為選填,沒有真值應為None,填寫“”的隱性假空字符是錯誤的,是由曾錄入過數值后來又被刪除所導致的。要素分類碼GB為321600(堆放場)的要素,填寫“廢料”、“石子”不符合《規程》閾值的標準寫法。屬性為“垃圾”的堆放場應歸類為340602(垃圾場)。“TYPE屬性[籃球場]錯誤”也與《規程》閾值不一致,應填寫“籃球”。

圖5 TYPE屬性檢查問題截圖
“字段置空”、“VERS值修改”兩個數據批處理程序的驗證效果如圖6、7所示,可以看出,內容顯示均已達到預定效果。

圖6 “字段置空”程序效果截圖

圖7 “VERS值修改”程序效果截圖
由于在1∶10 000基礎地理信息數據更新生產的質量檢查過程中,名稱、類型、等級等相關屬性信息填寫僅通過人機交互的形式進行錯誤查驗,較為費時、費力,且容易導致疏忽和遺漏。本文利用Python語言進行二次開發,編寫了檢查程序,對ArcGIS平臺gdb數據的屬性進行了機器檢查,能有效減少人為因素的局限和干擾;并根據需要拓展了“字段置空”、“VERS值修改”兩個批處理工具。軟件界面直觀清晰、元素排列有序、操作簡單方便,且能根據技術要求的更改或使用者建議的反饋隨時修正。
ArcGIS是一個功能強大的地理信息處理平臺,但通常為通用的處理工具,不具備解決問題的針對性。運用Python人工智能語言,通過二次開發并加以應用,能收到事半功倍的效用,從而提高工作效力,提升測繪成果質量。