一、模拟生成气象观测数据详解

一、项目的大致流程

  气象数据中心的大致流程如下。
在这里插入图片描述

二、模拟生成气象观测数据

  本来气象观测数据是从气象观测站点获取的,现在我们只知道有哪些气象观测站点以及它的一些地理信息。但是现在无法从对应的气象观测站点获取气象观测数据,所以要模拟这些气象观测站点生成的气象观测数据。

  模拟的方法就是在合理的范围内,生成随机数。

1、观测气象数据格式

  气象观测数据无非就是气温、气压、降雨量等等。所以我们将模拟的气象观测数据的定格式为:站点代码(从哪个气象观测站点获取的,这个是真实的,不是模拟的),获取观测数据的时间,气温、气压、相对湿度、风向、风速、降雨量以及能见度。

2、气象站点参数

  气象站点的参数,也就是气象站点的地理信息,省名称、站点编号、所在城市名、纬度、经度以及海拔高度。

3.步骤

3.1、加载气象站点参数

  现在是生成对应的气象观测站点的观测数据,需要到站点的一些信息用来标识生成的气象观测数据是哪个站点的。

  所以先加载站点的参数到程序中,因为站点数量是不确定的,加载到程序中用容器来暂时存放站点参数信息。

  这里又涉及到一个小的技巧,当需要到程序外面的数据时,我们可以先定义一个容器来暂时存放这些数据,加载那些数据到容器中,当我们操作数据时,就不会影响到原数据。

3.2、用随机数生成气象观测数据

  用生成随机数的方法来模拟生成气象观测数据,生成了之后先暂时存放在一个容器中,不着急将这些数据写入文件保存。放在程序中的容器方便调试,测试生成的数据是否符合要求,合格的数据再写到程序外的文件保存。

  这里又涉及到一个技巧,就是在程序中生成的数据先在程序中定义一个容器来存放,不着急存到程序外的文件中。

3.3、将气象观测数据写入文件

3.4、根据步骤设计主程序的参数

  (1)从上面的步骤可以知道,要使用的数据有站点的参数,要从存放站点参数的目录中导入,所以程序的一个参数是站点参数文件的路径及文件名。

  (2)生成了观测数据要将数据保存在指定文件中,所以另一个参数是保存观测数据的指定文件路径

  (3)另外一个参数就是程序的运行日志文件。

三、详解各个步骤

1.加载气象站点参数

  因为生成气象站点的观测数据,要用到站点的参数来标识生成的观测数据是哪个站点的,所以要将站点参数加载到程序中。

1.1、设计加载气象站点参数函数

(1)函数名叫做 LoadSTCode

(2)函数的参数,加载站点参数,就是对气象站点参数文件进行读操作,所以函数的参数是气象站点的参数文件名。

(3)返回值,bool型,加载成功返回true,失败则false。

1.2 函数的实现

  将气象站点参数加载到程序中的容器的步骤:
  (1)打开存放气象站点参数的文件,这次是以读的方式打开

 if ( File.Open(inifilename,"r") == false )
       {
   
               logfile.Write("File.Open(%s)failed.\n",inifilename);
               return false;
       }

  (2)从文件中读取站点参数,因为有多个站点,所以用一个循环去读取

 while(true)
       {
   
               memset(strinibuffer,0,sizeof(strinibuffer));
               memset(&stcode,0,sizeof(struct st_stcode));
               if ( File.Fgets(strinibuffer,100) == false )
               {
   
                      logfile.Write(" File.Fgets(%s)完成.\n",inifilename);
                      break;
               }
               .....
        }

  (3)读取之后拆分气象站点参数到站点结构体中

CmdStr.SplitToCmd(strinibuffer,",",true); // 分隔符是逗号

               CmdStr.GetValue(0, stcode.provname);
               CmdStr.GetValue(1, stcode.obtid);
               CmdStr.GetValue(2, stcode.cityname);
               CmdStr.GetValue(3,&stcode.lat);
               CmdStr.GetValue(4,&stcode.lon);
               CmdStr.GetValue(5,&stcode.height);

  (4)检验拆分是否成功,从这里就可以学到一个技巧,写程序不要着急,一步一步来,这里也说明了为什么还要定义一些结构体,容器去暂时存放站点信息,而不是直接导入保存的文件中。在程序中要操作数据,生成数据时,一般不建议直接操作源数据,而是复制一份(暂时放在一些变量中),这样保证了源数据不被更改,也方便调试程序。

printf("strinibuffer=%s",strinibuffer);
               printf("provname=%s,obtid=%s,cityname=%s,lat=%.2lf,lon=%.2lf,height=%.2f\n",\
                       stcode.provname,stcode.obtid,stcode.cityname,stcode.lat,stcode.lon,stcode.height);

  (5)拆分站点参

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值