魏勝利
(河北省張家口水文水資源勘測局,河北 張家口075000)
水文是關(guān)系到國計民生的基礎(chǔ)性科學(xué),它為防汛抗旱、工程規(guī)劃設(shè)計、水資源開發(fā)利用與保護等提供了大量翔實可靠的信息,發(fā)揮了極具不可或缺的作用。
近年來,水文科學(xué)的研究取得了長足的進步。遙感技術(shù)的應(yīng)用,使同時觀測大范圍內(nèi)的宏觀水文現(xiàn)象成為可能,水文模擬方法、水文隨機分析方法、水文系統(tǒng)分析方法,使人們研究水文現(xiàn)象的能力發(fā)展到新的水平。
尤其是電子計算機的應(yīng)用,使水文科學(xué)從水文觀測到基本規(guī)律的研究,由人力和機械操作,發(fā)展到以電子計算機為核心的自動化[1]。
但長期以來,我國絕大部分地區(qū)水文原始資料的計算仍采用手工方式,不僅費時費力而且容易出錯,與水文現(xiàn)代化、信息化的要求極不適應(yīng)。因此,開發(fā)水文原始資料計算程序是非常必要的且必須的。
我國幅員廣闊,河流眾多,不同的流域、不同的省市所觀測項目不盡相同,河道特性也不相同。因此,程序一定要具有最大限度的普適性。
水文原始資料計算,有的復(fù)雜,有的則非常簡單。對于簡單的計算,則沒有編程的必要。
計算表格的式樣,數(shù)據(jù)的輸入、輸出,計算的過程,計算的結(jié)果,要符合水文測驗與整編規(guī)范。
程序界面要簡潔,操作要簡單。數(shù)據(jù)編輯要容易靈活。
程序要能夠應(yīng)用,要解決水文工作存在中的實際問題。計算結(jié)果要能夠打印,作為正式成果,用以審核和存檔。
水文原始資料計算需要完成表格繪制、數(shù)據(jù)輸入、數(shù)據(jù)編輯、計算、計算結(jié)果輸出、文件保存、打印等操作[2]。
用任何一種編程語言比如C + +、delphi、VB 等實現(xiàn)計算、保存、打印這些功能都不是難事,但要繪制復(fù)雜的表格,那種語言都不是太得心應(yīng)手,編輯數(shù)據(jù)也不是太方便。
經(jīng)過一段時間的研究與摸索,發(fā)現(xiàn)把VB 和excel 結(jié)合起來,可以很好的解決這一問題。用excel實現(xiàn)繪制表格、編輯數(shù)據(jù)、文件保存與打印,用VB6.0 調(diào)用excel 對象實現(xiàn)計算、控制功能,這樣,既減少了編程的工作量,又解決了表格繪制、數(shù)據(jù)編輯等難題。
程序的開發(fā)工具為VISUAL BASIC 6.0 + MICROSOFT EXCEL 2003。
開發(fā)過程主要有2個部分:
本程序采用分布式模塊化設(shè)計,程序的每個功能諸如流量計算、水位計算、斷面計算等對應(yīng)一個模塊。模塊化的好處是,各個模塊相互獨立,結(jié)構(gòu)清楚,便于修改和維護。主要包括:
1)制作原始資料模板文件。依據(jù)水文測驗規(guī)范,設(shè)計原始資料文件表格,在文件中輸入原始資料觀測數(shù)據(jù),以供主程序使用。
2)編寫流量、水位等原始資料計算模塊,每個模塊為一個獨立的程序包,完成讀取原始數(shù)據(jù)、處理計算、寫入文件,錯誤處理等功能。
3)編寫主程序,完成總體控制、模塊調(diào)用等功能。
3.2.1 懸浮窗體
可以看到,很多應(yīng)用程序如QQ、東方快車等采取了浮動窗體技術(shù)。本程序也采用了這一技術(shù),程序運行后,程序窗口將浮動于屏幕的左上角。當(dāng)打開很多應(yīng)用程序時,此窗體總處于最前面。程序界面簡潔實用,使用方便。
程序?qū)崿F(xiàn)這一功能需要調(diào)用以下API 函數(shù):
Private Declare Function GetCursorPos Lib“user32”(lpPoint As POINTAPI)As Long(獲得鼠標指針在屏幕坐標上的位置)。
Private Declare Function GetWindowRect Lib“user32”(ByVal hwnd As Long,lpRect As RECT)As Long(獲得窗口在屏幕坐標中的位置)。
Private Declare Function PtInRect Lib “user32”(lpRect As RECT,ByVal ptx As Long,ByVal pty As Long)As Long(判斷指定的點是否在指定的矩形內(nèi)部)。
Private Declare Function SetWindowPos Lib“user32”(ByVal hwnd As Long,ByVal hWndInsertAfter As Long,ByVal x As Long,ByVal Y As Long,By-Val cx As Long,ByVal cy As Long,ByVal wFlags As Long)As Long(準備用來使窗體始終在最前面)。
Private Declare Function MoveWindow Lib“user32”(ByVal hwnd As Long,ByVal x As Long,By-Val Y As Long,ByVal nWidth As Long,ByVal nHeight As Long,ByVal bRepaint As Long)As Long(用來移動窗體)。
部分代碼如下:'
窗體背景顏色(用戶可隨意改動)'
判斷鼠標指針是否位于窗體拖動區(qū)
3.2.2 FSO 對象模型遍歷文件
對存儲介質(zhì)中的文件遍歷是操作系統(tǒng)中文件管理最基本的操作。本程序在制作數(shù)據(jù)文件過程中,需要讀取特定的也就是計算原始資料的excsl 文件,那么就需要遍歷文件,進行檢索,將其他無關(guān)的excel文件過濾掉,本程序使用FSO 對象模型實現(xiàn)這一功能。
FSO 對象模型工具可使應(yīng)用程序創(chuàng)建、改變、移動和刪除文件或文件夾,以及檢測是否存在指定的文件或文件夾,如果存在,在哪里等功能,同時FSO對象模型工具也能獲取文件或文件夾的有關(guān)信息,諸如名稱、創(chuàng)建日期或最近修改日期等等。
首先創(chuàng)建自定義的FSO 文件夾對象,然后使用For Each 循環(huán)即可。以下為部分代碼。
3.2.3 程序注冊
為保護軟件開發(fā)者的合法權(quán)益,方法之一是注冊軟件。注冊后的合法用戶才能正常使用,未注冊用戶在使用次數(shù)期滿后將不能運行程序,只有獲得注冊碼才能繼續(xù)使用,
用戶首先需要形成注冊文件,將注冊文件通過E-mail 等方式交給軟件開發(fā)者,作者收到文件后通過一定的算法形成注冊碼,然后返還給用戶,完成注冊。
完成這一功能需要調(diào)用API 函數(shù)讀寫注冊表,編寫加密、解密算法模塊等。以下為部分代碼。
4.1.1 水位計算
可計算逐日水位、逐日平均水位,月總數(shù)、月平均水位、月最高水位及出現(xiàn)日期、月最低水位及出現(xiàn)日期,最高水溫及出現(xiàn)日期、最低水溫及出現(xiàn)日期、月平均水溫、月總數(shù)??商幚砗痈?、連底凍等各種復(fù)雜情況。
4.1.2 流量計算
可完成整個流量計算過程,從而計算出斷面流量、水道斷面面積、平均流速、最大測點流速、平均水深、最大測點流速,如觀測了比降水位還可計算出水面比降和糙率。
能夠進行多點法流量計算??商幚砹魉賰x法、小浮標法、小浮標流速儀聯(lián)合施測、水面浮標法等各種不同測驗方法流量測驗??梢蕴幚硭浪?、分流等特殊情況。
4.1.3 含沙量計算
輸入水樣容積、濾紙重量、紙+沙量,即可計算單樣含沙量。
4.1.4 蒸發(fā)量計算
計算逐日蒸發(fā)量、月最大蒸發(fā)量及出現(xiàn)日期、月最小蒸發(fā)量及出現(xiàn)日期、月總數(shù),可處理結(jié)冰及合并量觀測,也可處理蒸發(fā)器溢流及加入水量情況。
4.1.5 斷面計算
輸入起點距和測點高程,程序自動查讀水面寬,進而計算各水位級斷面面積。本程序可對滿足約束條件的任意形狀斷面進行計算。
4.1.6 水位流量關(guān)系表計算
輸入整數(shù)水位級的流量,然后可計算出每個水位所對應(yīng)的流量。
綜上所述,使用本程序可完成一個水文站大部分的計算任務(wù)。
4.2.1 水力半徑計算
很多情況下,都需要計算水力半徑,比如推求洪峰、洪水計算等。以往很多時候,用平均水深來近似代替水力半徑,這會有一定誤差,尤其是窄深形狀的河流,誤差會更大。通過本程序可計算濕周,和面積相除,即可計算出不同水位級的水力半徑。
4.2.2 數(shù)據(jù)文件制作
20 世紀90年代中期,河北省水文水資源勘測局開始使用程序整編水文資料,推流及各種成果表均由程序自動完成,減少了整編工作量,提高了資料精度。
然而程序運行時需要數(shù)據(jù)文件,也就是將一組組原始數(shù)據(jù)編輯到數(shù)據(jù)文件中,工作量也不小,且如數(shù)據(jù)錯誤會導(dǎo)致程序運行結(jié)果錯誤。上文提到,
編制程序計算了原始資料,計算結(jié)果保存在excel 表中,利用excel 表中的數(shù)據(jù)便可制作各種需要的數(shù)據(jù)文件。
4.2.2.1 實測流量成果表數(shù)據(jù)文件制作
將用以上程序計算的每一份流量作為一個單獨的excel 文件保存,然后讀取每份流量的特征值諸如斷面位置、測驗方法、施測時間、流量、斷面面積、最大水深、平均水深、最大流速、平均流速、水位等數(shù)據(jù),按測驗流量的先后時間排序,寫入文本文件,即可作為整編程序的數(shù)據(jù)文件。
以上介紹了實測流量成果表數(shù)據(jù)文件的制作,除此之外,還可以制作水位、含沙量、逐日蒸發(fā)量成果表、水溫月年統(tǒng)計表的數(shù)據(jù)文件,方法與制作流量的數(shù)據(jù)文件類似,在此不多贅述。
4.2.3 原始資料連算
程序提供了資料連算功能,可一次性的將所有資料連續(xù)計算。其好處是當(dāng)程序改動后,不必逐份的再去計算每份資料,減少了工作量。
本程序經(jīng)過不斷的修改、完善,于2008年開始在河北省張家口水文水資源勘測局15個水文站使用,基層水文站除降水、水尺零點高程測量外其他大部分計算工作均可由程序完成。
計算結(jié)果符合水文測驗規(guī)范規(guī)定,打印后作為正式原始資料成果。
使用程序計算原始資料,大大減輕了水文站的工作量,提高了資料精度。較以往的手工計算只能保存紙介質(zhì)外,還可以保存為電子文檔,查詢使用更為方便。從使用的情況看,效果還是十分顯著的。
1)水文原始資料計算繁瑣、單調(diào)、重復(fù),耗費了大量的時間與人力,因而開發(fā)水文原始資料計算程序是非常必要的。
2)隨著科技的進步,技術(shù)的發(fā)展,特別是計算機技術(shù)日新月異,編程語言功能越來越來越強大,開發(fā)水文原資料計算程序是完全可行的。
3)使用程序計算水文原始資料,減輕了工作量,提高了工作效率,降低了錯誤率,效果是十分顯著的。
[1]Charles Petzold.Microsoft Windows 程 序 設(shè) 計——Visual Basic.NET 語言描述[M]. 武漢:華中科技大學(xué)出版社,2004:49-50.
[2]希望圖書創(chuàng)作室.Visual Basic 6.0 Professional 專業(yè)版循序漸進教程[M]. 北京:北京希望電子出版社,1999:101-102.