1. 引言
1.1. 研究背景
随着气象事业不断向高科技和自动化方向发展,各观测台站不时有新的气象观测项目添加,气象观测数据的量也是越来越多,因为气象资料类型比较多,数据格式也各不相同[1],如地面观测数据,农业气象数据,气象辐射等信息,对应的气象软件也是五花八门[2]。因此,基于气象数据的处理软件,必须要跟上气象业务发展的步伐,要求尽量与其他气象软件的数据库相兼容,数据的格式能够相互转换,以方便数据库的维护和更新,同时新软件还要有统计分析能力,能够将各类气象数据信息综合,使得各气象要素之间能够关联起来,方便人们在做气候学研究时做要素间的相关性统计分析,从而找出气候的发展规律特点[3]。
1.2. 研究目的以及意义
如今气象数据的类型非常多,并且数据的量非常庞大,同时气象数据又时时刻刻还在不断地采集增加,因此需要创建一个专门的气象数据库,既要满足所有气象数据的存储和更新,还要能够尽量被其他气象数据分析软件所兼容[4]。基于此,开发一个基于气象数据的气候统计分析和小波分析软件就显得至关重要,它可以实现气象资料的录入、查询检索、综合统计和相关性分析等功能,能够统计显示各气象要素间的相关情况,能帮助找出某一共同指标,为气象研究、天气预报以及气象灾情的统计分析等工作的开展带来了很大便利。
1.3. 本文研究内容
本文分析了气象资料处理软件应用现状,利用Microsoft SQL Server2005建立一套综合的数据库,兼容和存储各种气象资料数据的格式及内容,并采用软件工程技术借助Delphi7平台以C/S结构方式设计开发一个基于气象数据的气候统计分析和小波分析软件,具备用户使用权限的登录验证、各类气象观测资料的录入存储、气象资料数据的查询、气象数据的统计分析和小波分析等功能模块[5]-[8]。
2. 软件的总体设计
本软件的开发技术是基于Windows平台,采用Delphi7开发的一个基于C/S结合的模式的应用系统。具体包括主界面设计、窗体设计、按钮代码添加和图形显示设计等,为了使计算变得可视化,本系统将参数选取、计算数据以人机交互界面的形式出现,操作方便简单,这样开发出来的软件具有稳定性好、运算速度快及方便后续开发等特点。
2.1. 系统体系结构设计
系统的总体结构设计决定了系统如何进行网络结构配置,以及各个模块功能的配置。整个系统分为用户接口层、系统应用层、数据层,如图1所示。
Figure 1. System architecture diagram
图1. 系统体系结构图
2.2. 系统功能模块设计
(1) 系统总体功能结构图
结合前面对软件系统功能需求分析,本软件系统能够分成登录模块、数据录入模块、数据查询检索模块以及气象数据统计分析(小波分析)模块[9]-[14]。本软件结构如图2所示。
Figure 2. Breakdown of software system functional modules
图2. 软件系统功能模块细分图
2.3. 系统流程设计
图3所示为本系统软件的主要执行流程:首先开始运行软件,接着弹出登录窗口并连接数据库,对登录的用户账号以及密码进行确定,传输至服务器,并对用户账号以及密码进行认证。若用户账号、密码以及权限均通过了验证,那么就可以成功进到始化界面,并凭借此界面,可以开展各种操作,如气象要素观测数据录入,数据库数据管理维护,各类气象数据信息的查询检索,气象数据做小波分析以及密码的修改等系统的多种操作。
Figure 3. System flowchart
图3. 系统流程图
3. 软件数据库及各功能模块的实现
这一阶段的主要工作是将软件数据库及各功能模块的具体实现过程进行详细描述,包括整体分布结构的构造,各功能模块实现的具体算法等,并要求各算法必须是对的,算法的描述要完整,内容要简明扼要,方便后期算法排错以及软件的二次开发。
3.1. 数据库设计
3.1.1. 数据库的建立
本软件的数据库以目前旧的气象查询软件数据库为基础,能够直接调用旧有气象软件数据库,数据资料大多数为元数据。本软件系统将设计相关算法将新采集的数据直接导入(Z文件、A文件、Y文件等)或通过格式转换后导入到数据库中,并通过录入功能将气候概况、灾情情况等信息内容补充到数据库,还能将数据库内数据导出做小波相关性分析。
本软件系统选择用Microsoft SQL Server 2005建立数据库,将各气象要素如温度(T,表结构如3-1所示)、本站气压(P)、露点温度(Td)、能见度(V)、风(F)、雨量(R)、相对湿度(U)、蒸发(L)、天气现象(W)、日照(S)、浅深层地温以及站点信息(StationInfo)等数据存放在对应的数据表中。由于人们都习惯按照数据的采集日期或者台站号来进行检索,所以这里将日期(Riqi)和台站号(IIiii)针对每个数据表都建立索引来提高数据库的检索效率。
Table 1. Temperature data table (T)
表1. 气温数据表(T)
列名 |
数据类型 |
允许空 |
主键 |
描述 |
ID |
Int |
否 |
是 |
|
IIiii |
Nvarchar (50) |
否 |
否 |
区站号 |
Riqi |
Nvarchar (50) |
否 |
否 |
日期 |
T21 |
Float |
否 |
否 |
21点整点气温值 |
T22 |
Float |
否 |
否 |
22点整点气温值 |
T23 |
Float |
否 |
否 |
23点整点气温值 |
T00 |
Float |
否 |
否 |
0点整点气温值 |
T01 |
Float |
否 |
否 |
1点整点气温值 |
…… |
…… |
…… |
…… |
…… |
T20 |
Float |
否 |
否 |
20点整点气温值 |
Tmax |
Float |
否 |
否 |
日极端最高气温 |
Tmin |
Float |
否 |
否 |
日极端最低气温 |
Tavg |
Float |
否 |
否 |
4次平均气温 |
T24a |
Float |
否 |
否 |
24次平均气温 |
在表1中,ID是序列号,T21-T20是每次从21:00到20:00的每小时温度。按照《地面气象观测规范》中的规定,每日的20点定为气象观测要素(日照除外)的日界。
下图4为数据库实体关系图。气象要素相同的小时、分钟数据表以及小时、分钟质控数据表的字段是一样的。不同数据表之间相互联系相互作用从而实现整个软件的数据存储,奠定了数据处理基础:
Figure 4. System database E-R diagram
图4. 系统数据库E-R图
3.1.2. 数据库的连接
在Delphi7系统开发中,连接SQL Server 2005数据库的方式可以采用原生ADO对象和ADO Express组件实现。要连接到SQL Server 2005服务器,首先需要先配置好ADO组件的ConnectionString属性。由于与本系统的气象数据数据库相连的ADO组件的ConnectionString属性都是一样的,所以可以将所有ADO组件的ConnectionString属性配置成一个共享连接,这样仅需配置一个ConnectionString属性,能够加快对SQL Server 2005的访问速度。可以设置本系统的数据库存放在名为shaoyangxian\qxj的服务器上,其数据库名称为lv,登录用户为邵阳县气象局,登录密码为123。具体操作如下:
ADOConnection1.Connection
String:=’Provider=SQLOLE DB.1;
Password=123;
Persist Security Info=True;
User ID=邵阳县气象局;
Initial Catalog=lv;
Data Source=shaoyangxian\qxj’;
当连接属性设置完成以后,选择将连接对象打开,用户可以采用Open方法来完成到数据源的物理连接,这样就可以对数据库进行操作了。当用户不需要对数据库再进行操作时,可以通过Connection对象中的Close方法来断开数据库的连接,从而释放被连接占用的资源。
3.1.3. 数据库的操作
在软件设计开发中,当对数据库进行操作时,如查询、添加、删除数据项目,这些基本操作都可通过调用数据库对象方法来完成。但遇到比较复杂的操作时,就需要借助于SQL语言实现,SQL语言由命令、运算、子句、函数等组成。
(1) 查询:在数据表中利用一定的条件找到符合此条件的记录并构建成一张新表。
SQL的数据查询语句SELECT格式为:
SELCET [predicate] {*|table.*|[table.]field[,[table.]field2[,…]]} [AS alias1 [,
alias2[, …]]]
FROM tableexpression [, …][IN externaldatabase]
[WHERE…]
[GROUP BY…]
[HAVING…]
[ORDER BY…]
[WITH OWNERAccess OPTION]
以下是利用SELECT语句从雨量表中查询区站号为57860从2016年到2017年的所有值:
SELECT * FROM R WHERE IIiii=’57860’ and (datepart(year,riqi) between
‘ 2016 ‘ and ‘ 2017 ‘) order by riqi;
在对气象资料进行统计分析时,对国家气象观测站进行了各种分析统计,包括横向、纵向统计,与历史同期或某年的比较分析,查询要素值与历史同期值的绝对距平和相对距平,用于制作分析各种气象服务产品。
(2) 插入数据:在数据表中增加一条新记录。
插入语句INSERT INTO的格式为:
INSERT INTO target [(field1[,field2[, …]])]
VALUES(value1[, value2[, …]])
以下是在站点信息表中插入邵阳县站点信息值:
INSERT INTO stationinfo(staname,IIiii,lon,lat) VALUES(‘ 邵阳县’,’57860’,’110’,’27’);
(3) 修改数据:将数据表中的某一条记录进行修改。
建立一个UPDATE查询,通过条件的限制对特定的数据进行修改。UPDATE语法为:
UPDATE table
SET newvalue
WHERE criteria;
Update用一个新值来更新目前数据表中行的列,SET子句指定了要修改数据的列和需要替换的数据,WHERE指出了哪条记录行要被替换。以下是修改区站号57860的站点观测时间2017年9月21日13时的温度要素值为258:
UPDATE R SET T13=258
WHERE IIiii=’57860’and riqi=’2017-09-21’
系统运行过程中,修改最多的就是雨量值,由于区域站无人值守,容易出现各种故障,雨量的出入有时会出现较大误差,就需要人工干预,进行数据库修改。
(4) 删除数据:将数据表的某一条记录进行删除。
通过DELETE 对表中的记录进行删除,记录被删后,不能再还原,因此设置必须要正确。DELETE语句语法如下:
DELETE[table.*]
FROM tableexpression
WHERE criteria
DELETE从指定数据表中将符合给定条件的记录行删除,如果没有子句where,所有的记录行将会被删除。以下是删除雨量表2017年6月7日的记录:
DELETE * FROM R
WHERE riqi=’2017-06-07’
3.2. 软件各功能模块的实现
3.2.1. 登录模块的实现
在Delphi7中将系统登录窗体命名为:login_form,文件名保存为:login. pas,其中用到表t_user,在loginpas的implementation 部分用uses data,就可以直接使用t_user,给登录按钮增加一个登录代码,根据SQL中的用户账号、密码、和等级判断,如果是普通用户“a”输入密码“b”则只获得“c”普通权限,不能使用密码修改和录入等功能。管理员身份登入则获得全部权限。登录模块设计设置为:当登录信息不正确时显示“登录失败”等;当密码输入三次不正确时,程序关闭。
3.2.2. 气象数据录入模块的实现
使用Delphi7开发基于气象数据的气候统计分析与小波分析软件时,必然要建立相应的大型气象资料数据库。这意味着大量的气象数据对软件录入功能有比较高的要求,大量的气象数据资料在更新和维护时的工作量是巨大的,如果单凭人工手动输入的方法对气象数据库进行增加、删除或修改等操作,非常地消耗时间和精力,效率及极其下,而且时间久了人在疲劳之后非常容易出现输入错误。因此,最方便的方法便是通过格式转换等将气象软件采集到的数据直接导入。而对于不方便导入的数据部分,本系统可以采用采用静态方式的数据录入和修改方法,通过下拉表框从数据库里面调出相应的数据,就可以针对这些数据进行添加、删减等处理,最后点击保存,完成数据维护工作(见图5)。
Figure 5. Establishment of the database
图5. 数据库的建立
3.2.3. 数据库查询模块的实现
(1) 静态查询
静态SQL语句不带任何的变量与参数,它在软件最初构思的时候就定下来了。其语言编辑规则如下:
SELECT * FROM TableName WHERE Columnname=常数
上述查询方法由于受到语句限制一次仅能够查询符合当前查询语句条件的结果,虽然效率不太高,但是可以用来满足某些比较单一而又特别的查询,比如查询台站某年的旱涝等气候概况之类的。
动态SQL语句的参数大多直接选取列或者表的名字,它的语言编辑如下:
SELECT * FROM TableName WHERE Columnname=:String
:Stirng是程序运行时给出的一个参数,是一个变量名。动态查询的调用方法以及执行方法与静态查询技术基本上是相同的,它们的区别在于是动态SQL在执行时必须有实际的参数值。
多条件下的动态查询是一种联合形式的查询方法,通过对数据表中所要查询的一个或任意多个字段组合后再进行查询。动态查询方法需要在SQL文本中附带实际的变量参数值,事实上在实际的应用当中,多条件动态查询方法同样也需要事先设定好要查询的字段的参数,因此对于多个条件的查询也不是很便捷。
本系统运用了Query的静态查询原理,在软件运行的时候,运用WHERE后的关系式,动态地改变查询条件的文本。具体的方法是:首先在combobox2中,从表jx_dy中选取某个字段;然后在eombobox5中选择运算关系式(>,<,≤等);在eombobox9 (或文本框)中输入查询的值;最后鼠标点一下“查询”,程序就开始进行查询任务了。
(3) 组合查询
组合查询就是编写相关逻辑语言,将表中一些独立的查询语句关联起来,形成一个查询条件组合,它的语句编辑如下:
SELECT * FROM TableName WHERE Clausel {AND,OR} Clause2…
利用软件的数据库查询界面中的设计组合查询功能,也能够实现组合查询。首先将若干个独立的查询条件输入到界面里面,然后再将其组合起来也算是一种组合查询。
还有一种查询方式叫做模糊组合查询,它同时包含有组合查询功能以及模糊查询功能,其语句编辑如下:
SELECT * FROM Table WHERE Col1 LIKE :Strl {AND,OR} Col2 LIKE :str2
组合查询和模糊查询的方式是使用得最多的数据库查询方式,想要提高程序的查询速度和效率,丰富查询的结果,就需要在软件设计的初始阶段选择好最合适的查询语句。
(4) 时段统计查询
在做气象资料研究或者在做为农服务产品时,经常需要用到某一些时段内的气象要素值统计。时段统计查询功能就是查询某个时段内单站多个气象要素值或者某个时段内多个站点的单个气象要素值,查询结果还可以进一步按照某项条件设定来行综合统计,并可对查询结果进行复制、导出为excel或txt等操作。查询时段通常选取逐日、逐候、逐旬、逐月、逐年等。
下面是时段内逐旬平均气温统计查询和风向风速统计查询方法:
逐旬平均气温查询
过往的逐旬统计方法通常得将逐日的平均气温数据先行读出,然后再进行计算,效率不高,很费时间。本系统选用Riqi字段,其形式为“YYYY-MM-DD”,用代码“ATEPART([year], Riqi) AS年,DATEPART([month], Riqi) AS月,CASE(DAT EPART([day],riqi) - 1)/10 WHEN 0 THEN 1 WHEN 1 THEN 2 else 3 END as旬”构建成年、月、旬三个别名字段,然后通过聚合函数group by按年、月、旬分组统计,就可以得到平均气温的逐旬统计结果了,逐年、逐月、逐候的统计查询方法与之类似。
以下为邵阳县2017年的逐旬平均气温统计查询的相关代码:
SELECT DATEPART([year], Riqi) AS年, DATEPART([month], Riqi) AS 月,CASE (DATEPART([day],riqi) - 1)/10 WHEN 0 THEN 1 WHEN 1 THEN 2 else 3 END as旬,round(Avg(case when Tavg <32700 then Tavg else 0 end *1.0),0) as YS
From T
where IIiii =57860 and (Riqi>='2017/1/1') and (Riqi<='2017/12/31') and Tavg<32744
GROUP BY DATEPART([year], Riqi), DATEPART([month], Riqi), CASE (DATE
PART([day],riqi) - 1)/10 WHEN 0 THEN 1 WHEN 1 THEN 2 else 3 END
ORDER BY 年,月,旬
3.2.4. 气象数据的统计与分析模块的实现
气象数据的气候统计分析和小波分析模块主要分为数据的综合统计和小波分析制图两个部分。前者主要依靠系统的查询模块设计相应SQL语句来做气象要素的平均值、最高、最低值等统计,或者与历年同期值进行横向和纵向的比较来获取丰富的查询结果,并将结果导出来获取连续等时长序列标准化数据;后者通过选取合适的小波分析方法直接将前者的连续等时长序列标准化数据绘制成小波图形。
Morlet复数小波的运用主要是去了解气温、降水、蒸发量等的周期结构和变化规律,同时提供科学的预测依据。对满足一定条件的小波函数
,时间序列
的小波变换为:
(3-1)
上式中:
为小波系数;
为复共轭函数;a为尺度因子;b为平移因子。
本文采用Morlet小波函数对各气象要素进行连续小波变换,即
(3-2)
其中:c为常数;i为虚数。小波系数实部的变化趋势与信号的起伏是基本对应的,等值线中心为高低值中心(负小波系数为低值,正小波系数为高值),等值线中心值的大小能够反映出波动的振荡强度。
小波方差反映的是波动的能量随尺度的分布,可以用来确定一个时间序列中各种尺度扰动的相对强度,对应峰值处的尺度即为该序列的主要时间尺度,即主要周期.小波方差计算公式为
(3-3)
4. 基于气象数据的气候统计与小波分析软件系统的测试
4.1. 登录模块测试
建立邵阳县气象局为普通账户,密码设为123,管理员账户为57860,密码为SYX123,以下图6为本软件系统的登录窗口:
Figure 6. Software login window
图6. 软件登录窗口
4.2. 录入模块测试
气象数据录入模块首先能够直接将新采集到的气象数据导入到录入界面当中(这些气象数据主要是温度、相对湿度、降水、日照以及风向风速等气象要素数据资料),在录入界面管理员可以根据需要将异常数据进行修改或删除等处理,然后点击保存将新数据存储到数据库当中,并且在录入界面管理员可以将数据重新以Excel或txt格式导出;而气候概况、灾情情况等文字信息则通过手动录入。其导入后界面如图7所示。
4.3. 查询模块测试
图8所示为基于气象数据的气候统计分析和小波分析软件中查询模块,通过多个下拉列表框组合查询的方式检索邵阳县站1981年~2017年的各月日最高气温 ≥ 35℃日数及年最长连续日数的统计数据。
Figure 7. Interface after importing new meteorological data into the software
图7. 软件导入新气象数据后的界面
Figure 8. Software query module interface
图8. 软件查询模块界面
4.4. 统计分析模块测试
气象数据的统计分析模块的测试首先要通过查询模块对数据库进行相关统计查询,获得一段连续等时长序列标准化数据(如气温、降水等),将查询结果导出成txt文本,再经统计分析模块中的小波分析程序处理,进而画出小波分析图。
(1) 小波分析功能测试:利用某气象站1961年~2010年降水量数据作为时间序列,用气象数据气候统计分析和小波分析软件导出这50年的连续等时长序列标准化降水数据,利用本软件小波分析模块画出了小波系数实部图、小波系数方差图、小波系数模图,如图9所示。
Figure 9. (a) Real part plot of wavelet coefficients, (b) Variance plot of wavelet coefficients, (c) Modulus plot of wavelet coefficients
图9. (a) 小波系数实部图、(b) 小波系数方差图、(c) 小波系数模图
从图9中可分析出该站降水在演变过程中的多时间尺度特征:
① 图9(a)图中横坐标为时间(年份),纵坐标为时间尺度,图中的等值曲线为小波系数实部值。小波系数实部等值线图能反映径流序列不同时间尺度的周期变化及其在时间域中的分布,进而能判断在不同时间尺度上,降水的未来变化趋势。为了比较清楚地说明小波系数实部等值线图在径流多时间尺度分析中的作用,当小波系数实部值为负时,用虚线绘出,表示为雨水干涸期,实部值为正时,在图中我们用实线绘出,表示为雨水丰沛期。
图中小波系数实部图存在三类尺度周期变化规律,分别为25~35年、5~8年、2~3年的,其中2~3年周期在整个分析时段表现最为稳定,震荡周期在90年代初最为明显,5~8年周期次之。
② 将不同时间尺度下的小波系数代入可得降水变化的小波方差,以小波方差为纵坐标,时间尺度a为横坐标,可绘制小波方差图(图9(b))。
小波方差图能反映降水量时间序列的波动能量随尺度a的分布情况。可用来确定降水演化过程中存在的主周期。图9(b)小波系数方差图中有3个明显的峰值,分别代表30年、7年和2年的时间尺度。最大峰值对应2年尺度,是年域年径流变化的第一主周期,7年和30年分别对应第二、第三周期。
③ 小波系数模等值线图在多时间尺度分析中的作用:Morlet小波系数的模值是不同时间尺度变化周期所对应的能量密度在时间域中分布的反映,系数模值愈大,表明其所对应时段或尺度的周期性就愈强。图9(c)小波系数膜图中2~3年时间尺度膜最大,表示该尺度周期变化最为明显,6~8年的时间尺度变化周期次之。
(2) 小波功率谱分析功能测试:这里选取近130年的NINO3指数(1880~2010年赤道东太平洋的一个海温关键区的海温距平)作为连续等时长序列标准化数据,测试本软件小波攻略谱分析功能对外部数据对处理情况,功率谱如图10所示。
图10中Morlet小波功率谱图中的值越大显示各个周期的能量越大。影响锥线以下的为小波功率谱受到边际效应影响部分,表现出来的周期特征存在较大不确定性,没有参考价值。影响锥线以上部分不受边际效应影响。图中还采用红噪声作为背景谱对小波功率的显著性进行检验,其中闭合粗线内的小波功率谱通过了5%的显著水平检验。
Figure 10. The upper figure is the time series plot of NINO3, and the lower figure is the power spectrum of NINO3
图10. 上图为NINO3时间序列图、下图为NINO3功率谱
由图10小波功率谱图可以分析出稳定通过检验的区域对应的周期特征为2~4a周期出现在1883~1918年和1978~1983年,周期特征为4~8a周期出现在1918~1930年和1992~1998年,周期特征为13~15a周期出现在1912~1923年,其中以2~4a周期特征最为明显。
通过分析可以得出NINO3存在多时间尺度特征,不同时段内具有不同周期特征。
5. 结论与展望
5.1. 本文结论
论文针对气象数据处理以及气象服务的各项需求,运用计算机信息技术,探索了科学合理的处理方案,设计并初步实现了基于气象数据的气候统计分析和小波分析软件系统。开发出了一个集录入、查询、综合统计以及小波分析的功能软件,能方便气象数据研究的需要和三农服务产品的制作,本系统基本上达到了本文预期的要求。下面将对工作任务做一个完整总结,本文主要研究内容如下:
(1) 探讨了基于气象数据的气候统计分析和小波分析软件开发的背景以及开发意义和目的,本软件的开发具有很大实用价值,能给今后的气候数据研究工作带来极大的便利,从而更好地做好气象为农服务和气象灾害防御工作。
(2) 构思软件开发的整体设计,然后对软件系统的体系结构、功能模块和系统流程进行了详细设计,并给出了相关算法流程图。
(3) 对系统的数据库的构建进行了阐述,重点论述了软件系统主要功能模块的实现过程,给出了各模块实现的主要编码。该软件是集录入、查询、综合统计和小波分析于一体的软件。为气象数据研究、气候预测、“三农”等专业气象服务等带来了极大便利。
(4) 对该软件系统各功能模块进行了独立测试,软件各功能模块通过了全部的测试,进而验证了软件各项功能实现的合理性、有效性以及科学性。
5.2. 后续工作展望
虽然本软件基本满足了预期目标需求,但依然存在一些需要改进的地方,今后需要不断完善:
(1) 软件的一些功能模块功能比较浅显,软件开发设计的初始想法未能得到完美实现,软件各功能模块比较分散独立,其整体融合度还有待完善。
(2) 海量的气象数据并不是单单凭借SQL Server2005就可以完全处理好的,各种气象软件数据库的兼容性还有待进一步解决,若要确保软件更好地实现查询、检索、分析以及处理等功能,软件开发还能够运用DB2以及ORACLE等超大型数据库。
(3) 对于软件的资料共享功能还有待后续开发,可思量采取大型的分布式系统和云计算方法:广义云计算主要为提供服务和交付的模式,通常借助于互联网而获取所需资源。其属于一种分布式计算、Web服务技术的集成开发,一个重要功能是为用户给予按需服务,具备安全性高、规模大以及虚拟化等特性;当前有许多关于云计算的技术文献,可以给予软件的完善进行指导。云计算很有可能会发展为主要工作平台,需要不断去研究探讨。