崔文化
(1.安徽省第二測繪院,安徽 合肥 230601)
基礎地理信息數(shù)據(jù)是國家信息化建設中重要的基礎性與戰(zhàn)略性資源,主要由水系、地貌、植被等自然要素以及居民地、交通、境界、特殊地物、地理名稱等社會要素構(gòu)成。作為地理要素統(tǒng)一的定位基礎和空間載體,基礎地理信息數(shù)據(jù)主要包括地形要素數(shù)據(jù)、數(shù)字正射影像數(shù)據(jù)、數(shù)字高程模型數(shù)據(jù)、地形圖制圖數(shù)據(jù)等。
近年來,隨著國家經(jīng)濟建設與社會公共事業(yè)的快速發(fā)展,基礎設施和公共服務設施的逐步完善,基礎地理信息數(shù)據(jù)在城鄉(xiāng)建設規(guī)劃和社區(qū)事務管理中的作用愈加重要[1]。城市化建設的持續(xù)進展,使得地表地形變化日益頻繁、復雜,實時、快速、準確地實現(xiàn)地理信息數(shù)據(jù)更新,對基礎地理信息數(shù)據(jù)的規(guī)范性、完整性、現(xiàn)勢性等也提出了迫切要求。因此,在發(fā)現(xiàn)、采集、核查、編輯、整理等數(shù)據(jù)實時快速更新時,數(shù)據(jù)的質(zhì)量控制,特別是數(shù)據(jù)的屬性檢查至關(guān)重要。屬性是地理信息要素重要的組成部分,若要素的屬性錄入錯誤,則可能導致非此即彼、似是而非、含糊不清等后果。要素屬性檢查采用人機交互的方式,不僅工作量大、效率低,而且不具備直觀性,因此“迫切需要可快速而有效地對數(shù)據(jù)進行處理和檢驗的軟件工具”[2]。本文利用Python語言和ArcGIS自帶的ArcPy站點包開發(fā)腳本工具[3],對gdb格式的基礎地理信息數(shù)據(jù)結(jié)構(gòu)以及屬性字段錄入的正確性和一致性進行了自動檢查,提高了工作效率,減少甚至消除了質(zhì)量問題,提升了數(shù)據(jù)質(zhì)量。
基于Python開發(fā)的軟件可用于處理地理信息數(shù)據(jù)庫的相關(guān)屬性[4],已被廣泛應用于氣象地理信息數(shù)據(jù)處理和城市規(guī)劃建設中[5-7]。在ArcGIS桌面環(huán)境中,基礎地理信息數(shù)據(jù)由點、線、面要素組成,存儲在被稱作數(shù)據(jù)庫的數(shù)據(jù)文件里。這些要素被放置在對應的點、線、面要素類中(如HYDP、HYDL、HYDA等),每個要素類設置若干個字段(如NAME、TYPE、GB等)分別記錄要素不同的屬性。地球表面紛繁復雜的萬事萬物,通過人們的綜合取舍,均以要素的形式歸類在相應的要素類中,要素類又以屬性表的形式記錄每一個要素,每個要素在屬性表中就是一個記錄。
利用Python語言來創(chuàng)建地理處理腳本軟件,即對屬性表中的記錄進行操作。首先在確保庫數(shù)據(jù)結(jié)構(gòu)正確的前提下,導入ArcGIS開發(fā)的Arcpy站點包和Python內(nèi)置的os、sys等處理模塊;然后設置工作空間環(huán)境env.workspace,調(diào)用Arcpy.da數(shù)據(jù)訪問模塊創(chuàng)建搜索游標SearchCursor或更新游標UpdateCursor;再基于for循環(huán)迭代游標中的每一個記錄,比較記錄的屬性值是否與技術(shù)要求規(guī)定閾值一致,以確定屬性的正確與否,并可實現(xiàn)對某些屬性的自動修改。屬性檢查和更改流程如圖1所示。
圖1 屬性檢查和更改流程圖
軟件是根據(jù)《安徽省1∶10 000基礎地理信息數(shù)據(jù)更新工程技術(shù)規(guī)程(2019 版)》(以下簡稱《規(guī)程》)和《2020年1∶10 000基礎地理信息數(shù)據(jù)更新補充規(guī)定》的技術(shù)要求,采用Python語言編寫的一個數(shù)據(jù)屬性檢查和處理工具,包括1∶10 000基礎地理信息數(shù)據(jù)32個字段值正確性檢查程序、數(shù)據(jù)結(jié)構(gòu)正確性檢查程序、數(shù)據(jù)更新版本標識VERS修改程序、“可以為空”字段空格字符和隱性空字符置空程序。所有程序均封裝在“2020版10000屬性檢查”文件夾內(nèi),并提供了使用說明。
軟件采用Python內(nèi)置的Tkinter模塊,創(chuàng)建了一個用戶界面,如圖2所示。所有功能均在用戶界面上創(chuàng)建按鈕,通過點擊按鈕驅(qū)動程序運行,實現(xiàn)對應屬性的檢查或修改;同時設置了一個“選擇文件夾”按鈕和一個輸入框,用以選擇數(shù)據(jù)文件放置的文件夾和顯示選擇的文件夾位置(程序運行的工作環(huán)境);界面中還有一個“Attribute”按鈕,點擊后即可對所有數(shù)據(jù)屬性進行一次性檢查。
圖2 1∶10 000屬性檢查程序窗口
主程序用于創(chuàng)建用戶界面窗口、生成界面元素,并通過點擊按不同鈕運行應用程序的相應模塊。首先利用import語句導入Python內(nèi)置模塊os、sys、Tkinter,建立一個文件夾查找函數(shù),用以定位存放需檢查的gdb數(shù)據(jù)的文件夾對象;再賦值給變量PathName。這里PathName設置為全局變量,其他所有子程序均需共享這一變量,代碼為:
采用Tkinter模塊定制Tk對話框用戶界面,對話框的標題設置為“2020版10000屬性檢查”。界面設置一個數(shù)據(jù)輸入框,用以接收并顯示PathName變量代表的文件夾,代碼為:
以Button(root,text = u''選擇文件夾'',width =23,command = askdirectory,fg = ''white'',bg = ''red'',font =(''Arial'',12)).grid(row = 1,column = 2)語句創(chuàng)建“選擇文件夾”按鈕,并與輸入框顯示內(nèi)容形成聯(lián)動機制。利用from(ANGLE…) import *等語句調(diào)用自定義的字段屬性檢查模塊,并創(chuàng)建各檢查模塊的調(diào)用函數(shù),代碼為:
以Button(root,text = ''ANGLE'',width = 10,command= checkangle).grid(row = 3,column = 0)等語句創(chuàng)建執(zhí)行各字段檢查程序的按鈕,并以按鈕Button(root,text =''Attribute'',width = 15,command = attr,fg = ''red'').grid(row= 10,column = 2)實現(xiàn)對所有屬性的檢查。界面中還添加了“FIELD”、“字段置空”、“VERS值修改”等按鈕,以執(zhí)行相應的功能。
子程序包括33個屬性檢查模塊和2個屬性處理模塊,且均被打包在文件夾Attr內(nèi),點擊用戶界面窗口對應按鈕即可調(diào)用該子程序。
1)數(shù)據(jù)結(jié)構(gòu)檢查程序。數(shù)據(jù)屬性檢查時,首先點擊“FIELD”按鈕,檢查數(shù)據(jù)庫數(shù)據(jù)結(jié)構(gòu)是否與規(guī)程要求一致,若數(shù)據(jù)結(jié)構(gòu)錯誤,則會影響數(shù)據(jù)使用,甚至可能引發(fā)嚴重問題。編寫數(shù)據(jù)庫數(shù)據(jù)結(jié)構(gòu)檢查程序,需導入內(nèi)置模塊和ArcGIS站點包ArcPy模塊,因此需安裝ArcGIS平臺。程序以folder= os.listdir(PathName)語句接收主程序選擇的文件夾對象,并進行循環(huán)迭代,遍歷文件夾內(nèi)所有文件,對文件夾內(nèi)所有g(shù)db數(shù)據(jù)文件執(zhí)行操作。通過語句fcs=arcpy.ListFeatureClasses('','','')迭代循環(huán),檢索文件中的每個要素類,獲取每個要素類的字段描述信息列表。提取每個字段的名稱并創(chuàng)建字段列表的語句為:
根據(jù)該列表分別獲取字段的數(shù)據(jù)類型列表和“可以為空”的True和False屬性列表。程序還編制了《規(guī)程》規(guī)定的每個要素類的字段屬性列表oldFlds、oldTyps、oldIsNuls。通過運行以下代碼與規(guī)程字段結(jié)構(gòu)進行比較,以檢查數(shù)據(jù)結(jié)構(gòu)的正確性。
在對數(shù)據(jù)類型和“可以為空”屬性進行檢查時,必須保證字段名稱列表名稱、數(shù)量、順序與《規(guī)程》一致,在保證數(shù)據(jù)結(jié)構(gòu)正確的前提下,再進行其他屬性檢查,因為數(shù)據(jù)結(jié)構(gòu)錯誤屬于嚴重錯誤。
2)TYPE屬性檢查程序。本文以TYPE屬性檢查模塊為例,示意程序編寫思路,其他檢查模塊與其編寫結(jié)構(gòu)基本一致。
從主程序獲取變量PathName代表的文件夾,通過os.listdir、Arcpy.ListFeatureClasses函數(shù)以及for語句得到gdb文件及其要素類。根據(jù)要素類建立搜索游標并運行arcpy.da.SearchCursor(fc,(“GB”, “TYPE”,“OBJECTID”) as cursor語句,對cursor進行循環(huán)迭代,得到該要素類下每一條記錄的row[1]值;再通過if語句與《規(guī)程》的GB國標碼要素TYPE屬性進行比較,二者若不一致則記錄一條錯誤,并標出要素的OBJECTID序號,供修改參考。另外,程序還添加了“字段置空”和“VERS值修改”兩個數(shù)據(jù)批處理程序。
在檢查各要素屬性時,為統(tǒng)一數(shù)據(jù)標準,針對“可以為空”的字段,通常把屬性值作刪除操作而遺留的空格字符“ ”和沒有內(nèi)容的空字符“”均作為問題列出,以修改為ArcGIS的None值,“字段置空”按鈕及其功能就是為實現(xiàn)該目的而建立的。通過代碼descFC=arcpy.Describe(fc)和flds=descFC.fields得到數(shù)據(jù)要素類和字段的描述信息;然后迭代循環(huán)過濾出“可以為空”的字段fld.isNullable;再利用arcpy.da.UpdateCursor語句創(chuàng)建更新游標,將屬性值為“ ”和“”的row[i]賦值為None;最后運行cursor.updateRow(row)語句,使修改生效?!癡ERS值修改”用于修改年度更新版本號,一般在數(shù)據(jù)更新完畢,合并和融合時使用。程序運行過程中還生成了一個彈出界面,如圖3所示。修改VERS值是默認設置,還可統(tǒng)一修改其他屬性值,如DATE,不再贅述。
圖3 字段值修改彈出窗口
本文以安徽省某市1∶10 000基礎地理信息數(shù)據(jù)執(zhí)行操作為驗證實例,由于篇幅有限,只對部分模塊功能進行驗證。
該數(shù)據(jù)庫數(shù)據(jù)屬性表字段結(jié)構(gòu)的檢查結(jié)果如圖4所示,可以看出,LFCA要素類中數(shù)據(jù)字段列表與《規(guī)程》要求不一致,缺少TYPE字段;LFCL和LFCP要素類中STACOD字段的isNullable(是否允許為空)屬性定義與《規(guī)程》要求不一致,數(shù)據(jù)為False,而《規(guī)程》為True。
圖4 數(shù)據(jù)結(jié)構(gòu)檢查問題截圖
該數(shù)據(jù)庫數(shù)據(jù)的TYPE屬性檢查結(jié)果如圖5所示。對于有該屬性而又必填的要素,必須填寫真值或缺省值“/”;對于非必填且屬性不確定的以及沒有該屬性的要素,則應為None(真的空值)。內(nèi)容中“TYPE屬性[]錯誤”的要素,TYPE皆為選填,沒有真值應為None,填寫“”的隱性假空字符是錯誤的,是由曾錄入過數(shù)值后來又被刪除所導致的。要素分類碼GB為321600(堆放場)的要素,填寫“廢料”、“石子”不符合《規(guī)程》閾值的標準寫法。屬性為“垃圾”的堆放場應歸類為340602(垃圾場)?!癟YPE屬性[籃球場]錯誤”也與《規(guī)程》閾值不一致,應填寫“籃球”。
圖5 TYPE屬性檢查問題截圖
“字段置空”、“VERS值修改”兩個數(shù)據(jù)批處理程序的驗證效果如圖6、7所示,可以看出,內(nèi)容顯示均已達到預定效果。
圖6 “字段置空”程序效果截圖
圖7 “VERS值修改”程序效果截圖
由于在1∶10 000基礎地理信息數(shù)據(jù)更新生產(chǎn)的質(zhì)量檢查過程中,名稱、類型、等級等相關(guān)屬性信息填寫僅通過人機交互的形式進行錯誤查驗,較為費時、費力,且容易導致疏忽和遺漏。本文利用Python語言進行二次開發(fā),編寫了檢查程序,對ArcGIS平臺gdb數(shù)據(jù)的屬性進行了機器檢查,能有效減少人為因素的局限和干擾;并根據(jù)需要拓展了“字段置空”、“VERS值修改”兩個批處理工具。軟件界面直觀清晰、元素排列有序、操作簡單方便,且能根據(jù)技術(shù)要求的更改或使用者建議的反饋隨時修正。
ArcGIS是一個功能強大的地理信息處理平臺,但通常為通用的處理工具,不具備解決問題的針對性。運用Python人工智能語言,通過二次開發(fā)并加以應用,能收到事半功倍的效用,從而提高工作效力,提升測繪成果質(zhì)量。