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