《气象信息与网络技术课程设计地面探空电码译码系统.doc》由会员分享,可在线阅读,更多相关《气象信息与网络技术课程设计地面探空电码译码系统.doc(23页珍藏版)》请在三一办公上搜索。
1、气象信息与网络技术课程设计 题 目 地面/探空电码译码系统 学生姓名 学 号 学 院 专 业 设计时间 16周 二一五年六月三十日地面/探空电码译码系统文摘要:气象资料是对气象进行预测和气象研究的重要依据,而各国各地的气象资料都是以编码的形式进行互相传递的,气象要素的信息以代码的形式储存在文件中。而我们的地面/探空电码译码系统是基于C语言的译码系统,根据气象信息编码的特点翻译出编码表示的气象要素。用户提供的年月日及地区等指示可找到对应的气象要素信息,如温度,露点,风速,风向等。这样用户可以方便地知道地面报文和探空报文所指示的气象。从而可以方便各种研究和应用。关键词:地面报文;探空报文;译码系统
2、;气象要素;一、 前言气象地面报文电码具有地面各种气象要素和天气现象,如气温、湿度、风向、风速、海平面气压和雨、雪、雾,还具有记录云高、云状、天气演变如三小时变压、气压倾向等。近年来,随着计算机技术的快速发展以及卫星通信技术的研究深度的加深,地面气象报文系统的发展日益完善,报文电码的发展与计算机技术相关度越来越大,二者相结合为人类的日常生活产生了日益深远的影响。 我国是自然灾害频发的国家,而气象灾害又是在自然灾害中损毁程度最严重的。 如我国最近几年发生几次大的寒潮,以及每年夏天发生的台风等同时每次自然灾害给人民的生产生活都带来了极大的不便甚至对一个地区的生产秩序起到破坏性的作用,因此国际国内对
3、天气系统的变化情况越来越关注,而在气象领域对卫星观测资料的依赖度越来越大,天气资料在天气预报系统中占据越来越重要的作用,气象报文信息发挥了比以往更关键的角色,气象台根据气象信息预报寒潮、台风、暴雨等自然灾害出现的位置和强度,就可以直接为工农业生产和群众生活服务,通过应急准备及人员疏散等可以讲自然灾害带来的损害讲到最低。气象信息就成为现代社会不可缺少的重要信息。同时,气象信息的作用与气象代码翻译工作是分不开的,通过现代化的手段以及先进的通讯工具,气象电码的翻译工作效率大大提高,气象信息一经翻译,依赖于先进的通讯工具就能够及时地发布出去,具有很强的实时性,因而此代码翻译系统是具有重要意义的。在我们
4、可接触到的各种电码翻译系统中,翻译系统的实现采用了多种语言,本文提供一种基于C语言的电码翻译系统,根据地面报文电码的特点通过相关的语句翻译出所表示的气象信息。世界气象组织所属的天气监测网由一百多个成员国组成,其观测系统中包括十多颗卫星、三千多架飞机、一万多个陆上观测站、七千多个船舶观测站以及九百多个携带自动气象站的系统航标和浮标。世界天气观测网络就是通过这个观测系统提供最新的全球天气预报的。每天,高速电信链路通过三个世界级气象中心、34个区域性气象中心和187个国家级气象中心向全球传输气象资料和气象图。气象资料是气象科学对天气过程进行的预测及对大气活动规律进行研究的主要依据,气象资料交换是气象
5、业务的科研的基础。但是,由于各国文字的不一致性,和文字占据大容量存储空间的问题,决定将其以规定的编码形式在国际国内间进行交换。气象地面电码和探空电码就是其中的一种可供交换编码。各个行业都有各自的国际电码。地面气象观测的天气电码,不但反映天气实况,而且也反映了天气的演变规律。因此,必须从天气学的角度去理解和选用天气报告电码。这是全面、准确反映测站天气实况和保证天气预报工作、减少人为失误的重要环节。电码需要按照一定的规则编写,这样,译码者才能按照那个规则译出电码所代表的通俗易懂的信息。随着社会、经济的飞速发展和人民生活水平生活质量的大幅度提高,社会上各行各业对气象部门提出了全方位、多时效、针对性强
6、、准确度高的天气预报服务要求。社会需求永远是天气预报发展的动力和压力。为了适应日益增长的社会需要,做好预报服务,预报员需要用到近年来许多新的知识和参考资料,尤其是各个地区的地面和探空气象资料分析,能够有效帮助预报员分析当地的天气现象,从而做出比较准确的天气预报。二、 需求分析1、提供给天气预报员实时天气资料,以便实时进行天气分析及准确预报。实时天气资料是天气分析和预报的基础,因为天气总在不断的变化,依据最接近所要预报的时间的实时天气资料所得出天气预报的准确程度最高,短期的天气预报总比长期和中长期的天气预报准确。所以想要得到较为准确的天气预报,必不可少的是方便及时地获得实时资料信息,这就需要电码
7、译码系统来帮助实现。编写成电码的方式,能有效地节约信息传送的时间和空间,增加了天气预报的时效。 2、提供给科研人员过去和现在的天气各要素资料,从气温、气压、风、云、降水、能见度和空气湿度等,得出天气的性质,并且广泛地采用绘图,建表等分析方法,加上具体情况的具体分析,联系各个地方、各个时段的天气情况,找出天气变化规律,系统地进行研究,以便分析总结,研究天气的发展、演变,为揭示天气变化、研究大自然的奥妙,进而应用天气现象做出贡献。该系统对于这些大型的研究来说只是渺小的一小步,但确是不可或缺的一部分。 3、为二次天气应用开发提供天气资料,从而生产各种应用产品。天气应用十分广泛,天气信息可以直接应用播
8、报天气情况,还可以应用在二次天气软件上,如可以设计出查询实时天气情况的软件,输入年月日时段和地点,即可显示出具体气象要素的信息,把软件安装在手机上,随身携带,方便快捷,符合大众的应用要求。4、提供给开发人员一个译码工具,方便开发人员优化开发,充分利用译码的语句和设计流程,不需要开发人员重新设计,可以直接使用,如此简化了气象台的工作量,增加了其工作效率。此外,还给教师的教学提供了很大的方便,教师直接输入需要知道的时间站点信息即可得到对应的气象要素值,学生可以很好地了解具体的气象要素信息,能更好地学习气象知识。5、提供给普通用户查询天气实时或过去天气资料,用户自己总结天气状况,决定自己在穿衣御寒防
9、热还有度假出行等方面的生活。6、提供给农民获取实时天气和过去天气资料,对比现在天气情况,从而比较好地进行播种、收割等农家活动。有了科学技术的支持,农业生产能取得迅速地发展,收获更多地粮食,养活更多的人口。7、提供给工厂天气情况,有些产品的生产与天气的要素如温度、湿度等有着很大的关系,清楚地了解了具体的天气情况就能及时调整这些因素,这对产品的生产有很大的益处,工厂生产效率也能极大的提高。三、 概要设计1、 设计思路读取气象电报电码文件,经过本电码译码系统,生产各气象要素。地面电码资料的气象要素有:温度、露点、本站气压、海平面气压、气压趋势、气压变化量、降水量、天气现象、云状、能见度,风向飞速、总
10、云量等;高空电码资料的气象要素分13层:地面、1000hPa、925hPa、850hPa、700hPa、500hPa、400hPa、300hPa、250hPa、200hPa、150hPa、100hPa;高空电码资料的每层气象要素是:温度、温度露点差、气压、风向飞速。编程思路是:由用户输入要译码的年、月、日、世界时次和台站号(注:有可能的话用地名),并选择地面或高空;由译码系统进行译码,生产出气象各要素,在屏幕上显示。2、 地面/探空电报译码数据流图地面/探空电报码以文件形式存放,固定为8.3格式。地面电报码文件格式是:AAXXmmdd.Thh,探空电报码文件格式是:TTAAmmdd.Thh。其
11、中AAXX表示地面报;TTAA表示探空报;mm表示月份,用2位数字0112;dd表示日,用2位数字0131;hh表示时次,用2位数字,地面有00、03、06、09、12、15、18、21共8个时次,探空有00、06、12、18共4个时次,都用世界时。地面/探空电报译码数据流图如图1所示。地面/探空电码文件电码译码系统各天气资料要素 图1 电码译码系统数据流图3、 地面/探空电报译码程序总流程图根据电码文件名是8.3格式,并且与月日时次形成固定关系,因此可以采用输入年月日时次的数据来组合文件名。地面14位固定为“AAXX”,探空14位为“TTAA”,56位为2位数月份,78位为2位数日,910位
12、为固定为“.T”,1112位为2位数时次。地面/探空电报译码程序流程图如图2所示,读取文件,找到指定台站的位置,并读取指定台站的电码到一个字符串数组中,然后传递给地面或探空处理程序继续处理,分解出天气各要素。最后显示结果。开始输入年月日世界时及台站号输入选择地面或高空文件存在?NY读取电码文件结束显示出错信息根据年月日世界时组成文件名指定台站号?文件结束?YNN地面/高空?Y地面处理程序高空处理程序高空地面 图2 电码译码系统程序流程图四、 详细设计由用户输入的P的值判断是否是高空资料分析或者是地面资料分析,P=1,代表是对地面要素的分析,P=2则代表是对高空各个气象要素的分析。P=1,调用地
13、面气象要素分析函数。分解已读入的这一行字符串,第04字符是台站号;第610字符分别对应着iRiX云底高度,能见度;第1216字符分别对应着总云量,风向,风速。令K=18,然后判断K是否还小于等于字符串总数,若成立,则进行下一步,分析地K字符代表的内容,K字符人为的规定可以表示气温,露点,本站气压,海平面气压,气压趋势,降水量,天气现象,云状,发报时间。然后分析字符里的数据具体是多少,到表天气要素的一个什么状态,反馈到用户方面。再调整K=K+6,继续重复从判断K的值是否有意义开始的内容,一直到字符串里的所有字符信息都已经分析反馈结束为止。地面各要素地面各要素入口k=18NY返回kn?第k字符为1
14、23456789气温露点本站气压海平面气压气压趋势降水量天气现象发报时间云状k=k+6分解已读入的这一行字符串。第04字符台站号IIiii;第610字符iRiXhVV;第1216字符Nddff 图3译出地面各要素功能流程图P=2,表示用户需要的事探空各气象要素,然后分解已经读入的这一行字符串,第0到11字符不用,第12到16的字符代表台站号。令K=18,在K在合理的范围内时,分析K:K+1字符,由它们的数值判断气象要素所属的层数,继而分别译出气压,温度,温度露点差,风向风速。然后K=K+18,重复上面的判断过程。一直到K的数值大于n。探空各要素地面各要素入口k=18分解已读入的这一行字符串。第
15、011字符不用;第1216字符台站号NY返回kn?第k:k+1字符为999200857050/4020/15/10地面925hPa1000 hPa850hPa700hPa500/400300/25030/25200/150/100分别译出气压,温度,温度露点差,风向风速。k=k+18 图4译出探空各要素功能流程图五、 编码设计利用计算机高级语言对程序流程图进行编程,采用C语言编程。1、编写主控程序,通过输入年月日时次,然后选择地面或高空,再输入要处理的台站号。根据输入信息,自动组成相应的文件名,从文件中读出指定台站电码资料,存入字符串数组ch中,然后调度地面dmdisp子程序或高空updisp
16、子程序进行相应的处理。 #include / 程序中要用到输入/输出函数 #include / 程序中要用到字符串处理函数,如strlen、strcpy等int str2int(char *ch,int k,int n); / 对字符串从k位置开始,长度为n的子字符串转/ 换为整型值。对于含有非数字字符,则返回-1 void dmdisp(char *ch); / 对字符串ch进行地面译码的功能函数 void updisp(char *ch); / 对字符串ch进行高空译码的功能函数 void main(void) / 主控程序入口 int year,month,day,hour; / 定义年
17、year、月month、日day、时次hour int n,p; / 定义位置计数器n,临时变量p char station6,ch400; / 定义台站号station、存放电码字符串数组ch FILE *fp; char name30; / 定义读文件指针,文件名name int days=0,31,28,31,30,31,30,31,31,30,31,30,31; / 定义每月天数 printf(请输入年、月、日n);while(1) scanf(%d%d%d,&year,&month,&day); / 输入年月日用空格隔开 if (year % 4 = 0) days2=29; els
18、e days2=28; if (month=1 & month =1 & day=0 & hour =21 & hour % 3 =0) break;else printf (输入有错,请重新输入地面世界时:021,间隔为3n); n=strlen(name); / 以下生成电码文件名,存放在name中 namen-2=0+hour/10; namen-1=0+hour%10; / 加入时次,2位数 namen-8=0+month/10; namen-7=0+month%10; / 加入月份,2位数 namen-6=0+day/10; namen-5=0+day%10; / 加入日期,2位数
19、printf(请输入台站号,南京为58238,北京为54511,上海为58362n); scanf(%s,station); / 台站号存放入station中 if (fp=fopen(name,rt) / 打开name电码文件,以便读入资料 fgets(ch,80,fp); / 跳空一行fgets(ch,80,fp); / 跳空一行if (p=1) fgets(ch,80,fp); / 如果处理地面,则跳空一行 while(!feof(fp) / 如未找到指定台站号,则一直到文件结束 fgets(ch,80,fp); / 读入一行,存放到ch字符串数组中 n=strlen(ch)-1; /
20、计算ch字符串实际读入个数 while (n300 & chn-1 != = & !feof(fp) / 一直到读完退出循环 chn= ; / 在ch字符串尾留出一个空格,预备后续存放 fgets(&chn+1,80,fp); / 继续读入一行,存放到ch字符串数组后面中 n=strlen(ch)-1; / 重新计算ch字符串实际读入个 if (!strncmp(&chp-1,station,5) / 是否找到指定台站号,未找到继续循环 if (p=1) dmdisp(ch); else updisp(ch); / 找到,则作相应的调度处理p=0; break; / 退出循环,准备结束程序运行
21、 fclose(fp); / 关闭文件if (p!=0) printf(你指定的%s-台站未找到,请检查!n,station); else printf(你指定的%s-文件不存在,请检查!n ,name); 2、对ch字符串数组从k位置开始,规定字符串从0开始计数,长度为n的子字符串转换为整型值。对于含有非数字字符,则返回-1。例如ch=”123456/78”,则函数str2int(ch,2,3)返回345;函数str2int(ch,5,3)返回-1。 int str2int(char *ch,int k,int n) / 字符串转换成整数值函数 int i,m=0; / 循环变量i,中间变量
22、m,用于存放结果整数值 for(i=0;in;i+) if (chk+i 9) break; / 字符串中含非数字,中途跳出 m=m*10+chk+i-0; / 字符串转换成整数值 if (i=n) return m; else return -1; / 返回结果值 3、对字符串电码ch进行译码,翻译出高空各要素的值进行显示。 void updisp(char *ch) / 对ch进行探空译码 int n,i,p,y; / n表示当前字符串位置,p表示转换出的整数值printf(=读出的探空电码=n); puts(ch); / 显示读到的字符串电码内容 printf(=探空译码结果=n); n
23、=(ch10= ) ? 11 : 12 ; / 调整好当前位置,如果“TTAA”后只有一个空格, / 则n取11;若有两个空格,则n取12 y=str2int(ch,n-6,2); / 取出月份给y保存,处理风速时要用到 printf(区站号:); / n已指出台站号位置 for(i=0;i5;i+) printf(%c,chn+i); / 输出台站号 printf(n); / 换行 while(1) / 死循环,中途必须用break跳出循环 n+=6 ; / 调整好当前位置,准备处理hhPPP p=str2int(ch,n+2,3); / pPPP电码,处理气压,位势米 if (chn=9
24、& chn+1=9) / 99:地面气压 /此处输出地面气压的位势米高度p,若p100,则加1000;否则p就是位势米。 if(p500,则500-p;否则p就是位势米。 if(p500)p=500-p; printf(1000hPa气压:%d,p); else if (chn=9 & chn+1=2) / 92:925hPa气压 /此处输出925hPa气压的位势米高度p,p就是位势米。 printf(925hPa气压:%d,p); else if (chn=8 & chn+1=5) / 85:850hPa气压 /此处输出850hPa气压的位势米高度p,p加1000。 p=p+1000; pr
25、intf(850hPa气压:%d,p); else if (chn=7 & chn+1=0) / 70:700hPa气压 /此处输出700hPa气压的位势米高度p,若p300,加2000;否则加3000。 if(p300) p=p+2000; else p=p+3000; printf(700hPa气压:%d,p); else if (chn=5| chn=4) & chn+1=0) / 500hPa或400hPa气压 /此处输出500hPa或400hPa气压的位势米高度p,p乘以10。 p=p*10; printf(%c00hPa气压:%d,chn,p); else if (chn=3 &
26、chn+1=0) | (chn=2 & chn+1=5) / 此处输出300hPa或250hPa气压的位势米高度p, / 若p500,则加1000后乘以10;否则p乘以10。 if(p=0) /此处输出温度p,p为偶数表示零上,否则为零下 if(p%2=0) printf(,温度:零上%.1f,0.1*p); elseprintf(,温度:零下%.1f,0.1*p); p=str2int(ch,n+3,2); / pDD电码,处理露点差,单位,。 if (p=0) / 此处输出露点差p,若p50,则减去50;否则除以10 if(p50) p-=50; else p=p%10; printf(,
27、露点差:%d,p); n+=6; / 调整好当前位置,准备处理dddff p=str2int(ch,n,3); / pddd电码,处理风向 if (p%5=0) / 此处输出风向p,必须是5的倍数,否则缺测 printf(,风向:%d度,p) ; p=str2int(ch,n+3,2); / pff电码,处理风速 if (p=0) / 此处输出风速p,注意风速的单位与y有关? if (y50) printf(,风速:%.1f米/秒,p*0.5); else printf(,风速:%d米/秒,p); printf(n); 4、对字符串电码ch进行译码,翻译出地面各层各要素的值进行显示。void
28、dmdisp(char *ch) / 对ch进行地面译码 int n,i,p; / n表示当前字符串位置,p表示转换出的整数值char cl105=无低,淡积,浓积,积雨,积层,层积,碎雨,碎雨,积,鬃积; char cm105=无中,高层,雨层,高积,荚状,层积,积雨,积层,积,散积; char chh105=无高,毛卷,密卷,伪卷,钩卷,卷,辐卷,卷层,层,卷积; char cw79=沙尘暴,雾,毛毛雨,非阵性雨,固体降水,阵雨,雷暴;char vv116=7万,50,50,2百,5百,1千,2千,4千,1万,2万,5万;char nh106= 无云,1成,2-3成,4成,5成,6成,7-
29、8成,9成,10成,有雾;char ww9615= 烟,霾,霾,霾,霾,霾,轻雾,片状浅雾,连续浅雾,闪电,高空有降水,远处有降水,附近有降水,雷暴无雨,飑,龙卷, 毛毛雨, 雨, 雪、米雪,雨夹雪, 雨夹雨淞,阵雨, 阵雪,冰雹,大雾,雨夹雷暴,较轻沙尘暴,轻沙尘暴,中沙尘暴,中强沙尘暴,强沙尘暴,增强沙尘暴,轻低吹雪,强低吹雪,轻高吹雪,强高吹雪,雾散开,散片雾,可辨雾变薄,不可辨轻雾变薄,可辨雾,不可辨雾,可辨雾变浓,不可辨雾变浓,可辨雾淞,不可辨雾淞,间歇轻毛毛雨,连续轻毛毛雨,间歇中毛毛雨,连续中毛毛雨,间歇浓毛毛雨,连续浓毛毛雨,轻毛毛雨,浓毛毛雨,轻毛毛雨夹雨,浓毛毛雨夹雨,间歇
30、小雨,连续小雨,间歇中雨,连续中雨,间歇大雨,连续大雨,小雨夹雨淞,大雨夹雨淞,小雨夹雪,中雨夹雪,间歇小雪,连续小雪,间歇中雪,连续中雪,间歇大雪,连续大雪,冰针,米雪,雪晶,冰粒,小阵雨,中阵雨,大阵雨,小阵性雨夹雪,大阵性雨夹雪,小阵雪,中或大阵雪,小阵性霰,中或大阵性霰,轻冰雹,中或强冰雹,雷暴后小雨,雷暴后中雨,雷暴后小雪,雷暴后大雪,小雷暴伴雨雪,小雷暴伴冰雹,大雷暴伴雨雪,雷暴及沙尘暴,大雷暴伴冰雹; printf(=读出的地面电码=n); puts(ch); / 显示读到的字符串电码内容 printf(=地面译码结果=n); printf(区站号:) ; / 准备处理IIiii
31、 for(i=0;i5;i+) printf(%c,chi) ; / 输出台站号 printf(n) ; / 换行,准备处理iRiXhVV switch(ch8) / 处理云底高度h case 0 : printf(云高50米); break; case 1 : printf(云高50-100米); break; case 2 : printf(云高100-200米); break; case 3 : printf(云高200-300米); break; case 4 : printf(云高300-600米); break; case 5 : printf(云高600-1000米); brea
32、k; case 6 : printf(云高1000-1500米); break; case 7 : printf(云高1500-2000米); break; case 8 : printf(云高2000-2500米); break; case 9 : if (ch12=0) printf(无云高);else printf(云高2500米); break; p=str2int(ch,9,2); / 处理能见度VV,pVV电码,单位米或千米if(p=0) printf(,能见度为:=1&p=51&p=3万); if(p=81&p=88) p=(p-80)*5+30)*1000; printf(,能
33、见度为:p); / 此处根据p输出能见度资料,注:p88 已处理 if (p88) printf(%s米,vvp-89); / 准备处理Nddff:总云量N、风向dd、风速ff if (ch12!= /) printf(,总云量:%s,nhch12- 0); / 处理总云量N p=str2int(ch,13,2); / 处理风向dd,要放大10倍,单位度 if (p=0) printf(,静风); if (p0) printf(,风向:%d度,p*10); p=str2int(ch,15,2); / 处理风速ff,单位米/秒 if (p0) printf(,风速:%d米/秒,p); print
34、f(n); / 换行 n=18; / 调整好当前位置,准备处理温度、露点温度等资料 if (chn= 1) / 处理温度 1sTTT 单位0.1 已处理好 p=str2int(ch,n+2,3); / pTTT电码,即温度资料 if (p=0) /此处根据p输出温度资料,chn+1为零表示正,否则为负。 if (chn+1=1) p=-p; printf(气温:%.1f,p/10.0); n+=6; / 调整好当前位置 if (chn= 2) /处理露点温度 2sTdTdTd 单位0.1 p=str2int(ch,n+2,3); / pTdTdTd电码,即露点温度资料 if (p=0) /此处根据p输出露点温度资料,chn+1为零表示正,否则为负。 if(chn+1=0)printf(,露点温度为:%.1f,p*0.1); else printf(,露点温度为:-%.1f,p*0.1); n+=6; / 调整好当前位置 if (chn= 3) /处理本站气压 3P0P0P0P0,单位0.1hPa。 p=str2int(ch,n+1,4); / pP0P0P0P0电码,即本站气压资料 if (p=0) /此处根据p输出本站气压资料。 if(p=0) / 此处根据p输