□楊 州 □賀旭東
(河南省信陽水文水資源勘測(cè)局)
現(xiàn)代防汛對(duì)水情服務(wù)的要求不斷提高。水文部門以實(shí)時(shí)水情數(shù)據(jù)庫和歷史水文數(shù)據(jù)庫為依托開發(fā)了很多基于桌面應(yīng)用的水情服務(wù)系統(tǒng),為各級(jí)防汛指揮部門提供及時(shí)可靠的水雨情信息。但是當(dāng)重要汛情發(fā)生或可能發(fā)生時(shí),相關(guān)防汛工作人員常需要深入一線開展工作,無法即時(shí)獲得實(shí)時(shí)水情信息。如果有一個(gè)移動(dòng)的工作環(huán)境,相關(guān)作業(yè)人員可以在任何地點(diǎn)及時(shí)掌握實(shí)時(shí)信息,即可協(xié)助開展防汛工作。隨著移動(dòng)通信技術(shù)的進(jìn)步,移動(dòng)電話的體積越來越小,計(jì)算速度越來越快,附加的功能如液晶顯示器、數(shù)字相機(jī)、藍(lán)牙、因特網(wǎng)等,再加上目前市面上移動(dòng)服務(wù)商所提供的網(wǎng)絡(luò)帶寬已達(dá)2Mbps(3G)的規(guī)格,使防汛工作人員通過移動(dòng)電話隨時(shí)隨地掌握實(shí)時(shí)水情信息成為可能。
現(xiàn)在移動(dòng)電話相關(guān)的開發(fā)工具的標(biāo)準(zhǔn)已逐漸統(tǒng)一,因此,我們可以像一般計(jì)算機(jī)一樣在移動(dòng)電話上開發(fā)特定的軟件程序。目前移動(dòng)電話主要的操作系統(tǒng)有Linux、WindowsMobi1e、Symbian,它們分別支持 C++、Windows Mobi1e.NET、Symbian C++、Symbian Python等程序開發(fā)的語言??紤]到國內(nèi)個(gè)人計(jì)算機(jī)的操作系統(tǒng)一般都是Microsoft的Windows系列,我們?cè)陂_發(fā)設(shè)計(jì)水情查詢系統(tǒng)時(shí)選擇Windows Mobi1e作為軟件平臺(tái)。WindowsMobi1e將熟悉的Windows桌面擴(kuò)展到了個(gè)人設(shè)備中,是微軟為手持設(shè)備推出的“移動(dòng)版Windows”。
具有靜態(tài)公網(wǎng)IP地址,使得移動(dòng)設(shè)備能夠通過GPRS、EDGE網(wǎng)絡(luò)連接到單位內(nèi)部網(wǎng)絡(luò)服務(wù)器。
服務(wù)器操作系統(tǒng)為Windows Server 2003,支持IIS信息發(fā)布,SQLServer2000為數(shù)據(jù)庫平臺(tái)??蛻舳瞬捎没谖④沇indowsMobi1e操作系統(tǒng)的智能手機(jī)。
WindowsMobi1e水情查詢系統(tǒng)通過處理實(shí)時(shí)雨水情、遙測(cè)等基礎(chǔ)信息,制作易于查詢的雨水情圖表,以助于實(shí)現(xiàn)防汛科學(xué)指揮,為減災(zāi)防災(zāi)提供決策支持。
水情查詢系統(tǒng)具有查詢信陽地區(qū)各雨量站實(shí)時(shí)雨情信息及流域內(nèi)主要控制站水位、流量等水情信息的功能。實(shí)時(shí)雨情信息通過列表和圖形兩種方式顯示流域內(nèi)各站降雨量列表和降雨量分布圖。流域內(nèi)主要控制站的水位、流量及其相應(yīng)水位、流域過程線等實(shí)時(shí)水情信息可以通過列表方式顯示,也可以通過流域內(nèi)主要控制站水情監(jiān)視圖以圖形方式顯示。
WindowsMobi1e水情查詢系統(tǒng)采用Microsoft Visua1Studio 2008集成開發(fā)環(huán)境,使用C#進(jìn)行開發(fā)。
智能設(shè)備.NETCompact Framework只支持到SQLServer的TCP/IP連接,不支持跨越不同數(shù)據(jù)庫的分布式事務(wù)和連接池。同時(shí),System.Data.Sq1C1ient不像HttpWeb Request在有線或者Wi-Fi網(wǎng)絡(luò)不可用時(shí)會(huì)自動(dòng)建立GPRS連接。因此,智能設(shè)備在使用System.Data.Sq1C1ient查詢和更新數(shù)據(jù)庫前需要專門的方法來管理GPRS連接。而連接管理器是WindowsMobi1e的基礎(chǔ)部分,當(dāng)前只以Native API的形式暴露,我們需要將其封裝為托管版本的 API。Connection Manager API由 ConnMgrMapURL、ConnMgrEstab1ishConnection、ConnMgrEstab1ishConnectionSync、ConnMgrRe1easeConnection、ConnMgrConnectionStatus等 11 個(gè)函數(shù)組成,在.NETCompactFramework可以通過靜態(tài)DLL入口點(diǎn)的方式來訪問本機(jī)代碼庫中這些私有對(duì)象成員,為便于調(diào)用,可將其封裝成一個(gè)管理連接的類。
在管理設(shè)備網(wǎng)絡(luò)連接的類設(shè)計(jì)完成之后,接下來還需要為智能設(shè)備設(shè)計(jì)一個(gè)能夠進(jìn)行數(shù)據(jù)庫訪問的類,使設(shè)備能夠通過GPRS或EDGE連接訪問存儲(chǔ)于實(shí)時(shí)水文數(shù)據(jù)庫中的降雨量、水位等信息。在NETCompact Framework類庫中,System.Data.Sq1C1ient命名空間描述了一個(gè)類集合,這個(gè)類集合可用于訪問托管空間中的SQLServer數(shù)據(jù)庫。我們可以使用ADO.NET對(duì)象,通過Sq1c1ient從SQLServer以只讀方式取得數(shù)據(jù)。為此,查詢系統(tǒng)使用一個(gè)自定義類,負(fù)責(zé)存儲(chǔ)用戶的用戶名與密碼,打開連接和使用Sq1DataReader讀取數(shù)據(jù)。在取得數(shù)據(jù)后釋放Sq1Command和Sq1Connection對(duì)象,避免內(nèi)存泄露。由于.NET Compact Framework不使用連接池,在程序編寫過程中,需要?jiǎng)?chuàng)建一個(gè)對(duì)連接對(duì)象的引用,在設(shè)備獲取連接后,保持連接狀態(tài),直到連接中斷或程序退出再關(guān)閉連接并銷毀連接引用。
為使智能設(shè)備能夠顯示流域降雨量分布圖和水情監(jiān)視圖,需要為智能設(shè)備編寫處理地理信息的代碼。在處理地理信息時(shí),有兩種處理方式可供選擇,一是采用Arc/Info,Genasys等公司生產(chǎn)的專業(yè)GIS開發(fā)工具,進(jìn)行組件式開發(fā);另一個(gè)是自主設(shè)計(jì)實(shí)現(xiàn)GIS功能。采用GIS組件式開發(fā)實(shí)際上只是在別人系統(tǒng)的基礎(chǔ)上作一些簡單的應(yīng)用開發(fā),開發(fā)的成果需要這些專業(yè)工具的支持平臺(tái),意味著需要支付費(fèi)用購買專業(yè)GIS組件的授權(quán),同時(shí)系統(tǒng)沒有自主的系統(tǒng)版權(quán)??紤]到智能設(shè)備在顯示地圖等地理信息時(shí)對(duì)矢量圖形平臺(tái)要求不是很高,對(duì)于水情查詢而言,我們自主設(shè)計(jì)實(shí)現(xiàn)GIS主要的功能即可。
一個(gè)基本的GIS系統(tǒng)主要完成對(duì)空間矢量數(shù)據(jù)及性質(zhì)數(shù)據(jù)的管理。為了便于對(duì)空間矢量數(shù)據(jù)的處理,我們可以把矢量對(duì)象抽象為點(diǎn)、線、面3種類型。在水情查詢中,水文站、雨量站、水位站等,可以作為點(diǎn)對(duì)象處理;河道、堤防、道路等可以作為線對(duì)象處理;水庫、湖泊、流域、滯洪區(qū)、行政區(qū)劃等可以作為面對(duì)象處理。地圖上點(diǎn)、線、面的坐標(biāo)數(shù)據(jù)可以通過數(shù)字化儀或?qū)S玫腉IS工具提取。在獲取地圖圖形經(jīng)緯度之后,需要建立地理經(jīng)緯度坐標(biāo)到設(shè)備像素坐標(biāo)的轉(zhuǎn)換。Windows映像方式就是Windows下的邏輯坐標(biāo)方式。MM_TEXT方式(Windows默認(rèn)映像方式)允許應(yīng)用程序利用設(shè)備像素工作。屏幕(窗口)的原點(diǎn)約定在左上角,X和Y的正方向分別為向右和向下。地理經(jīng)緯度坐標(biāo)到設(shè)備像素坐標(biāo)轉(zhuǎn)換步驟:一是確定設(shè)備像素坐標(biāo)原點(diǎn)的經(jīng)緯度。在默認(rèn)映像方式下,將待繪制地圖西北角的地理經(jīng)緯度坐標(biāo)作為設(shè)備像素坐標(biāo)原點(diǎn)。二是將設(shè)備像素坐標(biāo)原點(diǎn)坐標(biāo)單位由度轉(zhuǎn)化為弧度,計(jì)算出像素坐標(biāo)原點(diǎn)在地球橢球橫軸、縱軸上投影的長度。三是計(jì)算帶繪制點(diǎn)到設(shè)備像素坐標(biāo)原點(diǎn)在橢球橫軸、縱軸上投影的長度。四是設(shè)置合適的地理距離和像素點(diǎn)距離轉(zhuǎn)換系數(shù),將地圖上兩點(diǎn)的地理距離轉(zhuǎn)換為設(shè)備上兩點(diǎn)的像素點(diǎn)距離。經(jīng)過上述步驟,便可得到待繪地理坐標(biāo)相對(duì)于某設(shè)備像素坐標(biāo)原點(diǎn)的以像素為單位的偏移量,為隨后的圖形繪制提供支持。
繪制矢量圖時(shí),需要為待繪圖形建立一定的數(shù)據(jù)表,作為程序配置文件,便于程序檢索。對(duì)于直線圖形元素可以建立包含線寬、圖層索引、筆色、畫刷顏色、起訖點(diǎn)坐標(biāo)等字段的數(shù)據(jù)表存儲(chǔ)待繪制的圖形元素信息。對(duì)于曲線、圓弧、標(biāo)注矢量文本、多邊形區(qū)域,可以建立相似的數(shù)據(jù)表來存儲(chǔ)諸如線型、是否填充等圖形繪制參數(shù)。
現(xiàn)在,智能設(shè)備的屏幕配置有很多種。屏幕物理顯示區(qū)域尺寸不僅與其分辨率有關(guān),還與其解析度dpi有關(guān)。所以在繪制圖形時(shí),在代碼中最好通過Graphics.DpiX與DpiY屬性檢測(cè)當(dāng)前設(shè)備顯示器的dpi,根據(jù)dpi的不同,編寫相應(yīng)的繪圖代碼。如果不進(jìn)行檢測(cè),也應(yīng)當(dāng)將窗體的AutoSca1eMode屬性設(shè)置為dpi,以便程序根據(jù)設(shè)備顯示器的dpi保持合適的物理尺寸。
繪制顯示圖像,常用的方法是使用PictureBox控件。對(duì)于河流、水系、行政區(qū)劃等圖形,可以把它們放在同一個(gè)圖層中進(jìn)行繪制。該圖層繪制時(shí)可以使用窗體的OnPaint方法,OnPaint方法有一個(gè)PaintEventArgs參數(shù),其Graphics屬性暴露了Graphics對(duì)象,我們可以通過它來執(zhí)行直線、曲線、區(qū)域等繪制操作。Graphics對(duì)象包含了用于繪制圖形的DrawRectang1e、DrawP1oygon、DrawE11ipse、DrawLines和DrawLine方法,還有用于繪制文本 的 DrawText方 法 。 Fi11Rectang1e、Fi11E11ipse、Fi11P1oygon 和Fi11Region方法可以用來為圖形填充顏色。對(duì)于通過訪問數(shù)據(jù)庫獲取的降雨量、水位等性質(zhì)數(shù)據(jù),可以繪制在另外的圖層中。最后將兩個(gè)圖層合并,完成分布圖的顯示。
WindowsMobi1e水情查詢系統(tǒng)利用移動(dòng)無線網(wǎng)絡(luò),實(shí)現(xiàn)了實(shí)時(shí)水情信息隨時(shí)隨地獲取。為防汛指揮人員及時(shí)獲取水情資料,進(jìn)行科學(xué)指揮調(diào)度,最大限度地避免或減少災(zāi)害損失提供了有效的支撐。