杜景林,朱興宇
(南京信息工程大學 電子與信息工程學院,江蘇 南京210044)
關于WRF模式[1]計算出來的NetCDF數據[2]分析處理技術,目前已經有NCAR Graphic[3]、Vis5D[4]和GRADS[5]等軟件,但是這些分析處理軟件主要用于科學研究,甚至需要用戶自行編寫代碼,同時這些軟件與用戶的交互不友好,且無法記錄用戶操作數據記錄。另外有一些軟件系統可以讀取WRF模式數據,例如NETCDF.xlsm[6]可以讀取NetCDF數據文件,但主要是以表格形式呈現,不利于呈現數據動態特點,用戶無法獲取對數據的直觀認識。為了提高用戶和平臺的交互性,方便用戶查詢數據以及對可視化結果進行控制,本文著重分析NetCDF數據格式以及NetCDF數據文件讀取方法,分析OpenGL[7]等繪圖方法的具體應用,分別對平臺功能、平臺流程以及平臺框架進行設計,最后用C++語言進行平臺開發,實現平臺整體功能,并在Windows操作系統下進行平臺運行與測試。
OpenGL (graphics library)圖形系統是圖形硬件的一種軟件接口,主要用于科學數據可視化,實體仿真,三維動畫以及虛擬現實等方面[8],OpenGL 旨在獨立于操作系統和硬件環境,因此OpenGL 不包含用于執行窗口任務和與用戶交互等函數,只包含對應的三維圖形繪制函數,必須通過具體的窗口系統集成OpenGL函數才可以使用OpenGL繪圖功能。OpenGL 是一個狀態機,可以設置各種狀態,然后讓這些狀態一直生效,直到再次修改它們[9]。OpenGL工作流程如圖1所示[9]。

圖1 OpenGL工作流程
Qt是一個多平臺的C++圖形用戶界面應用程序框架,為不同平臺下的圖形界面編程提供統一接口,具有一次編寫,隨處編譯的特點。一次開發的Qt應用程序可以移植到不同的平臺上,只需重新編譯即可運行[10]。Qt提供了OpenGL模塊,方便OpenGL 在多個操作系統中的應用。其中OpenGL模塊定義了OpenGL 函數在Qt中的接口規范,用戶可以直接調用該模塊而不需要直接調用本地API進行三維繪圖。QGLWidget[11]類是用來渲染OpenGL 三維場景的窗口空間,其提供了3 個函數用于開發,分別是paintGL,resizeGL 和initializeGL 函數,分別用于渲染場景,改變窗口大小以及初始化OpenGL環境[7]。
NetCDF (network common data format)網絡通用數據格式最早是由美國國家科學委員會資助的計劃Unidata所發展而來,旨在提供一種可以通用的數據存取方式[12],一種面向數組型數據、適于網絡共享且跨平臺的數據格式描述和編碼標準[13]。NetCDF 文件結構包括文件頭說明信息和數據塊區域,文件頭信息包括整個文件屬性和單個變量屬性等,數據塊區域按照變量進行存儲,一般用于存儲多維數據,支持與機器無關的科學數據,滿足數據共享,每一個NetCDF文件包括單點的觀測值,時間序列,規則排列的網格,以及其它文件等。NetCDF文件適合存儲氣象數據,提供了C,Fortran和Java[14]等數據存取接口。NetCDF文件具有說明文檔,確保數據準確讀取,存取方式為直接存取所需數據,極大減少不必要的讀取時間,同時支持跨平臺操作,這樣便于軟件系統跨平臺運行。
該平臺將WRF模式數據首次可視化結果呈現在地球模型上,則需要建立一個3D 地球模型以及顯示地球經緯度和相關的地理高程信息。用戶能夠自主選擇讀取數據文件,選擇物理變量以及查詢數據等。物理量數據需要進行可視化展示,由于數據的屬性不同,故需要設計數據傳輸函數進行數據與可視要素之間的轉換,同時用戶可以控制數據傳輸函數,首次可視化結果類似于熱度圖形式。用戶能夠與原始數據交互,平臺能夠提供用戶鼠標和鍵盤與數據交互的可視化結果,二次可視化結果需要以多種形式展示。平臺能夠展示數據隨時間和高度變化而變化的效果,也即時間動畫和高度動畫。平臺需要具有很好的移植性和可擴展性,平臺可以運行在不同的操作系統上。
整體功能設計如圖2所示。

圖2 平臺功能設計
數據流程主要介紹文件中數據,內存中數據,緩存區中數據以及顯存中數據之間的關系。以下分別介紹各個流程模塊:
(1)NetCDF數據文件到內存:由于NetCDF數據文件中的數據不可能直接進行可視化,因此需要先讀取到內存中,然后程序調用內存中的數據并對其進行可視化。
(2)內存到緩存:內存中的數據不可以直接進行繪制,需要發送到幀緩沖區中。利用OpenGL 的雙緩沖、頂點數據緩沖區以及顏色緩沖區、顯示列表等技術對數據進行組織和操作,以便于數據的重復顯示和快速顯示。
(3)緩存到顯存:由于顯卡的計算速度遠大于CPU 以及OpenGL使用客戶端到服務器機制,將數據發送到顯存中可大大加速屏幕的顯示速度以及減少屏幕刷新的延遲時間。
(4)緩存到內存:從可視化結果中獲取的數據包括點數據和區域數據,從緩存中獲取坐標信息,然后根據坐標信息從內存中查找數據。
(5)內存到數據庫:平臺使用Oracle[15]數據庫記錄用戶的操作指令和用戶與數據交互的數據值,一般記錄少量數據點即可,根據少量數據點便可以從NetCDF 數據文件讀取所有的數據。
平臺整體流程設計如圖3所示。

圖3 數據流程設計
平臺采用經典的三層架構構建整個軟件平臺,分別是數據層,業務層和表現層。采用三層架構可以將數據存取,數據處理和數據可視化3個功能模塊分離,使程序模塊清晰,有利于組織平臺結構,同時有助于平臺的功能擴展和提高代碼的可讀性和理解性。三層架構介紹如下:
(1)數據層:數據層主要處理數據文件和物理變量的讀取以及記錄用戶操作記錄和用戶交互數據,主要利用NetCDF的C 語言接口,但是該接口主要是面向過程的,因此使用面向對象的思想封裝這些接口函數,寫符合要求的讀取數據類。同時,需要利用數據庫接口函數與數據庫進行交互,包括讀取數據庫數據和數據寫入數據庫。
(2)業務層:業務層主要響應用戶的動作和行為,也即處理用戶的操作指令,起到數據層和表現層之間的溝通橋梁作用。數據層將數據讀取完,業務層處理這些數據,處理完之后發送到表現層,表現層將這些數據可視化。另用戶根據表現層可視化結果,與其進行交互,業務層處理用戶行為后,數據層按照業務層的要求讀取數據之后,將數據傳遞到業務層,業務層通知表現層進行可視化結果繪制。該層主要是模塊化操作,用戶選擇不同的物理量,不同的物理量具有不同的數據信息,需要根據不同的物理量設置不同的數據模板和配置模板,每次處理數據時,根據數據對應的物理量不同,選擇不同的數據模板和配置模板。同時,用戶的繪圖指令不同,因此該層需要解析用戶操作行為。
(3)表現層:表現層主要負責將業務層傳遞過來的數據進行可視化,根據用戶的可視化需求選擇不同的可視化方案對數據進行可視化,將可視化結果直觀地呈現在屏幕中。
圖4為平臺架構,圖中標示了各個層需要實現的功能。

圖4 三層架構
Qt中已經包含OpenGL模塊,方便在多個操作系統中進行OpenGL 程序開發。QGLWidget與OpenGL 混合編程,有效降低了在Qt中進行OpenGL開發的難度。在絕大多數情況下,QGLWidget可以像QWidget一樣使用,只是使用OpenGL的函數替代Qpainter進行繪制。QGLWidget提供了3個虛函數用以重載實現OpenGL 的繪制,使得程序源代碼簡潔且易讀。圖5 給出了QT 程序調用OpenGL函數繪圖機制。

圖5 Qt程序調用OpenGL函數繪圖機制
數據層處理的數據主要是存取NetCDF 數據文件和存取Oracle數據庫中的數據。其中NetCDF 數據文件為平臺主要處理的數據對象,而Oracle數據庫中的數據主要記錄用戶的行為操作和交互數據。處理NetCDF 數據主要利用NetCDF提供的C 語言接口,將這些接口函數封裝成自定義的讀取數據的類,方便平臺開發和擴展。存儲Oracle數據庫中的數據主要是編譯Oracle提供的OCI接口,然后程序利用OCI接口進行數據記錄的存取。
封裝讀取NetCDF 數據文件的C 語言接口的類主要有NcFile類,NcDim 類,NcVar類和NcAtt類。NcFile類用于讀取NetCDF文件,其中包括維度信息,變量信息以及文件屬性信息等,NcDim 類用于讀取獲取維度名稱,大小以及判斷是否是無限維等,NcVar類可以返回變量名稱,變量類型,變量對應的維度,變量屬性以及如何定點定區域讀取變量數據,NcAtt主要用于讀取屬性信息,返回屬性名稱,屬性類型以及屬性值個數等。
OCI驅動集成一組應用程序開發接口,在Oracle中提供了一組庫函數,可以使用庫函數連接數據庫,調用SQL和事務控制等。由于Qt自帶Sqlite和ODBC 驅動,但是沒有Oracle OCI驅動,則需要預先自行編譯OCI驅動。
數據處理主要用于處理數據層傳遞過來的數據和響應用戶的操作行為。
不同的物理量有不同的數據信息,首先對傳遞過來的物理量進行識別,然后按照對應的物理量配置方法對數據進行操作,然后將數據傳遞給傳輸函數,傳輸函數對數據進行轉換得到數據值對應的顏色值信息,主要通過類Var-Setter實現,類中包括識別物理量函數,物理量參數配置以及傳輸函數等。圖6為主要實現過程。

圖6 數據到顏色映射轉換實現
用戶在與可視化結果進行交互的過程中,有鼠標和鍵盤等事件,數據處理對不同的用戶行為進行不同的解析,將解析后的不同操作通知表現層,表現層根據相應的繪圖函數,繪制出不同的折線圖以及等值線圖等。
用戶鼠標交互時,主要圍繞鼠標相對于窗口的位置坐標展開。由于數據存取是按照地球經緯度信息以及高度和時間進行存取,而鼠標窗口位置坐標和地球經緯度坐標不是同一個坐標系,則需要進行坐標轉換。首先,程序獲取到鼠標窗口坐標,然后鼠標窗口坐標經過一次逆轉換,得到該點在三維空間中的位置坐標,進而根據得到的三維空間中的位置坐標,再進行一次逆轉換,便可獲得該點相對于地球模型的經緯度位置坐標,數據層便可根據經緯度位置信息和用戶設置的時間高度信息在數據文件中或者內存中查詢,就可以得到需要的原始數據。
OpenGL處理的數據的坐標信息都是三維空間中的三維坐標,因此在將數據傳遞到OpenGL 繪圖函數類之前的第一步就是將數據的經緯度信息轉換成三維坐標。式 (1)給出經緯度和三維坐標的轉換關系,圖7給出了經緯度到三維坐標的轉換,圖中三維坐標系為OpenGL 中采用的三維坐標系,向上為Y 軸正方向,向右為X 軸正方向,屏幕向外為Z軸正方向,a為經度偏移


圖7 經緯度到三維坐標
用戶交互過程中產生的數據操作記錄和操作的數據會被記錄到數據庫中,由于Oracle數據庫存儲的數據一般為關系型數據,因此多維數據存儲到數據庫之前需要經過一個轉換。將多維數據按照時間高度經緯度信息轉換為一個唯一的ID 值,見式 (2),按照此ID 值將對應的數據存儲到數據庫中。從數據庫中讀取數據時,依然需要按照式(2)進行逆轉換得到時間高度和經緯度信息

基于Qt和OpenGL技術的融合,極大地方便三維可視化的實現,但是Qt中提供的OpenGL繪圖功能有限,僅僅用于普通3D 圖形繪制,平臺中使用OpenGL 的顯示列表,幀緩沖區等技術,因此需要使用OpenGL 自身的庫函數,程序中自定義類用于封裝OpenGL 本地函數庫,方便程序開發和功能拓展。程序將用于三維圖形繪圖和二維圖形繪圖的功能函數類進行封裝,形成一個多組件融合的交互式可視化圖形庫。在需要繪制可視化圖形時,直接響應用戶指令,程序調用圖形庫的類函數即可實現圖形繪制。
數據可視化主要實現OpenGL 繪制圖形函數和QCustomPlot[16]繪制折線圖直方圖等以及調用NCL 腳本語言[17]進行等值線等繪圖操作。分別有初始化場景類,可視化類和用戶交互類。初始化場景類主要包括OpenGL 的初始化環境配置類。可視化類包括顯示時間類,地球模型類EarthModel,數據貼圖類DataTex,圖表繪制類QCustom-Plot以及等值線圖類VarNCL 和圖片保存類。用戶交互類分別有場景旋轉類MoRotate,縮小和放大類MoResize,以及鼠標拾取類MoMouse。以下將主要的類進行介紹:

圖8 轉換投影算法
OpenGL的初始化環境配置類中封裝清除緩沖區函數,設置投影模式函數,計算模型視圖矩陣 (modeMatrix)、投影矩陣 (projMatrix)和視點 (viewprot)矩陣函數,矩陣和矢量運算和平面法向量計算函數等。
地球模型類EarthModel中實現地球模型繪制,以及地球紋理貼圖和地理高程信息顯示等功能。
數據貼圖類DataTex實現經緯度準確定位,數據顏色值繪制等功能。
QCustomPlot類為用于繪圖的Qt C++部件,獨立的類庫,用于繪制曲線和圖表等,同時QCustomPlot類提供圖片保存函數,程序中的圖片保存類需封裝QCustomPlot提供的圖片保存函數以及保存OpenGL繪制結果函數類。
等值線圖類VarNCL主要封裝NCL腳本語言函數和獲取參數函數和調用NCL工作平臺函數。NCL 主要在Linux操作系統環境中采用工作站方式工作,因此在Windows中需要模擬Linux環境。同時NCL的工作環境與程序開發環境獨立,因此在程序和NCL工作環境之間需要連接,以便于在程序中啟動NCL運行環境以及調用NCL繪圖函數。
用戶交互類中主要包括用戶鼠標拖動旋轉場景和縮小放大可視化結果類,鼠標獲取區域或單點屏幕坐標類,所有數據二次可視化都依靠鼠標拾取來實現。其中鼠標拖動較難實現,鼠標直接操作二維界面,而場景是三維圖形,因此本文采用以下轉換投影算法,具體過程如圖8所示。
屏幕中對應的數據點坐標都是二維的,然而OpenGL處理的數據是三維坐標,因此在數據對應到屏幕的可視化結果過程中需要進行坐標轉換。OpenGL 物體三維坐標到屏幕坐標轉換過程如圖9所示。
本平臺采用Visual Studio 2010集成開發軟件,同時采用Qt 4.8,結合Oracle 10g數據庫技術,NetCDF文件讀取技術,NCL腳本語言和QCustomPlot以及OpenGL 三維圖技術等。系統的測試運行環境為Windows 7 操作系統,圖10和圖11是該系統運行的部分效果圖,從總體測試效果看,平臺運行穩定良好。

圖9 OpenGL物體坐標到屏幕坐標轉換過程

圖10 鼠標交互某一時間和高度層的經緯度區域數據顯示

圖11 某點數據變化趨勢交互顯示
用戶選擇經緯度范圍內的區域信息可視化結果:用戶點擊鼠標右鍵保持不放,拖動鼠標移動,移動至某位置,鼠標右鍵放開,得到起始和結束鼠標窗口位置坐標,通過兩次坐標轉換關系函數,得到經緯度信息,根據得到的經緯信息和用戶選擇的高度和時間信息,將指令發送到數據層,數據層直接按照經緯度和高度時間信息讀取數據,將讀取出來的數據傳遞到業務層,業務層按照用戶的需求,對數據進行修剪和插值操作等,將經過處理后的數據傳遞到表現層,表現層中NCL工作站將繪制業務層傳遞過來的數據。
用戶與第一次可視化結果,也即地球模型中顯示出來的數據進行交互,用戶可以選擇同一時間、同一高度和不同經緯度信息數據,同一時間、同一經緯度和不同高度數據,同一高度、同一經緯度和不同時間的數據,選擇某一操作后,業務層按照要求在內存中選擇數據傳遞給表現層,表現層調用QcustomPlot類中函數進行折線圖的繪制。
圍繞WRF 模式運行產生的中尺度氣象數據,利用OpenGL強大的3D 繪圖功能以及現有的多形式的第三方繪圖插件,將這些繪圖函數封裝成自定義的類,將Qt作為平臺的總體設計框架,程序模塊化方便了平臺的擴展。由于采用的現有技術都具有跨平臺的特性,因此整個平臺具有良好的移植性,可運行在不同的操作系統上,只需要重新編譯即可。本平臺方便氣象專業人士和研究人員對中尺度模式氣象數據的動態變化有直觀的把握,以便做出相應決策。
[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). [王曉君,馬浩.新一代中尺度預報模式(WRF)國內應用進展 [J].地球科學進展,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). [邵寶民,初偉先,漆隨平.面向對象的NetCDF文件桌面化讀取軟件的設計[J].山東科學,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).[華文元,王家潤,康亮,等.基于OSG五維氣象可視化軟件的設計及實現 [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 使用要點簡述 [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資料中的非對應格點數據[J].氣象研究與應用,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,關于nc文件的讀取[DB/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的三維可視化技術研究[J].計算機測量與控制,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的點云三維可視化表達 [J].河南理工大學學報(自然科學版),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 版.北京:機械工業出版社,2010.]
[10]CAI Zhiming,LU Chuanfu,LI Lixia,et al.Proficient in Qt4programming [M].Beijing:Electronic Industry Press,2008 (in Chinese). [蔡志明,盧傳富,李立夏,等.精通Qt4編程 [M].北京:電子工業出版社,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數據可視化研究 [J].長江大學學報 (自然科學版),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++平臺的相控陣天氣雷達NetCDF數據讀取與產品顯示 [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). [王想紅,劉紀平,徐勝華,等.基于NetCDF數據模型的海洋環境數據三維可視化研究[J].測繪科學,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數據庫海量數據的查詢優化研究 [J].計算機技術與發展,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在氣象數據圖形化中的應用 [J].山東氣象,2007,27 (109):33-36.]