胡波 周必高 俞燎霓 李嘉鵬
(1.浙江省氣象臺,浙江 杭州 310017;2.溫州市氣象局,浙江 溫州 325027)
氣象服務(wù)是所有氣象業(yè)務(wù)產(chǎn)品向社會提供服務(wù)的出口,是氣象工作的出發(fā)點和歸宿[1],因此如何提高氣象服務(wù)能力就成為了氣象事業(yè)發(fā)展的一項重大任務(wù)[2]。多年以來,從國家到地方氣象部門均投入大量人力物力不斷發(fā)展氣象服務(wù)系統(tǒng)[3-7],以滿足新形勢下的業(yè)務(wù)需要,如國家氣象中心于2007年就開展了全國氣象服務(wù)信息系統(tǒng)(MESIS)1期、2期、3期、4期等一系列項目建設(shè)[8],實現(xiàn)氣象信息檢索及可視化產(chǎn)品制作平臺的開發(fā)[9]。馬渝勇等采用消息型中間件技術(shù)設(shè)計省級氣象信息共享系統(tǒng),實現(xiàn)了開放式的氣象信息服務(wù)[10]。雷升鍇等采用先進網(wǎng)絡(luò)服務(wù)技術(shù),以向基層輻射和共享為主要手段,提出了省級公共氣象服務(wù)系統(tǒng)的整體架構(gòu)設(shè)計[11]。陳亮等應(yīng)用本地緩存機制和智能文本生成等技術(shù)設(shè)計開發(fā)了省級氣象服務(wù)產(chǎn)品分發(fā)系統(tǒng)[12]。楊忠恩等通過對用戶定位信息與天氣現(xiàn)象、能見度、溫度、降水、風(fēng)力等精細化格點數(shù)據(jù)進行融合,提供了一系列基于位置的創(chuàng)新性交通氣象服務(wù)[13]。李超等通過氣象服務(wù)產(chǎn)品管理標(biāo)準(zhǔn)化和業(yè)務(wù)規(guī)范化,開發(fā)了市縣級公共氣象服務(wù)集約化業(yè)務(wù)平臺,使基層臺站軟件操作簡單化[14]。這些服務(wù)系統(tǒng)完成后滿足了當(dāng)時的服務(wù)需求,但從后期維護、未來發(fā)展和推廣應(yīng)用等方面來看,存在許多問題。首先,數(shù)據(jù)庫使用存在不足,這些系統(tǒng)的數(shù)據(jù)庫應(yīng)用分為兩種情況:一種是直接連接業(yè)務(wù)數(shù)據(jù)庫;另一種是建立專門的業(yè)務(wù)數(shù)據(jù)庫。前一種情況隨著業(yè)務(wù)發(fā)展,數(shù)據(jù)庫在更改和升級后會導(dǎo)致系統(tǒng)許多功能無法繼續(xù)使用,且新增數(shù)據(jù)庫應(yīng)用也存在困難;后一種情況需要專人去維護此業(yè)務(wù)數(shù)據(jù)庫,極大增加了推廣應(yīng)用的難度。其次,系統(tǒng)集成的數(shù)據(jù)統(tǒng)計分析的黑箱特性導(dǎo)致其二次開發(fā)能力嚴(yán)重不足,跨區(qū)域推廣應(yīng)用更是水土不服,而重新開發(fā)一套新系統(tǒng)又意味著許多功能的重復(fù)建設(shè),造成資源浪費。最后,服務(wù)材料文字輸出功能偏弱,不能滿足業(yè)務(wù)需求。為了嘗試解決這些問題,采用c#和MS-SQL技術(shù),本文提出使用內(nèi)部函數(shù)和外部函數(shù)相結(jié)合的方法設(shè)計服務(wù)數(shù)據(jù)分析統(tǒng)計系統(tǒng),最大可能提高系統(tǒng)的二次開發(fā)應(yīng)用能力,便于在全省氣象部門的推廣使用。
系統(tǒng)功能總體分為3部分,分別為前臺界面配置模塊、后臺函數(shù)配置模塊和前臺界面顯示模塊(見圖1)。前臺界面配置模塊實現(xiàn)自定義的插入、修改和刪除業(yè)務(wù)上各種的統(tǒng)計項目及其條目,統(tǒng)計條目與內(nèi)部數(shù)據(jù)庫具有雙向反饋能力;后臺函數(shù)配置模塊包括內(nèi)部函數(shù)和外部函數(shù)的配置,內(nèi)部函數(shù)通過暴露參數(shù)接口,靈活連接外部數(shù)據(jù)庫,實現(xiàn)數(shù)據(jù)各種分析功能,并將數(shù)據(jù)分析結(jié)果返回到內(nèi)部數(shù)據(jù)庫。內(nèi)部函數(shù)的接口參數(shù)與內(nèi)部數(shù)據(jù)庫具有雙向反饋能力。外部函數(shù)采用基于sql語句的形式,在內(nèi)部函數(shù)計算結(jié)果的基礎(chǔ)上再次對數(shù)據(jù)進行統(tǒng)計分析,并將結(jié)果輸出到自定義的文字模板之中,外部函數(shù)與內(nèi)部數(shù)據(jù)庫有雙向反饋能力。前臺界面顯示模塊可以在用戶自定義前臺界面配置模塊、后臺函數(shù)配置模塊后,從更新的內(nèi)部數(shù)據(jù)庫中讀取相關(guān)數(shù)據(jù)信息,將統(tǒng)計條目、數(shù)據(jù)結(jié)果、文本等用戶需要的信息顯示到前臺界面,并可以將輸出的數(shù)據(jù)進一步轉(zhuǎn)化為圖像服務(wù)產(chǎn)品。
圖1 系統(tǒng)的功能框架
為了實現(xiàn)靈活、強大的二次開發(fā)功能,系統(tǒng)的內(nèi)部函數(shù)使用動態(tài)鏈接庫形式開發(fā),采用統(tǒng)一的struct接口規(guī)范,其參數(shù)在后臺配置平臺中完全暴露,內(nèi)部函數(shù)可以靈活與外部數(shù)據(jù)庫進行連接,并將分析統(tǒng)計的數(shù)據(jù)保存在內(nèi)部數(shù)據(jù)庫,最后利用基于sql語句的輸出參數(shù)將計算結(jié)果顯示到前臺界面供業(yè)務(wù)人員使用。
表1為氣候監(jiān)測內(nèi)部函數(shù)的接口參數(shù)樣例,這個函數(shù)實現(xiàn)固定時段內(nèi)的要素與歷史同期的對比分析,結(jié)果輸出包括今年值、氣候平均、距平或百分率、歷史極值、排序等信息。接口參數(shù)分為前臺和后臺兩類,前臺參數(shù)由用戶在前臺操作時使用,后臺參數(shù)由管理員在后臺配置內(nèi)部函數(shù)時使用,前臺參數(shù)只有s_time(開始時間)、e_time(結(jié)束時間)、yuzhi1(閾值≥)和yuzhi2(閾值≤),后臺參數(shù)眾多,主要包括二個數(shù)據(jù)源連接(con和con1)和一個用于保存計算結(jié)果的內(nèi)部數(shù)據(jù)庫連接(Local)、外部數(shù)據(jù)庫所使用的數(shù)據(jù)表(SeTable1、SeTable1)及數(shù)據(jù)表對應(yīng)的站年月日時字段(station、year、month、day、station1、year1、month1、day1、hour1)和需統(tǒng)計分析的數(shù)據(jù)表字段(chSet、chSet1)等,還有數(shù)據(jù)的計算方法(method)、結(jié)果在前臺界面顯示時所使用二個數(shù)據(jù)表連接(out、out1)等。這里二個外部數(shù)據(jù)庫(con1和con2)分別為歷史氣候庫和自動站數(shù)據(jù)庫,歷史氣候庫為日值資料,自動站數(shù)據(jù)庫為小時資料,當(dāng)歷史氣候庫中數(shù)據(jù)有缺時由自動站數(shù)據(jù)庫進行補充,實現(xiàn)統(tǒng)計時段內(nèi)數(shù)據(jù)的無縫銜接。OutSql和OutSql1為基于sql語句的數(shù)據(jù)輸出后臺參數(shù),具體賦值后面有詳細討論。
表1 氣候監(jiān)測內(nèi)部函數(shù)的部分接口參數(shù)
表2為2017年1月1日至2月2日的平均氣溫與歷史同期氣候?qū)Ρ确治鰰r的氣候監(jiān)測內(nèi)部函數(shù)接口部分參數(shù)的賦值情況,選取的計算方法為avg,氣候庫的表為Temperature,自動站表為tabRealTimeData_YYYYMM,由于自動站表中的觀測時間字段內(nèi)容格式為yyMMddHH,因此需要將參數(shù)year1賦值為’20’+substring(ObservTimes,1,2),month1賦值為substring(ObservTimes,3,2),day1賦值為substring(ObservTimes,5,2),hour1賦值為substring(ObservTimes,7,2),氣候平均值開始年份CstartY為1981年,結(jié)束年份CendY為2010,pianyi值為3代表自動站小時值加3,便于計算20—20時的平均氣溫。
表2 氣候監(jiān)測內(nèi)部函數(shù)接口部分參數(shù)的賦值樣本
通過靈活的參數(shù)配置實現(xiàn)氣候監(jiān)測內(nèi)部函數(shù)的二次自定義開發(fā),選取不同的數(shù)據(jù)源和計算方法(參數(shù)為method)實現(xiàn)不同要素的氣候監(jiān)測,如計算字段chSet為雨量,方法選擇sum,結(jié)果為累計雨量的氣候?qū)Ρ确治?,方法選擇count,SqWhere參數(shù)限制日雨量大于0,結(jié)果為雨日的氣候?qū)Ρ确治?;計算字段chSet選擇最低氣溫,SqWhere參數(shù)限制日最低氣溫小于0 ℃,方法選擇count,結(jié)果為低溫日數(shù)的氣候?qū)Ρ确治?;計算字段chSet選擇日照時數(shù),方法選擇sum,結(jié)果為總?cè)照諘r數(shù)的氣候?qū)Ρ确治?。另外,由于?nèi)部函數(shù)是基于動態(tài)鏈接庫形式進行開發(fā),因此可以根據(jù)業(yè)務(wù)需要開發(fā)新的內(nèi)部函數(shù),并通過后臺配置方式添加到系統(tǒng)中,這樣就完全將數(shù)據(jù)統(tǒng)計分析的功能與數(shù)據(jù)顯示、數(shù)據(jù)繪圖等模塊脫離開來,實現(xiàn)數(shù)據(jù)統(tǒng)計靈活的二次開發(fā)。
內(nèi)部函數(shù)通過后臺參數(shù)配置實現(xiàn)了計算后,需要進一步考慮如何實現(xiàn)計算結(jié)果的靈活輸出。由于統(tǒng)計分析結(jié)果均是以表格形式保存在內(nèi)部數(shù)據(jù)庫的表中,故采用基于sql語句查詢形式將返回的數(shù)據(jù)在系統(tǒng)前臺界面進行顯示,為了盡可能顯示多種數(shù)據(jù),sql數(shù)據(jù)列表分為主sql和從屬sql數(shù)據(jù)列表,表3為氣候監(jiān)測內(nèi)部函數(shù)輸出結(jié)果存放表history的結(jié)構(gòu),temperature為相關(guān)要素統(tǒng)計值(如平均值、最大值、最小值、個數(shù)等),基于此表的前臺界面數(shù)據(jù)顯示所需主sql語句為:
Select [address] as 站號,[staname] as 站名,[county] as 縣,[s_MMDD] as 開始時間,[e_MMDD] as 結(jié)束時間,[temperature] as 平均氣溫,basis as 距平,[LtoS_order] as 大到小排序,[StoL_order] as 小到大排序,[lon] as 經(jīng)度,[lat] as 緯度,factor as 內(nèi)部識別碼 from [dbo].[history] where [s_MMDD]=SUBSTRING(’{s_time}’,5,4) and [e_MMDD]=SUBSTRING(’{e_time}’,5,4) and factor=’{factor}’ and the_year=SUBSTRING(’{e_time}’,1,4) order by [address] desc
語句中{s_time}、{e_time}、{factor}等為內(nèi)部函數(shù)接口的參數(shù)值(見表2),為了在前臺顯示單站的歷史統(tǒng)計信息,從屬sql語句指定為:
select [the_year] as 年,[temperature] as 平均氣溫,[LtoS_order] as 大到小排序,[StoL_order] as 小到大排序 from [dbo].[history] where [address]=rtrim(’{站號}’) and [s_MMDD]=rtrim(’{開始時間}’) and [e_MMDD]=rtrim(’{結(jié)束時間}’) and factor=rtrim(’{內(nèi)部識別碼}’) order by [the_year] desc
語句中{站號}、{開始時間}、{結(jié)束時間}和{內(nèi)部識別碼}為主sql語句中輸出列表中由用戶選中的字段值,實現(xiàn)了在用戶選擇數(shù)據(jù)列表某一行時,對應(yīng)站點的信息由從屬sql語句進行指定輸出。
為了進一步增強數(shù)據(jù)輸出功能,主sql語句與從屬sql語句均可以多選一,如日觀測值破紀(jì)錄查詢內(nèi)部函數(shù)的計算結(jié)果存放表historyHiRecord的結(jié)構(gòu)見表4,為了實現(xiàn)從屬sql語句可以查詢某個站的年、月、旬的歷史極值情況,其參數(shù)的賦值樣式為“名稱|sql語句|名稱|sql語句|名稱|sql語句”,具體如下:
旬極值|select sta as 站號,yyyyMMdd as 極值日期,paixu as 排序,type as 類型 from historyHiRecord where sta=’{站號}’ and factor=’{識別碼}’ and type=’xun’ and time=’{日期}’|月極值|select sta as 站號,[yyyyMMdd] as 極值日期,paixu as 排序,type as 類型from historyHiRecord where sta=’{站號}’ and factor=’{識別碼}’ and type=’month’ and time=’{日期}’|年極值|select sta as 站號,[yyyyMMdd] as 極值日期,paixu as 排序,type as 類型from historyHiRecord where sta=’{站號}’ and factor=’{識別碼}’ and type=’year’ and time=’{日期}’|
語句中{站號}、{日期}和{識別碼}為主sql語句中輸出列表中選中的字段值,type為3種極值類型。
表3 氣候監(jiān)測內(nèi)部函數(shù)輸出結(jié)果存放表[dbo].[history]的結(jié)構(gòu)
表4 日觀測值破紀(jì)錄查詢內(nèi)部函數(shù)輸出結(jié)果存放表[dbo].[historyHiRecord]的結(jié)構(gòu)
基于動態(tài)庫的內(nèi)部函數(shù)開發(fā)要引用FunMethod.dll和GistarUtilityLite.dll這兩個動態(tài)庫,GistarUtilityLite.dll作為一個輔助工具庫,實現(xiàn)日志消息的交互、訪問數(shù)據(jù)庫類的封裝、各種配置文件的解碼等;FunMethod.dll主要基于GistarUtilityLite.dll動態(tài)庫,實現(xiàn)系統(tǒng)后臺跟外部實例動態(tài)庫間的消息交互,及各類外部實例庫的方法和參數(shù)的傳遞等。FunMethod.dll中包含動態(tài)庫交互類,主要方法為MethodMgr,輸入?yún)?shù)為需調(diào)用的實例動態(tài)庫(DLL庫)集合,返回解碼反射動態(tài)庫(dll庫)中的函數(shù),自動錄入BaseFunction、BaseClassStruct等數(shù)據(jù)表中。GistarUtilityLite.dll包含文件管理類GPSys,方法包括GetSysConfig、AddSysInfo、AddSysInfoFormat等,實現(xiàn)各類配置文件的讀取解碼,及日志文件的寫入生成等,還有數(shù)據(jù)庫訪問類DBUtility,方法包括Execute、GetDataList、GetDataListDir等,實現(xiàn)關(guān)聯(lián)數(shù)據(jù)庫的查詢,支持返回數(shù)值結(jié)果、表格結(jié)果等功能。
具體使用時先在工程中添加FunMethod.dll和GistarUtilityLite.dll引用,并增加命名空間,語句為using GistarLite,然后在內(nèi)部函數(shù)方法前面增加調(diào)用鏈接,具體為FunMethod(″內(nèi)部函數(shù)方法名″,″方法說明″)]。譬如:
[FunMethod(″ClimateWatch″,″氣候監(jiān)測″)]
public void ClimateWatch(WactchCalInfo wacth_infor)
{
// 具體代碼
}
其中,WactchCalInfo為氣候監(jiān)測模塊使用的struct結(jié)構(gòu)類型輸入數(shù)據(jù)(見表1和表2),ClimateWatch為氣候監(jiān)測主程序,將程序編譯成動態(tài)鏈接庫,生成的內(nèi)部函數(shù)即可在后臺界面導(dǎo)入后使用(導(dǎo)入方式見第4節(jié))。
服務(wù)數(shù)據(jù)的文字描述一般具有固定的格式,實現(xiàn)數(shù)據(jù)文字描述的自動輸出將會提高工作效率,尤其基層氣象臺站人員緊張的情況下具有更大的實際意義。由于數(shù)據(jù)統(tǒng)計的結(jié)果一般存放在數(shù)據(jù)庫的表中,而基于表數(shù)據(jù)的查詢結(jié)果也是以表格的形式返回,故設(shè)計了用于獲取數(shù)據(jù)的基于sql語句的外部函數(shù),其調(diào)用接口格式為:
{name,row1:row2,Col,mark,unit,condition}
其中,Name外部函數(shù)名稱,row1為sql語句輸出數(shù)據(jù)表的開始行,row2為結(jié)束行,Col為列號或字段名,condition為數(shù)據(jù)輸出時需滿足的條件,可以輸出列為Col、行從row1到row2的多個數(shù)據(jù),輸出的數(shù)據(jù)以unit為單位,以mark為分隔符。假設(shè)下面為一段時間內(nèi)雨量統(tǒng)計數(shù)據(jù)需輸出的文本。
全省平均降雨量*mm,其中*市*mm、*市*mm;有*個縣(市、區(qū))平均雨量超過25 mm,其中*個超過50 mm,*個超過100 mm,*個超過200 mm,最大為*縣*mm;有*個鄉(xiāng)鎮(zhèn)(街道)超過50 mm,其中*個超過100 mm,*個超過200 mm,*個超過300 mm,*個超過500 mm,單站最大為*站*mm、*站*mm。
其中的“*”均為需要輸出的數(shù)據(jù),插入外部函數(shù)的參數(shù)接口后,需處理的文本變?yōu)椋?/p>
全省平均降雨量{A1,1:1,1,’’,’’,‘’}mm[,其中{A2,1:11,1,’mm’,’、’ ,’>0’}][;有{B1,1:1,1,’’,’’,’>0’}個縣(市、區(qū))平均雨量超過25 mm][,其中{B2,1:1,1,’’,’’,’>0’}個超過50 mm][,{B3,1:1,1,’’,’’,’>0’}個超過100 mm][,{B4,1:1,1,’’,’’,’>0’}個超過200 mm][,最大為{B5,1:5,1,’mm’,’、’ ,’>=25’}]。[有{C1,1:1,1,’’,’’,’>0’}個鄉(xiāng)鎮(zhèn)(街道)超過50 mm][,其中{C2,1:1,1,’’,’’,’>0’}個超過100 mm][,{C3,1:1,1,’’,’’,’>0’}個超過200 mm,][,{C4,1:1,1,’’,’’,’>0’}個超過300 mm][,{C5,1:1,1,’’,’’,’>0’}個超過500 mm][,單站最大為{C6,1:5,2,’mm’,’、’,’>=50’}]。
“[ ]”中內(nèi)容用于沒有查詢到數(shù)據(jù)(外部函數(shù)無數(shù)據(jù)返回)時不需要輸出的文字描述語句,假設(shè)內(nèi)部函數(shù)計算的雨量數(shù)據(jù)已經(jīng)存放在StatTotalHour表中,表的結(jié)構(gòu)見表5,那么基于sql語句的部分外部函數(shù)如下:
A1:select avg(rain) as 全省平均雨量 from [StatTotalHour] where s_time={s_time} and e_time={e_time} and factor={factor}
A2:select RTrim(city),avg(rain) as rain from [StatTotalHour] where s_time={s_time} and e_time={e_time} group by city order by rain desc
B1:select count(counrty) from (select RTrim(country) as counrty,avg(rain) as rain from [StatTotalHour] where s_time={s_time} and e_time={e_time} and factor={factor} group by country) a where a.rain>=25
顏曉晨用的是一款諾基亞的舊手機,連微信功能都沒有,沈侯用的是iPhone手機最新款。顏曉晨還記得第一次拿到沈侯的手機時,連怎么接電話都不知道,還是沈侯手把手教會她如何用這種觸摸屏手機?,F(xiàn)在她雖然會用了,可畢竟用得少,很多功能不熟,只能笨拙地一條條慢慢回復(fù)。沈侯抬頭瞅了她一眼,看她微皺著眉頭,一絲不茍地和手機搏斗,忍不住唇角微翹,含著一絲笑繼續(xù)看財經(jīng)新聞。
C1:select count(distinct(town)) from (select StationNum,town,sum(rain) as rr from [StatTotalHour] where s_time={s_time} and e_time={e_time} and factor={factor} group by StationNum,town)a where a.rr>=50
C6:select StationNum,RTrim([country])+RTrim([stationName])+cast(sum(rain) as nchar) from [StatTotalHour] where s_time={s_time} and e_time={e_time} and factor={factor} group by StationNum,[country],[stationName] order by rain desc
表5 StatTotalHour表中的字段說明
外部函數(shù)Sql語句中的{factor}、{e_time}和{s_time}為內(nèi)部函數(shù)的接口參數(shù)(見表2),可見每個外部函數(shù)均依托于特定內(nèi)部函數(shù),通過后臺配置一系列的外部函數(shù)可以實現(xiàn)任意數(shù)據(jù)文字描述的輸出,達到靈活二次開發(fā)的目的。
由于系統(tǒng)的用戶操作界面、內(nèi)部函數(shù)、外部函數(shù)均通過后臺參數(shù)配置模塊完成,因此后臺配置的設(shè)計十分重要,圖2為自定義的后臺參數(shù)配置界面,左邊為可以增加和刪除的數(shù)據(jù)檢索項及具體分類,與分類對應(yīng)的內(nèi)部函數(shù)和外部函數(shù)均可根據(jù)需要自由指定。上半部分為內(nèi)部函數(shù)參數(shù)賦值,其參數(shù)分為前臺參數(shù)和后臺參數(shù),后臺參數(shù)配置由管理員完成,前臺參數(shù)由用戶完成輸入,下半部分為基于sql語句的外部函數(shù)及對應(yīng)的文字描述,一系列的外部函數(shù)綁定在一個內(nèi)部函數(shù)上。為了增強計算功能,每一個檢索項的分類均可指定多個內(nèi)部函數(shù),可以對不同氣象要素進行一系列的計算,從而在sql交叉數(shù)據(jù)查詢的基礎(chǔ)上,實現(xiàn)復(fù)雜的文字描述輸出。
由于內(nèi)部函數(shù)基于動態(tài)鏈接庫形式,因此導(dǎo)入內(nèi)部函數(shù)后需對參數(shù)進行說明,以及參數(shù)初始化綁定,圖3為氣候監(jiān)測內(nèi)部函數(shù)導(dǎo)入時的參數(shù)說明賦值界面,其中參數(shù)代碼和字段類型為內(nèi)部函數(shù)在系統(tǒng)中的實際接口,不能修改,后面的參數(shù)描述、參數(shù)類型、顯示格式、初值綁定、默認(rèn)初值、排序等均可由管理員自定義,參數(shù)類型分為前臺和后臺參數(shù),顯示格式分為TextBox、ComoBox、CheckBox,初值綁定用于指定賦值的可選項,如綁定為DBBind則可選擇已有的數(shù)據(jù)庫連接,綁定為EndTimeBind則可以選擇已經(jīng)設(shè)定各種預(yù)設(shè)時間(如今日、昨日、上周等),排序用于確定參數(shù)在后臺界面的顯示順序(見圖2)。通過內(nèi)部函數(shù)參數(shù)說明的賦值和初始化,可以將新的內(nèi)部函數(shù)不斷添加到現(xiàn)有系統(tǒng)中,便于升級推廣。
圖2 基于自定義的后臺配置界面
圖3 內(nèi)部函數(shù)參數(shù)說明及初始化
系統(tǒng)前臺界面可以顯示統(tǒng)計數(shù)據(jù)的列表、文字描述,及多元化的圖像產(chǎn)品。圖4為2018年2月4日最低氣溫破紀(jì)錄查詢前臺界面顯示。破紀(jì)錄查詢需要獲取旬、月和年等固定時段的歷史極值信息,因此顯示時需要3個從屬sql語句,在后臺對OuttSql1參數(shù)(見表1)進行賦值的時候,3個sql語句約定以“旬極值|sql語句1|月極值|sql語句2|年極值|sql語句3|”格式進行賦值,顯示效果見圖中右上角“▼”處快捷菜單顯示的“旬極值”、“月極值”和“年極值”,分別對應(yīng)了這3種從屬sql的輸出列表,由用戶自由切換。當(dāng)然根據(jù)業(yè)務(wù)需要,主sql語句也可以有多個,譬如可以區(qū)別顯示區(qū)域監(jiān)測情況和單站監(jiān)測情況等。
由于不同主sql語句和從屬sql語句返回的數(shù)據(jù)類型不同,長短也有差異,因此系統(tǒng)需要配置這兩個sql數(shù)據(jù)列表的寬度比例,并且各自列表內(nèi)的字段顯示寬度也可以單獨指定,以便達到最佳顯示效果,默認(rèn)情況下氣候監(jiān)測內(nèi)部函數(shù)的outputSql數(shù)據(jù)輸出列表的寬度占60%,其輸出的各個字段占寬度80像素,有些字段不必顯示在前臺界面的話還可以隱藏(如factor),還可以對字段顯示先后順序進行指定(設(shè)置界面圖略)。
各地氣象服務(wù)數(shù)據(jù)的類型多樣,存儲方式不一,服務(wù)需求也有較大差異,基于本地業(yè)務(wù)所開發(fā)的數(shù)據(jù)統(tǒng)計分析系統(tǒng)往往由于二次開發(fā)功能設(shè)計不足,給后期升級拓展和異地推廣使用帶來困難,而重新開發(fā)一套新系統(tǒng)又意味著大量已有功能的重復(fù)建設(shè),因此做好頂層設(shè)計,開發(fā)具有靈活二次拓展功能的服務(wù)系統(tǒng)有重要意義。本文基于此思想,設(shè)計和討論了可在省市縣3級使用的氣象服務(wù)數(shù)據(jù)分析系統(tǒng)的設(shè)計和開發(fā),得出以下主要結(jié)論。
圖4 2018年2月4日最低氣溫破紀(jì)錄查詢前臺界面顯示
1)系統(tǒng)的統(tǒng)計項目及其詳細條目均可通過后臺由用戶自主定義配置,通過對不同項目和條目設(shè)置不同的內(nèi)部函數(shù)和外部函數(shù),實現(xiàn)各種要素的數(shù)據(jù)分析、顯示和文本輸出等功能。
2)通過使用基于動態(tài)鏈接庫形式的內(nèi)部函數(shù),可以實現(xiàn)與業(yè)務(wù)數(shù)據(jù)庫中任意字段的連接和自定義的數(shù)據(jù)分析統(tǒng)計。函數(shù)提供的接口參數(shù)分為后臺參數(shù)和前臺參數(shù)二種類型,后臺參數(shù)指定數(shù)據(jù)源、計算方法、輸出數(shù)據(jù)類型、繪圖字段等信息,前臺參數(shù)供用戶與系統(tǒng)進行交互時使用。此種參數(shù)接口暴露的設(shè)計方案不僅實現(xiàn)了自定義參數(shù)賦值,達到靈活應(yīng)用目的,而且完全可以根據(jù)本地化需求自主開發(fā)內(nèi)部函數(shù),實現(xiàn)系統(tǒng)的完美升級。
3)在內(nèi)部函數(shù)結(jié)果輸出數(shù)據(jù)的基礎(chǔ)上,利用主sql語句和從屬sql語句輸出數(shù)據(jù)列表可以靈活定制各種需要展示的分析數(shù)據(jù),主sql語句和從屬sql語句均可設(shè)置多條,滿足不同內(nèi)部函數(shù)的數(shù)據(jù)輸出需要,輸出列表的總寬度及各字段寬度均可自定義設(shè)置,使系統(tǒng)界面協(xié)調(diào)美觀。
4)在內(nèi)部函數(shù)的計算結(jié)果基礎(chǔ)上,采用統(tǒng)一的函數(shù)接口,定義基于sql語句的外部函數(shù),將外部函數(shù)與自定義文字模板融合在一起,實現(xiàn)復(fù)雜文本的輸出,提高氣象服務(wù)產(chǎn)品制作效率。