杜景林,朱興宇
(南京信息工程大學(xué) 電子與信息工程學(xué)院,江蘇 南京210044)
關(guān)于WRF模式[1]計(jì)算出來的NetCDF數(shù)據(jù)[2]分析處理技術(shù),目前已經(jīng)有NCAR Graphic[3]、Vis5D[4]和GRADS[5]等軟件,但是這些分析處理軟件主要用于科學(xué)研究,甚至需要用戶自行編寫代碼,同時(shí)這些軟件與用戶的交互不友好,且無法記錄用戶操作數(shù)據(jù)記錄。另外有一些軟件系統(tǒng)可以讀取WRF模式數(shù)據(jù),例如NETCDF.xlsm[6]可以讀取NetCDF數(shù)據(jù)文件,但主要是以表格形式呈現(xiàn),不利于呈現(xiàn)數(shù)據(jù)動(dòng)態(tài)特點(diǎn),用戶無法獲取對(duì)數(shù)據(jù)的直觀認(rèn)識(shí)。為了提高用戶和平臺(tái)的交互性,方便用戶查詢數(shù)據(jù)以及對(duì)可視化結(jié)果進(jìn)行控制,本文著重分析NetCDF數(shù)據(jù)格式以及NetCDF數(shù)據(jù)文件讀取方法,分析OpenGL[7]等繪圖方法的具體應(yīng)用,分別對(duì)平臺(tái)功能、平臺(tái)流程以及平臺(tái)框架進(jìn)行設(shè)計(jì),最后用C++語言進(jìn)行平臺(tái)開發(fā),實(shí)現(xiàn)平臺(tái)整體功能,并在Windows操作系統(tǒng)下進(jìn)行平臺(tái)運(yùn)行與測(cè)試。
OpenGL (graphics library)圖形系統(tǒng)是圖形硬件的一種軟件接口,主要用于科學(xué)數(shù)據(jù)可視化,實(shí)體仿真,三維動(dòng)畫以及虛擬現(xiàn)實(shí)等方面[8],OpenGL 旨在獨(dú)立于操作系統(tǒng)和硬件環(huán)境,因此OpenGL 不包含用于執(zhí)行窗口任務(wù)和與用戶交互等函數(shù),只包含對(duì)應(yīng)的三維圖形繪制函數(shù),必須通過具體的窗口系統(tǒng)集成OpenGL函數(shù)才可以使用OpenGL繪圖功能。OpenGL 是一個(gè)狀態(tài)機(jī),可以設(shè)置各種狀態(tài),然后讓這些狀態(tài)一直生效,直到再次修改它們[9]。OpenGL工作流程如圖1所示[9]。
圖1 OpenGL工作流程
Qt是一個(gè)多平臺(tái)的C++圖形用戶界面應(yīng)用程序框架,為不同平臺(tái)下的圖形界面編程提供統(tǒng)一接口,具有一次編寫,隨處編譯的特點(diǎn)。一次開發(fā)的Qt應(yīng)用程序可以移植到不同的平臺(tái)上,只需重新編譯即可運(yùn)行[10]。Qt提供了OpenGL模塊,方便OpenGL 在多個(gè)操作系統(tǒng)中的應(yīng)用。其中OpenGL模塊定義了OpenGL 函數(shù)在Qt中的接口規(guī)范,用戶可以直接調(diào)用該模塊而不需要直接調(diào)用本地API進(jìn)行三維繪圖。QGLWidget[11]類是用來渲染OpenGL 三維場(chǎng)景的窗口空間,其提供了3 個(gè)函數(shù)用于開發(fā),分別是paintGL,resizeGL 和initializeGL 函數(shù),分別用于渲染場(chǎng)景,改變窗口大小以及初始化OpenGL環(huán)境[7]。
NetCDF (network common data format)網(wǎng)絡(luò)通用數(shù)據(jù)格式最早是由美國(guó)國(guó)家科學(xué)委員會(huì)資助的計(jì)劃Unidata所發(fā)展而來,旨在提供一種可以通用的數(shù)據(jù)存取方式[12],一種面向數(shù)組型數(shù)據(jù)、適于網(wǎng)絡(luò)共享且跨平臺(tái)的數(shù)據(jù)格式描述和編碼標(biāo)準(zhǔn)[13]。NetCDF 文件結(jié)構(gòu)包括文件頭說明信息和數(shù)據(jù)塊區(qū)域,文件頭信息包括整個(gè)文件屬性和單個(gè)變量屬性等,數(shù)據(jù)塊區(qū)域按照變量進(jìn)行存儲(chǔ),一般用于存儲(chǔ)多維數(shù)據(jù),支持與機(jī)器無關(guān)的科學(xué)數(shù)據(jù),滿足數(shù)據(jù)共享,每一個(gè)NetCDF文件包括單點(diǎn)的觀測(cè)值,時(shí)間序列,規(guī)則排列的網(wǎng)格,以及其它文件等。NetCDF文件適合存儲(chǔ)氣象數(shù)據(jù),提供了C,F(xiàn)ortran和Java[14]等數(shù)據(jù)存取接口。NetCDF文件具有說明文檔,確保數(shù)據(jù)準(zhǔn)確讀取,存取方式為直接存取所需數(shù)據(jù),極大減少不必要的讀取時(shí)間,同時(shí)支持跨平臺(tái)操作,這樣便于軟件系統(tǒng)跨平臺(tái)運(yùn)行。
該平臺(tái)將WRF模式數(shù)據(jù)首次可視化結(jié)果呈現(xiàn)在地球模型上,則需要建立一個(gè)3D 地球模型以及顯示地球經(jīng)緯度和相關(guān)的地理高程信息。用戶能夠自主選擇讀取數(shù)據(jù)文件,選擇物理變量以及查詢數(shù)據(jù)等。物理量數(shù)據(jù)需要進(jìn)行可視化展示,由于數(shù)據(jù)的屬性不同,故需要設(shè)計(jì)數(shù)據(jù)傳輸函數(shù)進(jìn)行數(shù)據(jù)與可視要素之間的轉(zhuǎn)換,同時(shí)用戶可以控制數(shù)據(jù)傳輸函數(shù),首次可視化結(jié)果類似于熱度圖形式。用戶能夠與原始數(shù)據(jù)交互,平臺(tái)能夠提供用戶鼠標(biāo)和鍵盤與數(shù)據(jù)交互的可視化結(jié)果,二次可視化結(jié)果需要以多種形式展示。平臺(tái)能夠展示數(shù)據(jù)隨時(shí)間和高度變化而變化的效果,也即時(shí)間動(dòng)畫和高度動(dòng)畫。平臺(tái)需要具有很好的移植性和可擴(kuò)展性,平臺(tái)可以運(yùn)行在不同的操作系統(tǒng)上。
整體功能設(shè)計(jì)如圖2所示。
圖2 平臺(tái)功能設(shè)計(jì)
數(shù)據(jù)流程主要介紹文件中數(shù)據(jù),內(nèi)存中數(shù)據(jù),緩存區(qū)中數(shù)據(jù)以及顯存中數(shù)據(jù)之間的關(guān)系。以下分別介紹各個(gè)流程模塊:
(1)NetCDF數(shù)據(jù)文件到內(nèi)存:由于NetCDF數(shù)據(jù)文件中的數(shù)據(jù)不可能直接進(jìn)行可視化,因此需要先讀取到內(nèi)存中,然后程序調(diào)用內(nèi)存中的數(shù)據(jù)并對(duì)其進(jìn)行可視化。
(2)內(nèi)存到緩存:內(nèi)存中的數(shù)據(jù)不可以直接進(jìn)行繪制,需要發(fā)送到幀緩沖區(qū)中。利用OpenGL 的雙緩沖、頂點(diǎn)數(shù)據(jù)緩沖區(qū)以及顏色緩沖區(qū)、顯示列表等技術(shù)對(duì)數(shù)據(jù)進(jìn)行組織和操作,以便于數(shù)據(jù)的重復(fù)顯示和快速顯示。
(3)緩存到顯存:由于顯卡的計(jì)算速度遠(yuǎn)大于CPU 以及OpenGL使用客戶端到服務(wù)器機(jī)制,將數(shù)據(jù)發(fā)送到顯存中可大大加速屏幕的顯示速度以及減少屏幕刷新的延遲時(shí)間。
(4)緩存到內(nèi)存:從可視化結(jié)果中獲取的數(shù)據(jù)包括點(diǎn)數(shù)據(jù)和區(qū)域數(shù)據(jù),從緩存中獲取坐標(biāo)信息,然后根據(jù)坐標(biāo)信息從內(nèi)存中查找數(shù)據(jù)。
(5)內(nèi)存到數(shù)據(jù)庫(kù):平臺(tái)使用Oracle[15]數(shù)據(jù)庫(kù)記錄用戶的操作指令和用戶與數(shù)據(jù)交互的數(shù)據(jù)值,一般記錄少量數(shù)據(jù)點(diǎn)即可,根據(jù)少量數(shù)據(jù)點(diǎn)便可以從NetCDF 數(shù)據(jù)文件讀取所有的數(shù)據(jù)。
平臺(tái)整體流程設(shè)計(jì)如圖3所示。
圖3 數(shù)據(jù)流程設(shè)計(jì)
平臺(tái)采用經(jīng)典的三層架構(gòu)構(gòu)建整個(gè)軟件平臺(tái),分別是數(shù)據(jù)層,業(yè)務(wù)層和表現(xiàn)層。采用三層架構(gòu)可以將數(shù)據(jù)存取,數(shù)據(jù)處理和數(shù)據(jù)可視化3個(gè)功能模塊分離,使程序模塊清晰,有利于組織平臺(tái)結(jié)構(gòu),同時(shí)有助于平臺(tái)的功能擴(kuò)展和提高代碼的可讀性和理解性。三層架構(gòu)介紹如下:
(1)數(shù)據(jù)層:數(shù)據(jù)層主要處理數(shù)據(jù)文件和物理變量的讀取以及記錄用戶操作記錄和用戶交互數(shù)據(jù),主要利用NetCDF的C 語言接口,但是該接口主要是面向過程的,因此使用面向?qū)ο蟮乃枷敕庋b這些接口函數(shù),寫符合要求的讀取數(shù)據(jù)類。同時(shí),需要利用數(shù)據(jù)庫(kù)接口函數(shù)與數(shù)據(jù)庫(kù)進(jìn)行交互,包括讀取數(shù)據(jù)庫(kù)數(shù)據(jù)和數(shù)據(jù)寫入數(shù)據(jù)庫(kù)。
(2)業(yè)務(wù)層:業(yè)務(wù)層主要響應(yīng)用戶的動(dòng)作和行為,也即處理用戶的操作指令,起到數(shù)據(jù)層和表現(xiàn)層之間的溝通橋梁作用。數(shù)據(jù)層將數(shù)據(jù)讀取完,業(yè)務(wù)層處理這些數(shù)據(jù),處理完之后發(fā)送到表現(xiàn)層,表現(xiàn)層將這些數(shù)據(jù)可視化。另用戶根據(jù)表現(xiàn)層可視化結(jié)果,與其進(jìn)行交互,業(yè)務(wù)層處理用戶行為后,數(shù)據(jù)層按照業(yè)務(wù)層的要求讀取數(shù)據(jù)之后,將數(shù)據(jù)傳遞到業(yè)務(wù)層,業(yè)務(wù)層通知表現(xiàn)層進(jìn)行可視化結(jié)果繪制。該層主要是模塊化操作,用戶選擇不同的物理量,不同的物理量具有不同的數(shù)據(jù)信息,需要根據(jù)不同的物理量設(shè)置不同的數(shù)據(jù)模板和配置模板,每次處理數(shù)據(jù)時(shí),根據(jù)數(shù)據(jù)對(duì)應(yīng)的物理量不同,選擇不同的數(shù)據(jù)模板和配置模板。同時(shí),用戶的繪圖指令不同,因此該層需要解析用戶操作行為。
(3)表現(xiàn)層:表現(xiàn)層主要負(fù)責(zé)將業(yè)務(wù)層傳遞過來的數(shù)據(jù)進(jìn)行可視化,根據(jù)用戶的可視化需求選擇不同的可視化方案對(duì)數(shù)據(jù)進(jìn)行可視化,將可視化結(jié)果直觀地呈現(xiàn)在屏幕中。
圖4為平臺(tái)架構(gòu),圖中標(biāo)示了各個(gè)層需要實(shí)現(xiàn)的功能。
圖4 三層架構(gòu)
Qt中已經(jīng)包含OpenGL模塊,方便在多個(gè)操作系統(tǒng)中進(jìn)行OpenGL 程序開發(fā)。QGLWidget與OpenGL 混合編程,有效降低了在Qt中進(jìn)行OpenGL開發(fā)的難度。在絕大多數(shù)情況下,QGLWidget可以像QWidget一樣使用,只是使用OpenGL的函數(shù)替代Qpainter進(jìn)行繪制。QGLWidget提供了3個(gè)虛函數(shù)用以重載實(shí)現(xiàn)OpenGL 的繪制,使得程序源代碼簡(jiǎn)潔且易讀。圖5 給出了QT 程序調(diào)用OpenGL函數(shù)繪圖機(jī)制。
圖5 Qt程序調(diào)用OpenGL函數(shù)繪圖機(jī)制
數(shù)據(jù)層處理的數(shù)據(jù)主要是存取NetCDF 數(shù)據(jù)文件和存取Oracle數(shù)據(jù)庫(kù)中的數(shù)據(jù)。其中NetCDF 數(shù)據(jù)文件為平臺(tái)主要處理的數(shù)據(jù)對(duì)象,而Oracle數(shù)據(jù)庫(kù)中的數(shù)據(jù)主要記錄用戶的行為操作和交互數(shù)據(jù)。處理NetCDF 數(shù)據(jù)主要利用NetCDF提供的C 語言接口,將這些接口函數(shù)封裝成自定義的讀取數(shù)據(jù)的類,方便平臺(tái)開發(fā)和擴(kuò)展。存儲(chǔ)Oracle數(shù)據(jù)庫(kù)中的數(shù)據(jù)主要是編譯Oracle提供的OCI接口,然后程序利用OCI接口進(jìn)行數(shù)據(jù)記錄的存取。
封裝讀取NetCDF 數(shù)據(jù)文件的C 語言接口的類主要有NcFile類,NcDim 類,NcVar類和NcAtt類。NcFile類用于讀取NetCDF文件,其中包括維度信息,變量信息以及文件屬性信息等,NcDim 類用于讀取獲取維度名稱,大小以及判斷是否是無限維等,NcVar類可以返回變量名稱,變量類型,變量對(duì)應(yīng)的維度,變量屬性以及如何定點(diǎn)定區(qū)域讀取變量數(shù)據(jù),NcAtt主要用于讀取屬性信息,返回屬性名稱,屬性類型以及屬性值個(gè)數(shù)等。
OCI驅(qū)動(dòng)集成一組應(yīng)用程序開發(fā)接口,在Oracle中提供了一組庫(kù)函數(shù),可以使用庫(kù)函數(shù)連接數(shù)據(jù)庫(kù),調(diào)用SQL和事務(wù)控制等。由于Qt自帶Sqlite和ODBC 驅(qū)動(dòng),但是沒有Oracle OCI驅(qū)動(dòng),則需要預(yù)先自行編譯OCI驅(qū)動(dòng)。
數(shù)據(jù)處理主要用于處理數(shù)據(jù)層傳遞過來的數(shù)據(jù)和響應(yīng)用戶的操作行為。
不同的物理量有不同的數(shù)據(jù)信息,首先對(duì)傳遞過來的物理量進(jìn)行識(shí)別,然后按照對(duì)應(yīng)的物理量配置方法對(duì)數(shù)據(jù)進(jìn)行操作,然后將數(shù)據(jù)傳遞給傳輸函數(shù),傳輸函數(shù)對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換得到數(shù)據(jù)值對(duì)應(yīng)的顏色值信息,主要通過類Var-Setter實(shí)現(xiàn),類中包括識(shí)別物理量函數(shù),物理量參數(shù)配置以及傳輸函數(shù)等。圖6為主要實(shí)現(xiàn)過程。
圖6 數(shù)據(jù)到顏色映射轉(zhuǎn)換實(shí)現(xiàn)
用戶在與可視化結(jié)果進(jìn)行交互的過程中,有鼠標(biāo)和鍵盤等事件,數(shù)據(jù)處理對(duì)不同的用戶行為進(jìn)行不同的解析,將解析后的不同操作通知表現(xiàn)層,表現(xiàn)層根據(jù)相應(yīng)的繪圖函數(shù),繪制出不同的折線圖以及等值線圖等。
用戶鼠標(biāo)交互時(shí),主要圍繞鼠標(biāo)相對(duì)于窗口的位置坐標(biāo)展開。由于數(shù)據(jù)存取是按照地球經(jīng)緯度信息以及高度和時(shí)間進(jìn)行存取,而鼠標(biāo)窗口位置坐標(biāo)和地球經(jīng)緯度坐標(biāo)不是同一個(gè)坐標(biāo)系,則需要進(jìn)行坐標(biāo)轉(zhuǎn)換。首先,程序獲取到鼠標(biāo)窗口坐標(biāo),然后鼠標(biāo)窗口坐標(biāo)經(jīng)過一次逆轉(zhuǎn)換,得到該點(diǎn)在三維空間中的位置坐標(biāo),進(jìn)而根據(jù)得到的三維空間中的位置坐標(biāo),再進(jìn)行一次逆轉(zhuǎn)換,便可獲得該點(diǎn)相對(duì)于地球模型的經(jīng)緯度位置坐標(biāo),數(shù)據(jù)層便可根據(jù)經(jīng)緯度位置信息和用戶設(shè)置的時(shí)間高度信息在數(shù)據(jù)文件中或者內(nèi)存中查詢,就可以得到需要的原始數(shù)據(jù)。
OpenGL處理的數(shù)據(jù)的坐標(biāo)信息都是三維空間中的三維坐標(biāo),因此在將數(shù)據(jù)傳遞到OpenGL 繪圖函數(shù)類之前的第一步就是將數(shù)據(jù)的經(jīng)緯度信息轉(zhuǎn)換成三維坐標(biāo)。式 (1)給出經(jīng)緯度和三維坐標(biāo)的轉(zhuǎn)換關(guān)系,圖7給出了經(jīng)緯度到三維坐標(biāo)的轉(zhuǎn)換,圖中三維坐標(biāo)系為OpenGL 中采用的三維坐標(biāo)系,向上為Y 軸正方向,向右為X 軸正方向,屏幕向外為Z軸正方向,a為經(jīng)度偏移
圖7 經(jīng)緯度到三維坐標(biāo)
用戶交互過程中產(chǎn)生的數(shù)據(jù)操作記錄和操作的數(shù)據(jù)會(huì)被記錄到數(shù)據(jù)庫(kù)中,由于Oracle數(shù)據(jù)庫(kù)存儲(chǔ)的數(shù)據(jù)一般為關(guān)系型數(shù)據(jù),因此多維數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)之前需要經(jīng)過一個(gè)轉(zhuǎn)換。將多維數(shù)據(jù)按照時(shí)間高度經(jīng)緯度信息轉(zhuǎn)換為一個(gè)唯一的ID 值,見式 (2),按照此ID 值將對(duì)應(yīng)的數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中。從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)時(shí),依然需要按照式(2)進(jìn)行逆轉(zhuǎn)換得到時(shí)間高度和經(jīng)緯度信息
基于Qt和OpenGL技術(shù)的融合,極大地方便三維可視化的實(shí)現(xiàn),但是Qt中提供的OpenGL繪圖功能有限,僅僅用于普通3D 圖形繪制,平臺(tái)中使用OpenGL 的顯示列表,幀緩沖區(qū)等技術(shù),因此需要使用OpenGL 自身的庫(kù)函數(shù),程序中自定義類用于封裝OpenGL 本地函數(shù)庫(kù),方便程序開發(fā)和功能拓展。程序?qū)⒂糜谌S圖形繪圖和二維圖形繪圖的功能函數(shù)類進(jìn)行封裝,形成一個(gè)多組件融合的交互式可視化圖形庫(kù)。在需要繪制可視化圖形時(shí),直接響應(yīng)用戶指令,程序調(diào)用圖形庫(kù)的類函數(shù)即可實(shí)現(xiàn)圖形繪制。
數(shù)據(jù)可視化主要實(shí)現(xiàn)OpenGL 繪制圖形函數(shù)和QCustomPlot[16]繪制折線圖直方圖等以及調(diào)用NCL 腳本語言[17]進(jìn)行等值線等繪圖操作。分別有初始化場(chǎng)景類,可視化類和用戶交互類。初始化場(chǎng)景類主要包括OpenGL 的初始化環(huán)境配置類??梢暬惏@示時(shí)間類,地球模型類EarthModel,數(shù)據(jù)貼圖類DataTex,圖表繪制類QCustom-Plot以及等值線圖類VarNCL 和圖片保存類。用戶交互類分別有場(chǎng)景旋轉(zhuǎn)類MoRotate,縮小和放大類MoResize,以及鼠標(biāo)拾取類MoMouse。以下將主要的類進(jìn)行介紹:
圖8 轉(zhuǎn)換投影算法
OpenGL的初始化環(huán)境配置類中封裝清除緩沖區(qū)函數(shù),設(shè)置投影模式函數(shù),計(jì)算模型視圖矩陣 (modeMatrix)、投影矩陣 (projMatrix)和視點(diǎn) (viewprot)矩陣函數(shù),矩陣和矢量運(yùn)算和平面法向量計(jì)算函數(shù)等。
地球模型類EarthModel中實(shí)現(xiàn)地球模型繪制,以及地球紋理貼圖和地理高程信息顯示等功能。
數(shù)據(jù)貼圖類DataTex實(shí)現(xiàn)經(jīng)緯度準(zhǔn)確定位,數(shù)據(jù)顏色值繪制等功能。
QCustomPlot類為用于繪圖的Qt C++部件,獨(dú)立的類庫(kù),用于繪制曲線和圖表等,同時(shí)QCustomPlot類提供圖片保存函數(shù),程序中的圖片保存類需封裝QCustomPlot提供的圖片保存函數(shù)以及保存OpenGL繪制結(jié)果函數(shù)類。
等值線圖類VarNCL主要封裝NCL腳本語言函數(shù)和獲取參數(shù)函數(shù)和調(diào)用NCL工作平臺(tái)函數(shù)。NCL 主要在Linux操作系統(tǒng)環(huán)境中采用工作站方式工作,因此在Windows中需要模擬Linux環(huán)境。同時(shí)NCL的工作環(huán)境與程序開發(fā)環(huán)境獨(dú)立,因此在程序和NCL工作環(huán)境之間需要連接,以便于在程序中啟動(dòng)NCL運(yùn)行環(huán)境以及調(diào)用NCL繪圖函數(shù)。
用戶交互類中主要包括用戶鼠標(biāo)拖動(dòng)旋轉(zhuǎn)場(chǎng)景和縮小放大可視化結(jié)果類,鼠標(biāo)獲取區(qū)域或單點(diǎn)屏幕坐標(biāo)類,所有數(shù)據(jù)二次可視化都依靠鼠標(biāo)拾取來實(shí)現(xiàn)。其中鼠標(biāo)拖動(dòng)較難實(shí)現(xiàn),鼠標(biāo)直接操作二維界面,而場(chǎng)景是三維圖形,因此本文采用以下轉(zhuǎn)換投影算法,具體過程如圖8所示。
屏幕中對(duì)應(yīng)的數(shù)據(jù)點(diǎn)坐標(biāo)都是二維的,然而OpenGL處理的數(shù)據(jù)是三維坐標(biāo),因此在數(shù)據(jù)對(duì)應(yīng)到屏幕的可視化結(jié)果過程中需要進(jìn)行坐標(biāo)轉(zhuǎn)換。OpenGL 物體三維坐標(biāo)到屏幕坐標(biāo)轉(zhuǎn)換過程如圖9所示。
本平臺(tái)采用Visual Studio 2010集成開發(fā)軟件,同時(shí)采用Qt 4.8,結(jié)合Oracle 10g數(shù)據(jù)庫(kù)技術(shù),NetCDF文件讀取技術(shù),NCL腳本語言和QCustomPlot以及OpenGL 三維圖技術(shù)等。系統(tǒng)的測(cè)試運(yùn)行環(huán)境為Windows 7 操作系統(tǒng),圖10和圖11是該系統(tǒng)運(yùn)行的部分效果圖,從總體測(cè)試效果看,平臺(tái)運(yùn)行穩(wěn)定良好。
圖9 OpenGL物體坐標(biāo)到屏幕坐標(biāo)轉(zhuǎn)換過程
圖10 鼠標(biāo)交互某一時(shí)間和高度層的經(jīng)緯度區(qū)域數(shù)據(jù)顯示
圖11 某點(diǎn)數(shù)據(jù)變化趨勢(shì)交互顯示
用戶選擇經(jīng)緯度范圍內(nèi)的區(qū)域信息可視化結(jié)果:用戶點(diǎn)擊鼠標(biāo)右鍵保持不放,拖動(dòng)鼠標(biāo)移動(dòng),移動(dòng)至某位置,鼠標(biāo)右鍵放開,得到起始和結(jié)束鼠標(biāo)窗口位置坐標(biāo),通過兩次坐標(biāo)轉(zhuǎn)換關(guān)系函數(shù),得到經(jīng)緯度信息,根據(jù)得到的經(jīng)緯信息和用戶選擇的高度和時(shí)間信息,將指令發(fā)送到數(shù)據(jù)層,數(shù)據(jù)層直接按照經(jīng)緯度和高度時(shí)間信息讀取數(shù)據(jù),將讀取出來的數(shù)據(jù)傳遞到業(yè)務(wù)層,業(yè)務(wù)層按照用戶的需求,對(duì)數(shù)據(jù)進(jìn)行修剪和插值操作等,將經(jīng)過處理后的數(shù)據(jù)傳遞到表現(xiàn)層,表現(xiàn)層中NCL工作站將繪制業(yè)務(wù)層傳遞過來的數(shù)據(jù)。
用戶與第一次可視化結(jié)果,也即地球模型中顯示出來的數(shù)據(jù)進(jìn)行交互,用戶可以選擇同一時(shí)間、同一高度和不同經(jīng)緯度信息數(shù)據(jù),同一時(shí)間、同一經(jīng)緯度和不同高度數(shù)據(jù),同一高度、同一經(jīng)緯度和不同時(shí)間的數(shù)據(jù),選擇某一操作后,業(yè)務(wù)層按照要求在內(nèi)存中選擇數(shù)據(jù)傳遞給表現(xiàn)層,表現(xiàn)層調(diào)用QcustomPlot類中函數(shù)進(jìn)行折線圖的繪制。
圍繞WRF 模式運(yùn)行產(chǎn)生的中尺度氣象數(shù)據(jù),利用OpenGL強(qiáng)大的3D 繪圖功能以及現(xiàn)有的多形式的第三方繪圖插件,將這些繪圖函數(shù)封裝成自定義的類,將Qt作為平臺(tái)的總體設(shè)計(jì)框架,程序模塊化方便了平臺(tái)的擴(kuò)展。由于采用的現(xiàn)有技術(shù)都具有跨平臺(tái)的特性,因此整個(gè)平臺(tái)具有良好的移植性,可運(yùn)行在不同的操作系統(tǒng)上,只需要重新編譯即可。本平臺(tái)方便氣象專業(yè)人士和研究人員對(duì)中尺度模式氣象數(shù)據(jù)的動(dòng)態(tài)變化有直觀的把握,以便做出相應(yīng)決策。
[1]WANG Xiaojun,MA Hao.Progress of application of the weather research and forecast(WRF)model in China [J].Advances in Earth Science,2011,26 (11):1191-1199 (in Chinese). [王曉君,馬浩.新一代中尺度預(yù)報(bào)模式(WRF)國(guó)內(nèi)應(yīng)用進(jìn)展 [J].地球科學(xué)進(jìn)展,2011,26 (11):1191-1199.]
[2]SHAO Baomin,CHU Weixian,QI Suiping.Design of objectoriented NetCDF reading desktop software [J].Shandong Science,2012,25 (6):69-73 (in Chinese). [邵寶民,初偉先,漆隨平.面向?qū)ο蟮腘etCDF文件桌面化讀取軟件的設(shè)計(jì)[J].山東科學(xué),2012,25 (6):69-73.]
[3]HUA Wenyuan,WANG Jiarun,KANG Liang,et al.Design and Implementation of 5D meteor visualization based on OSG[J].Computer Engineering and Design,2009,30 (5):1282-1284 (in Chinese).[華文元,王家潤(rùn),康亮,等.基于OSG五維氣象可視化軟件的設(shè)計(jì)及實(shí)現(xiàn) [J].計(jì)算機(jī)工程與設(shè)計(jì),2009,30 (5):1282-1284.]
[4]TU Nini,CHEN Jing,XIA Rudi.The use points of a four-dimension graphics software Vis5D [J].Sichuan Meteorology,2007,27 (99):39-41 (in Chinese). [屠妮妮,陳靜,夏茹娣.一種四維繪圖軟件Vis5D 使用要點(diǎn)簡(jiǎn)述 [J].四川氣象,2007,27 (99):39-41.]
[5]ZHANG Li,SHENG Shuanghe,SUN Xiangming,et al.Processing of non-corresponding grid data from NCEP by using GRADS [J].Journal of Meteorological Research and Application,2009,30 (3):39-44 (in Chinese). [張麗,申雙和,孫向明,等.用GRADS處理NCEP資料中的非對(duì)應(yīng)格點(diǎn)數(shù)據(jù)[J].氣象研究與應(yīng)用,2009,30 (3):39-44.]
[6]LongShaoAn,Reading nc file[DB/OL].[2014-07-23].http://blog.163.com/jey_df/blog/static/18255016120121029471299/(in Chinese).[LongShaoAn,關(guān)于nc文件的讀?。跠B/OL].[2014-07-23].http://blog.163.com/jey _df/blog/static/1825501612012 1029471299/.]
[7]LUO Junsong,DENG Fei,LU Hanyu,et al.Research of 3D visualization technology based on QT [J].Computer Measurement &Control,2013,21 (3):797-799 (in Chinese). [羅俊松,鄧飛,盧涵宇,等.基于Qt的三維可視化技術(shù)研究[J].計(jì)算機(jī)測(cè)量與控制,2013,21 (3):797-799.]
[8]MA Chunyan,CHAI Huabin,LIU Changhua.3Dvisualization expression of the point cloud based on OpenGL [J].Journal of Henan Polytechnic University(Natural Science),2009,28 (3):299-302 (in Chinese). [馬春艷,柴華彬,劉昌華.基于OpenGL的點(diǎn)云三維可視化表達(dá) [J].河南理工大學(xué)學(xué)報(bào)(自然科學(xué)版),2009,28 (3):299-302.]
[9]Dave Shreiner,The Khronos OpenGL ARB Working Group.OpenGL programming guide [M].LI Jun,XU Bo,transl.7th ed.Beijing:Machinery Industry Press,2010 (in Chinese). [Dave Shreiner,The Khronos OpenGL ARB Working Group.OpenGL編程指南 [M].李軍,徐波,譯.7 版.北京:機(jī)械工業(yè)出版社,2010.]
[10]CAI Zhiming,LU Chuanfu,LI Lixia,et al.Proficient in Qt4programming [M].Beijing:Electronic Industry Press,2008 (in Chinese). [蔡志明,盧傳富,李立夏,等.精通Qt4編程 [M].北京:電子工業(yè)出版社,2008.]
[11]GUO Tao,LIU Mingyang,BIAN Zhibin.Research and implementation on visualization of surfer data based on Qt and OpenGl[J].Journal of Yangtze University (Nat Sci Edit),2010,7 (3):287-289 (in Chinese).[郭韜,劉明洋,卞志彬.基于Qt和OpenGL的Surfer數(shù)據(jù)可視化研究 [J].長(zhǎng)江大學(xué)學(xué)報(bào) (自然科學(xué)版),2010,7 (3):287-289.]
[12]ZHANG Lin,GAO Yuchun,YANG Jinhong,et al.NetCDF data uploading and product display of phased-array weather radar based on VC++platform [J].Meteorological Science and Techinology,2010,38 (2):230-234 (in Chinese).[張林,高玉春,楊金紅,等.基于VC++平臺(tái)的相控陣天氣雷達(dá)NetCDF數(shù)據(jù)讀取與產(chǎn)品顯示 [J].氣象科技,2010,38 (2):230-234.]
[13] WANG Xianghong,LIU Jiping,XU Shenghua,et al.Visualization of marine environment data based on NetCDF data model[J].Science of Surveying and Mapping,2013,38 (2):59-61 (in Chinese). [王想紅,劉紀(jì)平,徐勝華,等.基于NetCDF數(shù)據(jù)模型的海洋環(huán)境數(shù)據(jù)三維可視化研究[J].測(cè)繪科學(xué),2013,38 (2):59-61.]
[14]Chic O,del Rio E,Garcia-Ladona E.IVADO:An oceanographic data analysis and visualization tool based on ION/IDL and Java using netCDF interface [C]//MTS/IEEE Conference and Exhibition,2001.
[15]ZHANG Hui,ZHAO Yuliang,XU Jiang,et al.Query optimization research on mass of data based on oracle database[J].Computer Technology and Development,2012,22(2):165-167 (in Chinese).[張輝,趙郁亮,徐江,等.基于Oracle數(shù)據(jù)庫(kù)海量數(shù)據(jù)的查詢優(yōu)化研究 [J].計(jì)算機(jī)技術(shù)與發(fā)展,2012,22 (2):165-167.]
[16]Emanuel Eichhammer,QcustomPlot[DB/OL].[2014-07-22].http://www.qcustomplot.com/inde x.com/index.php/introduction.
[17]WANG Jizhu,WANG Yongqing,LI Chunhu.NCL application of graphical weather data [J].Shandong Meteorology,2007,27 (109):33-36 (in Chinese). [王繼竹,王詠青,李春虎.NCL在氣象數(shù)據(jù)圖形化中的應(yīng)用 [J].山東氣象,2007,27 (109):33-36.]