一、项目的大致流程
气象数据中心的大致流程如下。
二、模拟生成气象观测数据
本来气象观测数据是从气象观测站点获取的,现在我们只知道有哪些气象观测站点以及它的一些地理信息。但是现在无法从对应的气象观测站点获取气象观测数据,所以要模拟这些气象观测站点生成的气象观测数据。
模拟的方法就是在合理的范围内,生成随机数。
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)拆分站点参