牛一鳴,張國莉,劉 莉
(1.河南省伊川縣氣象局,河南 伊川 471300;2.河南省孟津縣氣象局,河南 孟津 471100)
?
新一代天氣雷達(dá)產(chǎn)品在iPhone手機中的繪制
牛一鳴1,張國莉1,劉 莉2
(1.河南省伊川縣氣象局,河南 伊川 471300;2.河南省孟津縣氣象局,河南 孟津 471100)
分析了新一代多普勒天氣雷達(dá)的地圖文件和雷達(dá)產(chǎn)品文件的二進(jìn)制數(shù)據(jù)結(jié)構(gòu),給出數(shù)據(jù)解析方案。針對搭載iOS操作系統(tǒng)的iPhone手機,使用Objective-C編程語言在集成開發(fā)工具Xcode上開發(fā)一款手機APP,將天氣雷達(dá)的地圖和雷達(dá)產(chǎn)品繪制到APP中,通過手勢捏合操作對雷達(dá)產(chǎn)品進(jìn)行縮放,實現(xiàn)雷達(dá)產(chǎn)品的動畫播放,使其具備不亞于PC端PUP程序的展示效果。
新一代多普勒天氣雷達(dá);地圖數(shù)據(jù)解析;雷達(dá)產(chǎn)品數(shù)據(jù)解析;iPhone手機APP
新一代多普勒天氣雷達(dá)是氣象部門監(jiān)測暴雨、冰雹、大風(fēng)等災(zāi)害性天氣的主要工具之一,其生成的多種雷達(dá)產(chǎn)品為預(yù)報員提供了豐富的天氣信息,對雷達(dá)產(chǎn)品的應(yīng)用顯著的提高了中小尺度天氣系統(tǒng)的監(jiān)測能力,在短時臨近天氣預(yù)報中發(fā)揮著重要作用[1-6]。天氣雷達(dá)的雷達(dá)產(chǎn)品和系統(tǒng)狀態(tài)信息,需經(jīng)天氣雷達(dá)終端顯示軟件(PUP客戶端)來解析和繪制[7],工作人員只能在安裝了PUP客戶端的計算機上對雷達(dá)產(chǎn)品進(jìn)行查看,現(xiàn)如今智能手機功能日益強大,是否可以在不便直接操作計算機時通過手機查看雷達(dá)產(chǎn)品呢?本文將以搭載iOS操作系統(tǒng)的iPhone手機為例,開發(fā)手機APP,對雷達(dá)產(chǎn)品進(jìn)行繪制和顯示。
多普勒天氣雷達(dá)產(chǎn)品的繪制需要兩部分?jǐn)?shù)據(jù),即地圖和雷達(dá)產(chǎn)品。地圖數(shù)據(jù)文件存放在PUP安裝目錄的Maps目錄下,PUP提供的地圖文件命名格式為mapX.map,其中X為雷達(dá)站的站代號[8-9],如洛陽雷達(dá)站站代號為379,則洛陽雷達(dá)站對應(yīng)的地圖文件為map379.map。文件中包含的地理信息有:省界、城市、縣界、河流和地名等,這些數(shù)據(jù)信息以二進(jìn)制的形式存儲,字節(jié)存儲機制為大端模式(Big-Endian),即數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中,數(shù)據(jù)的低字節(jié)保存在內(nèi)存的高地址中;雷達(dá)產(chǎn)品的文件命名格式形如20150728.005448.00.37.379,表示的含義是洛陽雷達(dá)站(站代號379)在2015年7月28日00時54分48秒(世界時)生成的仰角代號為00的組合反射率產(chǎn)品(產(chǎn)品代號37)[10],數(shù)據(jù)同樣以大端模式的二進(jìn)制形式存儲。要在手機APP中繪制產(chǎn)品,首先要將以上二進(jìn)制數(shù)據(jù)解析出來。
3.1 地圖文件數(shù)據(jù)解析
以洛陽雷達(dá)站為例,地圖文件為map379.map。通過使用二進(jìn)制數(shù)據(jù)查看器查看數(shù)據(jù),結(jié)合查詢資料分析,其數(shù)據(jù)可分為地理信息頭塊和地理信息描述塊兩部分。地理信息頭塊的數(shù)據(jù)結(jié)構(gòu)如圖1所示。從文件開頭的第4個字節(jié)開始,連續(xù)5個數(shù)據(jù)塊分別是省界、城市、縣界、河流和地名的地理信息頭塊,每個信息頭包含的數(shù)據(jù)有:地圖類別、標(biāo)志位、各地圖數(shù)據(jù)長度、各地圖數(shù)據(jù)偏移量等信息,根據(jù)數(shù)據(jù)偏移量和地圖數(shù)據(jù)長度,可以定位到各個地圖的地理信息描述塊在二進(jìn)制數(shù)據(jù)中的位置。

圖1 地理信息頭塊的數(shù)據(jù)結(jié)構(gòu)Fig.1 The data structure of geographic information header
3.1.1 省界、城市、縣界和河流地理信息描述塊的數(shù)據(jù)解析 省界、城市、縣界和河流地理信息描述塊的數(shù)據(jù)結(jié)構(gòu)及解析方法相同。每種地圖的數(shù)據(jù)塊均由若干條折線數(shù)據(jù)組成,其折線的數(shù)據(jù)結(jié)構(gòu)如圖2所示。每一條折線數(shù)據(jù)包括標(biāo)志位、折線起始點坐標(biāo)、后續(xù)字節(jié)數(shù)以及若干個后續(xù)拐點坐標(biāo)組成。從折線起始點開始依次連接每一個后續(xù)拐點,由此構(gòu)成一條完整的折線,若干條這樣的折線就構(gòu)成了地圖。

圖2 地圖折線的數(shù)據(jù)結(jié)構(gòu)Fig.2 The data structure of map polyline
3.1.2 地名地理信息描述塊的數(shù)據(jù)解析 地名地理信息描述塊的數(shù)據(jù)結(jié)構(gòu)稍有不同,其由若干組地名地理信息組成,數(shù)據(jù)結(jié)構(gòu)如圖3所示。每組地名地理信息數(shù)據(jù)由標(biāo)志位、地名坐標(biāo)、地名字節(jié)數(shù)和地名字符組成。地名坐標(biāo)指示了地名字符在地圖上的位置。地名字符采用GBK編碼,一個漢字占兩個字節(jié),故地名字節(jié)數(shù)為6時,地名由3個漢字構(gòu)成,如“三門峽”;地名字節(jié)數(shù)為4時,地名由2個漢字構(gòu)成,如“洛陽”。

圖3 地名地理信息的數(shù)據(jù)結(jié)構(gòu)Fig.3 The data structure of geographic names
需要注意的是,地名地理信息結(jié)構(gòu)體數(shù)據(jù)并不是連續(xù)的,經(jīng)測試發(fā)現(xiàn),當(dāng)讀取到的結(jié)構(gòu)體的各個成員變量值都為0時,應(yīng)再向后偏移132個字節(jié),然后繼續(xù)讀取,即地名地理信息描述塊數(shù)據(jù)被150個值為0的字節(jié)分割為兩部分(值為0的一個結(jié)構(gòu)體占18個字節(jié))。
3.2 雷達(dá)產(chǎn)品文件數(shù)據(jù)解析
雷達(dá)產(chǎn)品數(shù)據(jù)文件由信息頭塊、產(chǎn)品描述塊、產(chǎn)品符號表示塊、圖像數(shù)字文本塊和文本列表塊組成。信息頭塊包含了雷達(dá)產(chǎn)品的基本信息,如產(chǎn)品代號、生成時間、雷達(dá)站代號、接收站代號等;產(chǎn)品描述塊除了描述產(chǎn)品屬性外,還提供了產(chǎn)品符號表示塊、圖像數(shù)字文本塊與文本列表塊的字節(jié)偏移量,可以據(jù)此定位到后3個數(shù)據(jù)塊在二進(jìn)制數(shù)據(jù)中的起始位置;產(chǎn)品符號表示塊中存儲了雷達(dá)產(chǎn)品繪制所需的詳細(xì)數(shù)據(jù);圖像數(shù)字文本塊和文本列表塊包含了雷達(dá)產(chǎn)品附加的文字信息和適配數(shù)據(jù)[11-13]。
這里對存儲雷達(dá)產(chǎn)品詳細(xì)數(shù)據(jù)的產(chǎn)品符號表示塊進(jìn)行解析說明,數(shù)據(jù)結(jié)構(gòu)如圖4所示。塊中包含了塊分隔符、塊代號、塊數(shù)據(jù)長度、塊數(shù)據(jù)層數(shù)和若干個數(shù)據(jù)層,每個數(shù)據(jù)層包含了層分隔符、層數(shù)據(jù)長度和若干個數(shù)據(jù)包,數(shù)據(jù)包的結(jié)構(gòu)根據(jù)其類型可分為5種,即徑向數(shù)據(jù)包、柵格數(shù)據(jù)包、向量數(shù)據(jù)包、文本數(shù)據(jù)包和等值線數(shù)據(jù)包,不同的雷達(dá)產(chǎn)品對應(yīng)著不同的數(shù)據(jù)包。以組合反射率產(chǎn)品為例,其產(chǎn)品數(shù)據(jù)存儲在柵格數(shù)據(jù)包中,數(shù)據(jù)結(jié)構(gòu)如圖5所示。

圖4 產(chǎn)品符號表示塊的數(shù)據(jù)結(jié)構(gòu)Fig.4 The data structure of the product symbol block

圖5 柵格數(shù)據(jù)包的數(shù)據(jù)結(jié)構(gòu)Fig.5 The data structure of raster data packet
解析組合反射率產(chǎn)品時,其包識別碼應(yīng)為0xBA0F或0xBA07。x、y方向放大倍數(shù)表示了產(chǎn)品的分辨率,在與地圖疊加繪制時要注意二者的比例關(guān)系。根據(jù)柵格數(shù)據(jù)包中的柵格行行數(shù)讀取到若干柵格行。每個柵格行包括行字節(jié)數(shù)和若干柵格小塊,根據(jù)行字節(jié)數(shù)讀取到所有的柵格小塊。
完成地圖數(shù)據(jù)和雷達(dá)產(chǎn)品數(shù)據(jù)的解析之后,即可在手機APP中進(jìn)行繪制。目前手機APP大體可分為兩類:Web APP(網(wǎng)頁APP)和Native APP(原生APP)。Web APP采用HTML5語言編寫,在瀏覽器中運行(Written Once, Run Everywhere),并且無需用戶手動更新,直接在服務(wù)器端完成版本迭代。雖然其開發(fā)成本較低,但性能和用戶體驗較差,不支持離線緩存。Native APP是指基于手機操作系統(tǒng)開發(fā)的原生APP,具備強大的性能、出色的動畫效果及最佳的交互體驗,支持離線緩存處理,但安裝和更新需要用戶在應(yīng)用商店中手動下載。由于繪制的雷達(dá)圖需要較高的分辨率以滿足在一定的放大倍數(shù)下保持清晰,必須進(jìn)行大量的實時渲染,對性能要求較高;并且通過在Native APP中進(jìn)行緩存優(yōu)化,可縮短加載時間,減少流量消耗,綜上考慮,選擇Native APP開發(fā)。
編寫iOS操作系統(tǒng)上運行的應(yīng)用程序,需要在Mac OS X操作系統(tǒng)上,使用集成開發(fā)工具Xcode進(jìn)行編程,編程語言是Objective-C或Swift。這里以組合反射率產(chǎn)品為例,進(jìn)行分析和繪制。
4.1 組合反射率產(chǎn)品繪制
對雷達(dá)產(chǎn)品文件完成解析之后,主要對產(chǎn)品符號表示塊的數(shù)據(jù)進(jìn)行繪制。分析解析結(jié)果,發(fā)現(xiàn)柵格數(shù)據(jù)包中柵格行數(shù)固定為464行,每行有若干個柵格小塊,每個柵格小塊數(shù)據(jù)占用一個字節(jié),即8個二進(jìn)制位,繪制時取高4位二進(jìn)制數(shù)作為這個柵格小塊的寬度,取低4位二進(jìn)制數(shù)作為繪制柵格小塊的填充顏色,4位二進(jìn)制數(shù)表示的十進(jìn)制數(shù)范圍是0~15,故填充顏色有16種,組合反射率產(chǎn)品的RGB顏色表如圖6所示。測試發(fā)現(xiàn)每一個柵格行中所有柵格小塊的二進(jìn)制數(shù)據(jù)的高4位值之和等于464,故所有柵格行繪制的結(jié)果是在464*464區(qū)域內(nèi)由若干柵格小塊組成的圖像。例如假設(shè)從(0,0)點開始繪制,第1行第1個柵格小塊的二進(jìn)制值為11110000,則表示把起始點在(0,0),寬度15個像素,高1個像素的矩形區(qū)域填充為黑色;第1行第2個柵格小塊的二進(jìn)制值為01011101,則表示緊挨前一個柵格小塊,把寬度5個像素,高1個像素的矩形區(qū)域填充為紅色。以此類推就可以得到464*464大小的組合反射率產(chǎn)品圖。

圖6 RGB顏色表Fig.6 RGB color table
在iOS中,通過UIKit框架中提供的函數(shù)UIGraphics Begin Image Context With Options可以創(chuàng)建一個圖片類型的上下文,在該上下文上進(jìn)行繪制后,調(diào)用UIGraphics Get Image From Current Image Context函數(shù)可以從當(dāng)前上下文中獲取到繪制的圖片對象。iOS提供了Core Graphics框架來協(xié)助繪制復(fù)雜的圖形,使用Core Graphics可以方便高效的創(chuàng)建直線、路徑、漸變、文字與圖像等內(nèi)容。繪制組合反射率產(chǎn)品時,在464*464大小的上下文中,使用CGContext Set Fill Color With Color函數(shù)設(shè)置柵格小塊的顏色,使用CGContext Fill Rect函數(shù)對柵格小塊進(jìn)行填充繪制。
4.2 雷達(dá)地圖繪制
雷達(dá)的地圖圖像由5個部分組成,分別是省界、城市、縣界、河流和地名,除了地名之外的其余4類地圖數(shù)據(jù)繪制方法相同,繪制折線時仍然利用Core Graphics框架,使用CGContext Move To Point函數(shù)開始繪制一條新的折線,使用CGContext Add Line To Point將每一個后續(xù)拐點連接成線;地名部分的繪制涉及到文本繪制,iOS提供了Core Text框架來對文字進(jìn)行排版和渲染。需要注意的是由于地名字符采用GBK編碼存儲,而iOS的字符串編碼枚舉中并未給出GBK編碼類型,需要從更底層的字符串對象中創(chuàng)建,代碼如下:
NSString Encoding gbkEncoding = CFString Convert Encoding To NSString Encoding
(kCFString Encoding GB_18030_2000);
4.3 繪制效果
將雷達(dá)產(chǎn)品和地圖疊加顯示時,因為各種雷達(dá)產(chǎn)品的分辨率不盡相同,應(yīng)注意其與地圖的比例關(guān)系,如組合反射率產(chǎn)品與地圖分辨率之比是1∶2,1 h累積降水產(chǎn)品與地圖分辨率之比是1∶1。幾種常用雷達(dá)產(chǎn)品在iPhone中的繪制效果如圖7所示:

圖7 雷達(dá)產(chǎn)品在iPhone手機中的顯示效果(a)組合反射率產(chǎn)品(CR);(b)基本速度產(chǎn)品(V);(c)1 h累積降水產(chǎn)品(OHP);(d)回波頂產(chǎn)品(ET);(e)垂直積分液態(tài)含水量產(chǎn)品(VIL);(f)基本反射率產(chǎn)品(R)Fig.7 Radar products displayed on iPhone.(a)Composite Reflectivity (CR); (b)Velocity(V); (c)One Hour Precipitation (OHP); (d)Echo Tops (ET); (e)Vertically Integrated Liquid(VIL); (f)Reflectivity (R)
4.4 雷達(dá)產(chǎn)品的縮放
在PUP客戶端中,縮放雷達(dá)產(chǎn)品是通過點擊鼠標(biāo)右鍵,然后選擇縮放倍數(shù)來完成的,縮放倍數(shù)僅限2、4、6、8、16倍,而借助iOS設(shè)備的交互手勢“兩指捏合”,即可以實現(xiàn)在調(diào)節(jié)范圍內(nèi)線性縮放任意倍數(shù),同時根據(jù)縮放比例控制地圖細(xì)節(jié)的顯示和隱藏,以達(dá)到最佳觀測效果。捕捉兩指在屏幕上滑動,需要重載touchesMoved:withEvent:函數(shù),在函數(shù)中不斷捕獲兩指之間的距離變化,對雷達(dá)產(chǎn)品的圖片對象執(zhí)行相應(yīng)倍數(shù)的縮放。
4.5 動畫播放
iOS提供了簡便易用的幀動畫播放方案,只需將若干張雷達(dá)產(chǎn)品的圖像組成的數(shù)組賦給圖片容器對象,通過設(shè)置每幀時長、重復(fù)次數(shù),即可實現(xiàn)動畫播放。
本文以iPhone手機為例,對幾種常用雷達(dá)產(chǎn)品和地圖進(jìn)行了繪制,實現(xiàn)了縮放和動畫播放操作,可以看出,雷達(dá)產(chǎn)品在iPhone手機上的顯示效果并不亞于PC端的PUP程序。在今后的研究中,還可根據(jù)手機自身特性,添加一些PC端不能具備的功能,如利用蘋果公司提供的APNS消息推送服務(wù)(Apple Push Notification Service),服務(wù)器可以在檢測到有較強雷達(dá)回波生成時對安裝此手機APP的用戶進(jìn)行推送提醒。此外,目前讀取的數(shù)據(jù)文件均來自手機本地存儲(由于雷達(dá)產(chǎn)品文件的保密性,存儲的文件已經(jīng)過重新編碼處理),若要隨時隨地的查看實時的雷達(dá)產(chǎn)品,需建立與雷達(dá)產(chǎn)品服務(wù)器內(nèi)網(wǎng)的連接,有待進(jìn)一步開發(fā)實現(xiàn)。
[1] 方標(biāo),羅曉松,陳關(guān)清,等. 銅仁市2014年5月25日致災(zāi)大暴雨天氣過程雷達(dá)特征分析[J]. 貴州氣象,2015,39(1):55-59.
[2] 高楠,王飛. 新一代天氣雷達(dá)產(chǎn)品數(shù)據(jù)共享顯示系統(tǒng)[J]. 科技與生活,2010,(17):131-131.
[3] 羅曉松,方標(biāo),嚴(yán)小冬. 黔東北一次局地特大暴雨天氣的雷達(dá)回波特征分析[J]. 貴州氣象,2014,38(6):16-19.
[4] 陳海泉,陳立宏,曾祥標(biāo),等. 雷達(dá)和自動氣象站資料在GIS中的同步顯示[J]. 廣東氣象,2011,33(1):64-66.
[5] 鐘常鳴. CINRAD-SA 多普勒天氣雷達(dá)產(chǎn)品簡介[J]. 氣象研究與應(yīng)用,2009,30(A02):226-227.
[6] 郭曉超,李明元,肖蕾. 遵義多普勒天氣雷達(dá)反射率資料的雜波抑制算法研究[J]. 貴州氣象,2014,38(6):27-29.
[7] 姚立宏,方瓊. 新一代天氣雷達(dá)資料的共享[J]. 廣西氣象,2006,27(02):35-36.
[8] 張深壽. 新一代天氣雷達(dá)(CINRAD/SA)PUP的地圖漢化[J]. 福建氣象,2002(5):26-26.
[9] 張廷秀,付彥兵,蘇添記. 新一代天氣雷達(dá)PUP地圖細(xì)化設(shè)計與實現(xiàn). 氣象水文海洋儀器,2007(1):40-43.
[10]但玻,李慶,徐會明,等. 成都新一代天氣雷達(dá)資料整編程序開發(fā)[J]. 四川氣象,2007,27(4):34-34.
[11]陳海泉,廖仕湘. 新一代天氣雷達(dá)產(chǎn)品數(shù)據(jù)格式分析[A]//中國氣象學(xué)會. 中國氣象學(xué)會2007年年會氣象綜合探測技術(shù)分會場論文集.北京:氣象出版社,2007:390-396.
[12]李紅玉,李曉勇,劉鵬. 跨省區(qū)新一代多普勒天氣雷達(dá)PUP產(chǎn)品調(diào)用與拼圖實現(xiàn)[J]. 西華大學(xué)學(xué)報:自然科學(xué)版,2009,28(5):78-82.
[13]楚志剛,銀燕,顧松山. 新一代天氣雷達(dá)基數(shù)據(jù)文件格式自動識別方法研究[J]. 計算機與現(xiàn)代化,2013,(7):180-184.
[14]趙姝慧,秦鑫,李帥彬,等. 新一代天氣雷達(dá)常用產(chǎn)品在我國人工影響天氣工作中的應(yīng)用[J]. 地球科學(xué)進(jìn)展,2012,27(6):694-702.
[15]胡勝,伍志方,劉運策,等. 新一代多普勒天氣雷達(dá)廣東省區(qū)域拼圖初探[J]. 氣象科學(xué),2006,26(1):74-80.
Rendering of the New Generation Weather Radar’s products in iPhone
NIU Yiming1,ZHANG Guoli1,LIU Li2
(1.Yichuan Meteorological Office, Yichuan 471300, China;2.Mengjin Meteorological Office, Mengjin 471100,China)
The binary data structure of the New Generation Weather Radar’s map files and radar product files was analyzed, presents a parser scheme was presented. For the iPhone mobile phones equipped with iOS operating system, Objective-C programming language was used to develop an application in the Xcode Integrated Development Environment (IDE). Radar map and products was rendered in the app. Users can zoom in or out of the radar image by pinch gesture. Key-frame Animation technique was used to play radar echo animation. The demonstration effect of the app is the same as the Principal User Processor(PUP) client in computer.
new generation weather radar; map files analysis; radar product analysis; iPhone application
1003-6598(2016)04-0068-05
2016-05-13
牛一鳴(1989—),男,助工,主要從事軟件開發(fā)及網(wǎng)絡(luò)維護(hù)工作,E-mail:120971999@qq.com。
TP311.52
B