成麗婷
(山西省水利水電勘測(cè)設(shè)計(jì)研究院 山西太原030024)
水文流域參數(shù)是進(jìn)行各項(xiàng)水文分析計(jì)算的基礎(chǔ)數(shù)據(jù),這些參數(shù)的快速準(zhǔn)確的獲取直接影響到水文分析計(jì)算的效率與精度。研究簡(jiǎn)單易行的水文流域參數(shù)的獲取方法,不僅可以保證參數(shù)的準(zhǔn)確性,為后續(xù)的水文分析計(jì)算工作提供可靠的數(shù)據(jù),而且大大縮短了基礎(chǔ)性工作的耗時(shí),為后續(xù)的核心工作預(yù)留出寶貴的時(shí)間。尤其是在一些大型水利工程的前期工作中,往往涉及到成百上千個(gè)區(qū)域的水文參數(shù)的獲取,若依靠現(xiàn)在的一些技術(shù)和方法,效率和精度上很難兼顧。
河長(zhǎng)比降J是基本的水文流域參數(shù),河流縱比降[1]的計(jì)算還需要獲取分段河長(zhǎng),計(jì)算公式如下:
式中,L為自流域出口斷面起沿主河道至分水嶺的最長(zhǎng)距離,包括主河道以上溝形不明顯部分坡面流程的長(zhǎng)度,當(dāng)河道上有瀑布、跌坎、陡坡時(shí),應(yīng)當(dāng)把突然變動(dòng)比降段兩端的特征點(diǎn),都作為計(jì)算加權(quán)平均比降時(shí)的分段點(diǎn),以使計(jì)算的比降反映沿程實(shí)際的水力條件,km;Z0、Z1…Zn為自流域出口斷面起沿流程比降突變特征點(diǎn)的地面高程,m;L1、L2…Ln為兩個(gè)特征值點(diǎn)之間的距離,km;L 為 L1、L2…Ln之和,見(jiàn)圖1。
圖1 河流縱比降計(jì)算示意圖
基于1:10000或1:50000地形圖計(jì)算比降,Z0、Z1…Zn需要人工讀取,L1、L2…Ln數(shù)值通過(guò)Auto CAD獲取。隨著計(jì)算機(jī)技術(shù)的發(fā)展和繪圖軟件Auto CAD[2]在水文技術(shù)行業(yè)的廣泛應(yīng)用,水文流域參數(shù)的獲取變得簡(jiǎn)單易行,而且相比之前具有以下優(yōu)勢(shì):第一,再現(xiàn)性好,拼接完畢的圖紙,勾勒的分水嶺,繪制的河流等等數(shù)據(jù)都可以保存下來(lái),可以隨時(shí)查閱和校核;第二,消除了讀數(shù)誤差;第三,操作方便等等。即便如此,筆者在工作中量取河長(zhǎng)計(jì)算比降的過(guò)程中發(fā)現(xiàn)傳統(tǒng)的Auto CAD功能依然存在不足,尤其數(shù)據(jù)量大時(shí),河長(zhǎng)的獲取相當(dāng)繁瑣耗時(shí)。但VBA[3](Visual Basic for Applications)應(yīng)用軟件集成于Auto CAD以后,上述問(wèn)題迎刃而解。本研究以Windows XP,Auto CAD和VBA為開(kāi)發(fā)環(huán)境,研制了獲取河長(zhǎng)參數(shù)軟件,并進(jìn)行了實(shí)例應(yīng)用,以期為水文分析的參數(shù)獲取提供可靠簡(jiǎn)便的操作方法,更是希望拋磚引玉,充分應(yīng)用Auto CAD和VBA開(kāi)發(fā)平臺(tái)解決水文工作中的問(wèn)題。
VBA(Visual Basic for Application)是一種完全面向?qū)ο篌w系結(jié)構(gòu)的編程語(yǔ)言,提供了一個(gè)基于對(duì)象的編程環(huán)境,具有豐富的開(kāi)發(fā)功能,能直接在Auto CAD內(nèi)部執(zhí)行,開(kāi)發(fā)者能夠方便地替換和添加Auto CAD系統(tǒng)內(nèi)部的模塊。在VBA中,Auto CAD中的實(shí)體作為對(duì)象而存在,對(duì)這些實(shí)體的操作作為方法,編制處理過(guò)程或宏命令,從而實(shí)現(xiàn)了開(kāi)發(fā)者進(jìn)入到Auto CAD內(nèi)部進(jìn)行用戶(hù)化處理[4]。由于VBA依附于主應(yīng)用程序,因此它與主應(yīng)用程序之間的通信簡(jiǎn)單而富有效率,其代碼完全是在進(jìn)程內(nèi)部執(zhí)行的。
應(yīng)用VBA獲取河長(zhǎng)的步驟:
(1)建立選擇集作為放置圖形元素的容器;
(2)運(yùn)用Select方法[5]選取圖形對(duì)象,select方法具有5種選擇方式,可以選擇全部對(duì)象、上次創(chuàng)建的對(duì)象、上次選擇的對(duì)象、矩形窗口內(nèi)對(duì)象、矩形窗口內(nèi)以及與邊界相交的對(duì)象;
(3)運(yùn)用Selectonscreen方法讓用戶(hù)手動(dòng)選擇對(duì)象,如同在Auto CAD中選取對(duì)象一樣,可以逐一選取,也可以用窗口選取。如果需要有條件地選擇對(duì)象,比如選擇所有的多段線等,需要為Selectonscreen方法增加過(guò)濾器參數(shù),通過(guò)過(guò)濾器可以從所選取的圖形對(duì)象中篩選出某一類(lèi)特定的圖形對(duì)象;
(4)選擇集過(guò)濾后所得到的圖形對(duì)象屬性數(shù)據(jù)的輸出。
Auto CAD批量獲取各相鄰高程點(diǎn)之間的距離,即分段河長(zhǎng),有3種方法,本文以一簡(jiǎn)單例子對(duì)上述三種方法進(jìn)行對(duì)比。例子中提到的長(zhǎng)度是指Auto CAD中量取的圖上距離未利用比例尺轉(zhuǎn)化為實(shí)際距離。
(1)方法一,借助多段線直接繪制自流域出口斷面起沿主河道至分水嶺的最長(zhǎng)河長(zhǎng)L,由于河道是曲折蜿蜒的,所以在點(diǎn)繪兩相鄰高程點(diǎn)之間河長(zhǎng)時(shí)需要放置多個(gè)點(diǎn),繪制河長(zhǎng)L共放置49個(gè)點(diǎn),見(jiàn)圖2。利用“工具”—“查詢(xún)”—“列表顯示”,顯示結(jié)果中包含了河長(zhǎng)L中所有點(diǎn)的X、Y坐標(biāo)值,表1中僅列出部分?jǐn)?shù)據(jù)。首先利用勾股定理分別計(jì)算相鄰兩點(diǎn)之間長(zhǎng)度,然后分組計(jì)算各相鄰高程點(diǎn)之間的河長(zhǎng)。高程點(diǎn)Z0與Z1區(qū)間,即相對(duì)應(yīng)于河長(zhǎng)L1,共包含8個(gè)點(diǎn),1-8點(diǎn)區(qū)間距離之和11.7mm即河長(zhǎng)L1;高程點(diǎn)Z1與Z2區(qū)間,即相對(duì)應(yīng)于河長(zhǎng)L2,共包含5個(gè)點(diǎn),9-13點(diǎn)區(qū)間距離之和8.03mm即河長(zhǎng)L2。以此類(lèi)推可獲取各相鄰高程點(diǎn)之間的河長(zhǎng)。這種方法只繪制一條多段線,為順應(yīng)河道走勢(shì)需布設(shè)多個(gè)點(diǎn),為獲取分段河長(zhǎng)需在各高程點(diǎn)處布設(shè)點(diǎn),而且需在布設(shè)點(diǎn)的同時(shí)記錄好每個(gè)點(diǎn)屬于哪個(gè)分段河長(zhǎng)區(qū)間,然后將點(diǎn)進(jìn)行分組,分別獲取各組多段線長(zhǎng)度之和,才能與各個(gè)高程區(qū)間的河長(zhǎng)一一對(duì)應(yīng)。
(2)方法二,逐一繪制相鄰高程點(diǎn)之間河長(zhǎng) L1、L2…Ln,共繪制8條多段線,見(jiàn)圖3。然后選中全部多段線,利用“工具”—“查詢(xún)”—“列表顯示”,顯示結(jié)果中分塊顯示不同河長(zhǎng)的諸多屬性特征,見(jiàn)圖4。除了長(zhǎng)度特征外,還包含了圖層、線型、面積等特征,獲取長(zhǎng)度信息只能通過(guò)人工篩選并手工錄入到EXCEL中。這種方法繪制n條多段線,CAD命令輸出的是每條多段線的諸多信息,只能通過(guò)人工篩選長(zhǎng)度信息并手工錄入EXCEL中,n越大,人工篩選和手工錄入的工作量就越大,不僅如此,在手工錄入大量數(shù)據(jù)時(shí)為避免錄入數(shù)據(jù)錯(cuò)誤還需進(jìn)行多次數(shù)據(jù)復(fù)核。
(3)方法三,逐一繪制相鄰高程點(diǎn)之間河長(zhǎng) L1、L2…Ln,共繪制8條多段線,見(jiàn)圖2。應(yīng)用VBA,編制宏,實(shí)現(xiàn)2個(gè)功能,其一建立選擇集作為一容器,經(jīng)這個(gè)容器過(guò)濾后選擇集中只保留多段線對(duì)象;其二,輸出上述選擇集中多段線的長(zhǎng)度信息。然后只需運(yùn)行宏,選中全部多段線,即可將各個(gè)高程區(qū)間的河長(zhǎng)數(shù)據(jù)直接輸出到EXCEL中。
圖2 方法一示意圖
圖3 方法二、三示意圖
圖4 方法二結(jié)果示意圖
以上可看出,方法一直接點(diǎn)繪整段河長(zhǎng)L,獲得49個(gè)點(diǎn)的X、Y坐標(biāo),計(jì)算出各相鄰兩點(diǎn)之間的距離,對(duì)49個(gè)點(diǎn)進(jìn)行分組與高程區(qū)間一一對(duì)應(yīng),即得出分段河長(zhǎng)值;方法二、方法三分段繪制河長(zhǎng)L1、L2…L8,分別通過(guò)人工錄入、VBA輸出數(shù)據(jù)到EXCEL中。方法一和方法三都避免了人工錄入數(shù)據(jù),但方法一需要人工對(duì)數(shù)據(jù)進(jìn)行分組;方法二與方法三思路基本一致,但在數(shù)據(jù)整理輸出時(shí),方法二通過(guò)人工篩選錄入數(shù)據(jù)方式,而方法三簡(jiǎn)單易行,實(shí)現(xiàn)了將Auto CAD圖形相對(duì)應(yīng)的屬性數(shù)據(jù)直接輸出到EXCEL中。從表1可以看出三種方法所獲取的結(jié)果完全一致,但方法三大大提高了工作效率,尤其是在數(shù)據(jù)量大時(shí)優(yōu)勢(shì)更為突出。
表1 三種方法獲取分段河長(zhǎng)結(jié)果表
VBA(Visual Basic for Application),具有豐富的開(kāi)發(fā)功能,能直接在Auto CAD內(nèi)部執(zhí)行,從而實(shí)現(xiàn)了開(kāi)發(fā)者進(jìn)入到Auto CAD內(nèi)部進(jìn)行用戶(hù)化處理。本文基于VBA研制出在Auto CAD中獲取河長(zhǎng)軟件,克服了傳統(tǒng)方法依賴(lài)人工、不能實(shí)現(xiàn)Auto CAD與EXCEL數(shù)據(jù)的快捷與直接傳遞的缺陷,應(yīng)用實(shí)例對(duì)此方法與傳統(tǒng)方法進(jìn)行比較,通過(guò)比較得出,VBA實(shí)現(xiàn)了批量將河長(zhǎng)數(shù)據(jù)快速直接地導(dǎo)入EXCEL,提高了工作效率。
[1]山西省水利廳.山西省水文計(jì)算手冊(cè) [M].鄭州:黃河水利出版社.2011.3
[2]李善鋒主編.Auto CAD2012中文版基礎(chǔ)教程[M].北京:人民郵電出版社.2012.9
[3]張帆主編.Auto CAD VBA二次開(kāi)發(fā)教程[M].北京:清華大學(xué)出版社.2006.1
[4]陳 亮.基于VBA的堤防CAD系統(tǒng)研究與開(kāi)發(fā)[D].華南理工大學(xué)碩士學(xué)位論文.2004:6-7
[5]喬平安主編.Visual Basic6.0程序設(shè)計(jì)[M].北京:人民郵電出版社.2013.2