王增輝
(山東省地質調查院 山東省土地質量地球化學與污染防治工程技術研究中心,濟南 250014)
VB是編制地球化學數據處理程序的常用工具之一,其提供的的模塊包括三種類型:①窗體模塊;②標準模塊;③類模塊。其中窗體模塊是VB應用程序的基礎界面;標準模塊是程序中的一個獨立容器,可包含全局變量、Function過程和Sub過程,通常用于存放與特定窗體或控件無關的代碼;而類模塊是面向對象編程的基礎,其創建的對象可被程序內的過程調用。合理利用標準模塊和類模塊進行程序設計,可極大提高代碼通用性和可維護性。
模塊化程序設計在數據采集與分析方面具有廣泛的實用價值,就地質領域而言其設計思想已經廣泛應用于重、磁、電等數據處理軟件中,尤其是地震軟件更為成熟[1-4],但在地球化學數據采集方面可供參考的資料相對較少。就大比例尺地球化學調查工作而言,近年來在各級主管部門的推動下,全國各地結合實際情況開展了大量針對局部地區的大比例尺土地質量地球化學評價項目[5],成果極大地促進了地球化學調查成果向經濟、社會效益的轉化,但大比例尺土地質量地球化學調查具有調查點位多、調查內容詳細的特點,并且往往有較高的時效性要求,因此工作集中度較高。調查數據采集是該項工作中的重要一環,以往因數據采集效率不高需要大量人力投入,實際工作中對更高效的數據采集手段的需求日益迫切。編制數據采集輔助程序,是進一步提高數據電子化采集效率的一種有效途徑。
目前調查原始數據記錄表的錄入,是借助Excel、Access等軟件提供的電子表格來完成的[6],但傳統的手動輸入效率不高并且易出錯,通過編程實現多種信息的自動錄入是提高工作效率的有效途徑,在地質行業也有較廣泛的應用先例[7-10]。這里以山東聊城1:50 000土地質量地球化學評價項目為例,通過模塊化編程方法設計了一種用于土地質量地球化學調查原始信息錄入的建庫輔助系統(Database Building Assistant System-DBAS),從實際應用來看,該系統在提高數據輸入效率、降低輸入錯誤率等方面效果顯著。
建庫數據源主要包括:野外采樣原始記錄表格、包含“點號”、“預布點坐標”、“預布點屬性信息”的預布點信息表以及由手持GPS定位儀導出的包含實際采樣點“點號”、“坐標”、“高程”等信息的GPS坐標信息表。數據處理之前將預布點信息表和GPS坐標信息表整理成符合建庫要求的數據格式,并在同一工作簿下分別保存為獨立的工作表,二者可通過統一的“點號”字段進行匹配。建庫輔助系統設計思路是將已有信息在錄入窗體內進行匹配,并進行有效性檢查,信息檢查通過后寫入數據庫記錄表,詳見圖1。
數據的錄入過程,可以視作將一系列不同來源的信息表進行重新整合的過程,具體工作流程是:

圖1 建庫輔助系統工作流程圖Fig.1 Workflow of database building assistant system
1)首先根據采樣原始記錄表格在窗體界面內輸入“點號”項,系統將首先利用預布點信息匹配模塊根據“點號”在預布點信息表內查詢對應的信息,如查詢到則將該預布點已有信息(如位置、地類、氣候、土壤等),調入到窗體的相應信息錄入窗口,這些信息除特殊情況外一般不需修改,如查詢不到該點號信息則所有預填項目均為空白,說明輸入點號不正確或不完整,需進一步檢查。
2)系統利用GPS信息匹配模塊根據“點號”在GPS坐標信息表內查詢該點的實際GPS記錄,正確的“點號”應能夠被查詢到,并將其對應的“坐標”、“高程”等信息調入到窗體界面對應的輸入位置,否則將報錯。取得GPS樣點坐標后,系統將計算實際樣點與預布樣點的偏差并顯示在窗體內供錄入人員核對,當采樣偏差超出一定范圍(一般為50 m)視為移點,需根據實際情況記錄移點原因。
3)預布點匹配模塊工作完畢后,系統將利用已有信息匹配模塊在已建立的數據庫信息表內查詢是否已有該“點號”記錄,如果查詢到則將該記錄項的全部對應信息調入到錄入窗體界面內顯示,該模塊的主要意義是避免重復錄入或由于錄入點號錯誤導致數據庫已有信息被覆蓋,并且提供了對已有信息的調取和修改途徑。
4)錄入人員檢查錄入窗體界面自動調取信息的正確性,并根據野外采樣原始記錄表格將相應信息在窗體界面內補全,系統將在每個記錄項錄入完畢后自動根據邏輯關系推斷補全相關項內容,輸入完畢檢查無誤后點擊“導入或更新”按鈕,系統將利用導入模塊將窗體內全部信息導入數據庫記錄表末端,如有漏填項則報錯。
5)為了進一步提高輸入效率,系統在導入數據庫記錄的同時,將利用字典更新模塊將每個記錄項新出現的值增補至字典工作表,當下次加載窗體時,窗體內的下拉選擇框將以字典工作表內保存的值作為初始值,錄入相似記錄項時可直接點選。
以功能塊為單位進行程序設計,實現其求解算法的方法稱為模塊化。模塊化程序設計是在進行程序設計時將一個大程序按照功能劃分為若干小程序模塊,每個小程序模塊完成一個確定的功能,并在這些模塊之間建立必要的聯系,通過模塊的互相協作完成整個功能。目的是為了降低程序復雜度,使程序設計、調試和維護等操作簡單化。模塊化程序設計的任務首先是模塊功能實現,其次是模塊間調用關系的確定和優化,最后是在主界面中調用的實現。
本系統程序包括數據錄入和數據檢查2個工作界面、5個功能模塊和1個繪圖類模塊。功能模塊包括:預布點信息匹配模塊(PreInfoMatch)、GPS信息匹配模塊(GPSInfoMatch)、已有信息匹配模塊(ExsInfoMatch)、數據導入模塊(DataImport)和字典更新模塊(DictUpdate)。建庫輔助系統程序架構見圖2,數據錄入界面根據實際需要調用5個功能模塊對相應數據表進行讀取和寫入,數據檢查界面用于讀取并顯示已有數據,根據指定信息調用繪圖類模塊進行點位信息預覽,并可根據需要調用數據導入模塊對已有數據表進行修改。各功能模塊功能相互獨立,并可在不同界面中適時進行調用。同時類模塊負責點位符號和信息的顯示,規定了繪圖方式和傳遞參數類型,在檢查界面中使用循環語句對繪圖類對象進行調用以完成全部點位和信息預覽圖繪制,極大地提高了代碼的重用率,降低了兩個界面代碼的復雜程度。

圖2 建庫輔助系統程序架構Fig.2 Procedural framework of database building assistant system
土地質量地球化學評價項目野外采樣記錄卡格式,通常參考《土地質量地球化學評價規范(DZ/T 0295-2016)》給出的推薦格式,該表記錄項目較多,對于縣(區)級1:50 000土地質量地球化學評價項目來說過于繁瑣,相比來說,采用省級標準推薦的采樣記錄卡更為切合實際。以土壤采樣記錄卡為例,山東省1:50 000土地質量地球化學評價項目多采用山東省地質調查技術標準——《1:50 000 土地質量地球化學調查評價技術要求(試行)》推薦的記錄卡格式,其記錄項目包括:省(市)名稱、地(市)名稱、縣(區)名稱、鄉(鎮)名稱、村組名稱、樣品編號、橫坐標(X)、縱坐標(Y)、海拔高度(m)、地類名稱、作物種類、地貌類型、地形部位、地面坡度(度)、坡向、常年降雨量(mm)、常年積溫(℃)、常年無霜期(天)、水源條件、輸水方式、灌溉方式、熟制、典型種植制度、常年產量水平(公斤/畝)、土壤類型、顏色、質地(手測)、耕層厚度(cm)、采樣深度(cm)、成土母質、土壤結構、侵蝕程度、主要巖性、人為污染、周邊環境描述、采樣人、記錄人、核對人、日期。這里以此為基礎進行錄入窗體界面設計,見圖3。
窗體內數據錄入區域主要采用下拉選擇框完成,其中可由自動補全的部分背景色設定為灰色,需手動輸入或選擇的設定為白色。由于調查信息之間往往存在內在聯系和邏輯關系,因此,系統自動實時跟蹤部分項目值變化(通過ComboBox方法),調用相應模塊,或根據邏輯關系對其他項的值進行補全,如“樣品編號”項變化將自動調用預布點匹配模塊、GPS信息匹配模塊及已有信息匹配模塊工作,“作物”項變化將自動在“熟制”、“種植制度”等項內補全最常見默認值,如作物為“小麥”,“熟制”則自動填“4”(一年兩熟)、“種植制度”自動填“2”(小麥-玉米);如作物為“-”(無),則與之相關的項均填為“-”。“周邊描述”中常見描述可進行勾選,選中后自動添加到錄入窗口,不必手動錄入。此外界面內按鈕提供了各模塊的直接調用方式。
當數據量不太大的時候采用Excel工作表存儲數據是相對簡便有效的(在Excel2007之后版本中工作表的大小為16384列×1048576行,在Excel97-2003中,工作表的大小為256列×65536行),一般能夠滿足絕大多數化探調查項目要求,當數據量達到百萬條以上時應使用Access表格存儲數據,以滿足容量和處理速度上的需求,當然需對代碼進行適當改寫。本系統底層采用Excel工作表進行數據存儲,錄入工作開始之前,首先將全部數據表置于同一工作簿內,其中Sheet1、Sheet2、Sheet4和Sheet5依次為數據庫記錄表、GPS坐標信息表、預布點信息表和字典工作表,各工作表數據互相獨立,僅通過相應的模塊對各工作表進行操作。這里將記錄上限暫時設為9 999條,記錄項目39項。各模塊編碼如下。
1.4.1 預布點信息匹配模塊(PreInfoMatch)
預布點信息的取得依靠對預布點信息表(Sheet4)的遍歷來完成,獲得樣點所在行號之后對相應下拉選擇框(ComboBox)賦值。由于實際點和預布點正常情況下不會相差1 000 m以上,因此二者坐標至少前4-5位應該是一致的,實際坐標會進一步根據GPS坐標信息表確定,當GPS信息缺失時由用戶補充后三位。

圖3 建庫輔助系統主界面Fig.3 Main interface of database building assistant system
Sub PreInfoMatch ()Dim bl As Boolean 'bl為點號是否與預布點匹配的標記變量
bl=False
For i=2 To 10000 '設定Sheet4為10000行
If UserForm1.ComboBox4.Text Like Sheet4.Cells(i, 4)=True And UserForm1.ComboBox4.Text <> "" Then
bl=True '當點號已輸入并且在Sheet4中存在時,將預布點信息(縣、鎮、村、地類、土壤、坐標、海拔)填入對應的文本框
UserForm1.ComboBox1=Sheet4.Cells(i, 9)
UserForm1.ComboBox2=Sheet4.Cells(i, 10)
UserForm1.ComboBox3=Sheet4.Cells(i, 11)
UserForm1.ComboBox8=Sheet4.Cells(i, 7)
UserForm1.ComboBox23=Sheet4.Cells(i, 6)
UserForm1.ComboBox5=Left(Sheet4.Cells(i, 13), 5) 'X坐標填入前5位
UserForm1.ComboBox6=Left(Sheet4.Cells(i, 12), 4)'Y坐標填入前4位
UserForm1.ComboBox7=Sheet4.Cells(i, 14)
End If
Next i
End Sub
1.4.2 GPS信息匹配模塊(GPSInfoMatch)
首先對GPS坐標信息表(Sheet2)的遍歷,之后讀取實際采樣點坐標、高程和采樣日期用以對窗體內相應的下拉選擇框(ComboBox)賦值。
Sub GPSInfoMatch ()
Dim bl As Boolean 'bl為匹配標記變量,同上
bl=False
For i=2 To 10000 '設定Sheet2為10000行
If UserForm1.ComboBox4.Text Like Sheet2.Cells(i, 1)=True And UserForm1.ComboBox4.Text <> "" Then
bl=True '當點號已輸入并且在Sheet2中存在時,將樣點實際位置信息(坐標、高程、采樣日期)填入對應的文本框
UserForm1.ComboBox5=Sheet2.Cells(i, 2)
UserForm1.ComboBox6=Sheet2.Cells(i, 3)
UserForm1.ComboBox7=Sheet2.Cells(i, 4)
UserForm1.ComboBox37=Sheet2.Cells(i, 5)
End If
Next i
End Sub
1.4.3 已有信息匹配模塊(ExsInfoMatch)
首先對數據庫記錄表(Sheet1)進行遍歷,如找到樣號則予以提示,這時系統進入已有記錄修改模式,需要將表中全部項目值賦值到窗體下拉選擇框內。否則,系統處于新紀錄錄入模式,無提示。
Sub ExsInfoMatch ()
Dim bl As Boolean
bl=False 'bl為匹配標記變量,同上
For i=2 To 1600
If UserForm1.ComboBox4.Text Like Sheet1.Cells(i, 6)=True And UserForm1.ComboBox4.Text <> "" Then
bl=True
MsgBox "此樣號記錄已經存在,現在進行修改"
'找到已有樣號的記錄,下面將Sheet1中全部項目顯示到窗體內
For k=1 To 33
UserForm1.Controls("ComboBox" & k).Value=Sheet1.Cells(i, k + 2)
Next k
End If
Next i
'采樣偏差及項目邏輯判斷代碼最后執行,這里略去
End Sub
1.4.4 數據導入模塊(DataImport)
遍歷數據庫記錄表(Sheet1)并找到末尾行位置,之后將窗體內全部項目值寫入該表(數據項的合理性檢查功能在窗體代碼中實現)。
Sub DataImport ()
Dim bl As Boolean 'bl為匹配標記變量,判斷Sheet1中是否已有該樣點記錄
bl=False
'找到已有記錄行號i以修改
For i=2 To 10000
If UserForm1.ComboBox4.Text Like Sheet1.Cells(i, 6)=True And UserForm1.ComboBox4.Text <> "" Then
bl=True
Exit For
End If
Next i
'定位至末尾行號i以新增一條記錄
If bl=False Then
For i=2 To 10000
If Sheet1.Cells(i, 6)="" Then
Exit For
End If
Next i
End If
'在第i行處導入數據
For k=1 To 39
Sheet1.Cells(i, k)=UserForm1.Controls("ComboBox" & k).Value
Next k
End Sub
1.4.5 字典更新模塊(DictUpdate)
首先清空舊的字典工作表(Sheet5),之后通過二重循環逐項讀取并判斷數據庫記錄表(Sheet1)中的值,如果是新出現的值就將其寫入字典工作表末行。
Sub DictUpdate ()
Dim bl As Boolean 'bl為判斷字典內每列值是否唯一的標記變量
bl=True
'清空舊字典
Sheets("sheet5").Range("2:65536").Delete
For j=1 To 39 '按列依次處理
k=2
For i=2 To 10000 'Sheet1表內按行依次處理
bl=True
For x=2 To k
'如果Sheet5中已存在相同記錄則繼續判斷下一條記錄,否則在Sheet5中新增一條記錄
If Sheet5.Cells(x, j)=CStr(Sheet1.Cells(i, j)) Then
bl=False
End If
Next x
If bl=True Then
Sheet5.Cells(k, j)=CStr(Sheet1.Cells(i, j))
k=k + 1
End If
Next i
Next j
End Sub
窗體按鈕的響應以及各模塊的調用主要通過窗體代碼來完成,代碼較長且繁瑣,這里不做過多介紹。系統運行情況見圖4,當首先錄入點號后系統會依次調用PreInfoMatch、GPSInfoMatch和ExsInfoMatch模塊,將除“周邊描述”外的大部分項目自動填寫完畢,“作物”、“水源條件”等少量項目會填入本地區的常見值,錄入人員僅需根據記錄卡對這些項目進行核對和必要的修改。當“采樣偏差”大于50m時會自動勾選“移點”選項以提示錄入移點原因。

圖4 建庫輔助系統運行效果圖Fig.4 Operation diagram of database building assistant system
1.4.6 繪圖類模塊設計
為了在圖上直觀反映數據點信息,需要將數據從Excel表轉出至MapGIS等制圖軟件中進行投點和屬性標注,操作較繁瑣。因此在本系統中增加了包含信息點位圖的數據檢查窗體,提供了一種可視化的數據檢驗途徑,建庫過程中可隨時通過單擊“入庫數據檢查”按鈕打開。數據檢查窗體提供了對已入庫信息的預覽功能,按已入庫點位坐標信息生成點位圖,并對指定點號、指定項目及項目值進行突出顯示。該窗體提供了對相應信息的修改、統改和撤銷更改功能。其中點位預覽功能主要通過運用Shapes對象AddShape方法的類模塊編程及窗體內調用代碼來實現。繪圖類模塊,包含的生成Box、Round的2個Function過程以及顯示圖形的Sub過程,Function代碼如下:
'根據矩形位置和大小信息繪制預覽圖框
Public Function Box(Left As Single, Top As Single, Width As Single, Height As Single) As Shape '定義的參數包括左上角坐標、寬度和高度
On Error GoTo ErrBox
Set Box=m_shtHolder.Shapes.AddShape(msoShapeRectangle, Left, Top, Width, Height)
Exit Function
ErrBox:
Set Box=Nothing
Exit Function
End Function
'根據樣點坐標和半徑繪制樣點標記圓
Public Function Round(CenterX As Single, CenterY As Single, Radius As Single) As Shape
'定義的參數包括標記圓的中心坐標和半徑
Dim Left As Single
Dim Top As Single
Dim Width As Single
Dim Height As Single
On Error GoTo ErrRound
Left=CenterX - Radius
Top=CenterY - Radius
Width=Radius * 2
Height=Radius * 2
Set Round=m_shtHolder.Shapes.AddShape(msoShapeOval, Left, Top, Width, Height)
Exit Function
ErrRound:
Set Round=Nothing
Exit Function
End Function
符號、字體、顏色等參數定義在窗體代碼中對繪圖類模塊的調用中完成,圖框范圍根據Sheet1中坐標最大范圍確定,單擊“信息預覽”按鈕后樣點信息預覽運行效果見圖5。樣點和編號用紅色圓圈和字體表示,當前查詢的值用藍色字表示,其他信息用黑色字表示。樣點總體分布符合實際情況,數據分布較直觀。數據修改功能通過調用數據導入模塊完成。

圖5 數據檢查界面運行效果圖Fig.5 Operation diagram of data check interface
標準模塊和類模塊使程序結構更加清晰,不僅有利于代碼的維護和重用,對程序功能的進一步擴展也有諸多好處,在地球化學數據采集與分析領域具有極好的適用性。
目前開展的區域地球化學調查工作采樣量往往較大,特別是目前各地重點開展的大比例尺土地質量地球化學調查和評價項目,按照4個點/km2~16個點/km2的采樣密度計算,1:50 000縣級調查實際采樣量往往達到數千甚至1萬余件,地市級采樣量可達數萬件,大量采樣原始記錄的電子化已成為一項較為繁重的工作。從本系統的實際應用情況來看,使用熟練后數據的錄入效率較傳統的表格錄入方式大幅提高,對減少勞動時間、降低人為錯誤幾率、提高工作效率均有較大的幫助,值得在類似項目開展過程中推廣應用。
從長遠來看,隨著技術的進步簡化數據采集過程是未來地球化學調查工作的大勢所趨。獲取數據是構建地質大數據的前提[11],地球化學調查體系也必將進入大數據信息主導的新時代[12],隨著地球化學調查在新領域的不斷探索和深入,對信息的采集和記錄方式也提出了更高的要求。地球化學調查中記錄項目隨著研究的變化也在不斷演變,不同地區、不同項目記錄內容和重點不同,為了使工作更加貼近地球化學工作的新方向,前人在記錄方式和手段上都做過很多有益的嘗試[13],各類工作規范也日益豐富[14-15],但傳統的原始信息記錄方式不便和效率偏低的問題依然比較突出。隨著電子通訊技術的進步,傳統的地球化學調查記錄方式和介質有必要向電子化、網絡化轉變,借此原始數據的采集和記錄完全可以做到“所見即所得”,這樣采樣信息數據庫在采樣完成后即可同步建立起來,既降低了信息采集和資料保存的人力物力成本,又提高了調查工作初始環節的效率。
隨著計算機編程語言的發展,VB程序在效率、結構復雜度、移植性等方面存在的諸多問題日益顯著,已逐漸被更高效、易用、跨平臺的程序語言如Java、Python等所取代。近年來在地質、測繪、環保、水利等部門已有大規模應用采樣終端機和APP的成功先例[16-17],可以預見大數據的采集與整合處理,必將成為未來物化探工作的重要組成部分,其程序設計思想和手段值得進一步研究、總結和借鑒,在今后物化探勘查相關規范、標準的制定過程中應對新的信息采集、匯總和處理手段予以考慮,并給予規范上了許可和技術上的引領。