任曉東 唐曉春 顏小華
VB.NET在遙測水位數據生成一潮推流數據文件中的應用
任曉東 唐曉春 顏小華
隨著江蘇水利現代化及科技的發展,大部分水文測站水位開始采用遙測方式記錄,如何從遙測數據文件中快速、準確地獲取資料整編的數據是一個問題。目前,蘇州沿江各站采用一潮推流法的測站,計算引排水量所需的原始數據文件,還沒有程序能從遙測數據文件中自動獲取。通過實踐發現,將遙測水位生成類似自記水位紙形式的CAD圖形,然后在圖形上畫出每潮引排水圖形,最后通過編程的方法獲取推流所需數據不失為一個簡單快速的方法。
這個過程分兩步進行:一是將遙測數據庫中導出的CSV文件轉成“浙江局1”的數據格式;二是將“浙江局1”的數據文件生成CAD圖形。
1.遙測數據轉換成“浙江局1”數據格式
從遙測數據庫導出的數據文件一般是以逗號分隔的CSV文件,數據格式如圖1所示。

圖1 遙測數據格式
根據南方片水文資料整編系統中“水位雨量固存數據轉換”模塊所列水位數據類型,選擇“浙江局1”數據格式為目標數據格式,通過VB.NET編程轉換后的數據如圖2所示。

圖2 “浙江局1”數據格式
數據格式轉換完成后,將缺少的數據補全,為下一步的CAD成圖作準備。
2.CAD成圖
為了同自記紙摘錄習慣保持一致,成圖時,將時間數據按一定比例轉成10進制數表示,水位不作轉換,直接采用。在默認圖層生成CAD圖形后,添加圖層“1”,推流數據線就在圖層“1”中用多段線勾畫,成圖部分代碼如下所示。

End If
End If
Next
acLayer=AcadApp.ActiveDocum -ent.Layers.Item(0)
AcadApp.ActiveDocument.Active -Layer=acLayer
AcadApp.ActiveDocument.Active -Linetype=AcadApp.ActiveDocument. Linetypes.Item("ByLayer")
AcadPl=objModelSpace.AddLight -WeightPolyline(Pt)
acLayer=AcadApp.ActiveDocu -ment.Layers.Add("1")'添加圖層
AcadApp.ActiveDocument.Active -Layer=acLayer
AcadApp.ZoomExtents()'顯示整個圖形
在圖層“1”勾畫的多段線推流數據線如圖3所示。

圖3 推流數據文件圖形

圖4 提取的一潮推流數據文件
提取數據時,首先采用AUTOCAD過濾組碼與組碼值創建選擇集,過濾組碼與組碼值可以通過命令(entget(car(entsel)))獲取的對象基本特性,例如:
((-1.<圖元名:7ef83b28>)(0. "LWPOLYLINE")(330.<圖元名:7ef81 -cc0>)(5."425")(100."AcDbEntity")(67.0)(410."Model")(8."JZD")(6. "Continuous")
其中比較常用的(0."LWPOLYL -INE")表示對象類型;(8."JZD")表示對象所在層所以還可以擴展或收縮過濾器,示例如下:
BuildFilter pType, pData,0,"LWPOLYLINE":建立圖上所有的多段線過濾器;
BuildFilterpType,pData,0,"LWPOLYLINE",8,"JZD":建立圖層是JZD的多段線過濾器;
BuildFilterpType,pData,0,"LWPOLYLINE",8,"JZD",62,3:建立圖層是JZD、顏色為綠色的多段線過濾器。
根據所繪圖形的特點,創建過濾器代碼為:
BuildFilter(pType,pData,0,"LWPOLYLINE",8,"1")
然后根據過濾條件,選取符合條件的實體對象,加入到選擇集中。創建選擇集代碼為
sset=CreateSelectionSet()
sset.Clear()
sset.Select(Common.AcSelect.acSelec -tionSetAll,,,pType,pData)
最后遍歷選擇集,獲取“開閘時間、關閘時間、開閘穩定水位、高(低)潮水位”數據,遍歷選擇集部分代碼如下所示,生成的一潮推流數據文件如圖4所示。
strData=sset(k).coordinates
For ii=0 To UBound(strData)-1 Step 2
Xcor=Round(Val(strData(ii)),4)'時間
Ifii=0 Then
strStartT=Replace(cc.GetMonthDay -HourMinute(iYear,Xcor,iFlag),"","")'開始時間
strStartWL=Round(Val(strData(ii+ 1)),2)'開閘穩定水位
ElseIfii=UBound(strData)-3 Then
strEndWL=Round(Val(strData(ii+ 1)),2)'高低水位
ElseIfii=UBound(strData)-1 Then
strEndT=Replace(cc.GetMonthDay -HourMinute(iYear,Xcor,iFlag),"","")'結束時間
If JudgeHour(strStartT,strEndT)Then
WT.WriteLine(strStartT&Chr(9)& strEndT&Chr(9)&strStartWL&Chr(9)&strEndWL)
End If
End If
Next
本文主要介紹了如何將遙測水位數據轉換成CAD圖形,然后在圖上畫出引排水圖形,最后從畫的圖形中提取一潮推流數據方法。實踐證明,該方法切實可行,實用性強,在保證自記紙摘錄習慣的同時,大大提高了工作效率和摘錄數據的準確性,為采用一潮推流法計算引排水量的水文站提供了一種簡便摘錄數據的方法。本程序已在VB.NET2010及AUTOCAD2010中測試通過■
(作者單位:江蘇省水文水資源勘測局蘇州分局 215006)
(專欄編輯:張 婷)