爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 3726|回复: 0

关于QPF 定量降水预报产品

[复制链接]

新浪微博达人勋

发表于 2019-4-12 17:12:03 | 显示全部楼层 |阅读模式
数据资料
我看过提问的智慧: 看过

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
由于项目需要,接触到了一点 SWAN 的 QPF 定量降水预报产品,以此记录一下。读取其二进制文件代码如下,由于我较多使用 ArcGIS做处理,将 bin文件转换成 asc文件。
程序是 C++ 写的, bin文件需要按字节读取, 我读取的文件字节数为 3601024,其中前 1024个字节是文件信息的内容,单独读取,后3600000个字节内容是数据部分,每个数据2字节,一共1500X1200 个数据,存储在 data[1500X1200] 这个数组中。
产品行列可能不一样,需要自己先读取一下 总字节数 或者查询一下 说明格式

void QPF_asc(char *binfile_path,char *asc_path)
{
        FILE *pfile;
        errno_t err;
        err = fopen_s(&pfile, binfile_path, "rb");
        cout << "总字节数: " << _filelength(_fileno(pfile)) << endl;
       
        char ZonName[12];        // diamond 131 12个字节
        char DataName[38];//数据说明(例如 2008年5月19日雷达三维拼图)38个字节
        char        Flag[8];                // 文件标志,"swan"
        char        Version[8];                // 数据版本号,"1.0" 目前为2.0
        unsigned short int year;//2008 两个字节
        unsigned short int month;//05  两个字节
        unsigned short int day;//19    两个字节
        unsigned short int hour;//14   两个字节
        unsigned short int minute;//31 两个字节
        unsigned short int interval;  //两个字节        
        unsigned short int XNumGrids;//1300 两个字节
        unsigned short int YNumGrids;//800 两个字节
        unsigned short int ZNumGrids;//20  两个字节
        int RadarCount; //拼图雷达数 四个字节
        float StartLon; //网格开始经度(左上角) 四个字节
        float StartLat; //网格开始纬度(左上角) 四个字节
        float CenterLon;//网格中心经度 四个字节
        float CenterLat;//网格中心纬度 四个字节
        float XReso;        //经度方向分辨率 四个字节
        float YReso;        //纬度方向分辨率 四个字节
        float ZhighGrids[40];//垂直方向的高度(单位km)数目根据ZnumGrids而得(最大40层) 160个字节。
        char RadarStationName[20][16];    //相关站点名称,        20*16字节
        float  RadarLongitude[20];      //相关站点所在经度,单位:度, 4*20字节
        float  RadarLatitude[20];       //相关站点所在纬度,单位:度, 4*20字节
        float  RadarAltitude[20];      //相关站点所在海拔高度,单位:米, 4*20字节
        unsigned char    MosaicFlag[20];    //该相关站点数据是否包含在本次拼图中,未包含:0,包含:1, 20字节
        short  m_iDataType;   //0-unsigned char 1-char 2-unsigned short 3-short 4
//每一层的向量数,版本=2.0
        short  m_iLevelDimension;
        char        Reserved[168];

        fread(ZonName, 12, 1, pfile);
        for (int i = 0; i < 12; i++)
                cout << ZonName[i];
        cout << endl;

        fread(DataName, 38, 1, pfile);
        for (int i = 0; i < 38; i++)
                cout << DataName[i];
        cout << endl;

        fread(Flag, 8, 1, pfile);
        for (int i = 0; i < 8; i++)
                cout << Flag[i];
        cout << endl;

        fread(Version, 8, 1, pfile);
        for (int i = 0; i < 8; i++)
                cout << Version[i];
        cout << endl;

        fread(&year, 2, 1, pfile);
        fread(&month, 2, 1, pfile);
        fread(&day, 2, 1, pfile);
        fread(&hour, 2, 1, pfile);
        fread(&minute, 2, 1, pfile);
        fread(&interval, 2, 1, pfile);
        fread(&XNumGrids, 2, 1, pfile);
        fread(&YNumGrids, 2, 1, pfile);
        fread(&ZNumGrids, 2, 1, pfile);
        cout << year << "\t" << month << "\t" << day << "\t" << hour << "\t" << minute << "\t" << interval << endl;
        cout << XNumGrids << "\t" << YNumGrids << "\t" << ZNumGrids << endl;
        cout << endl;

        fread(&RadarCount, 4, 1, pfile);
        fread(&StartLon, 4, 1, pfile);
        fread(&StartLat, 4, 1, pfile);
        fread(&CenterLon, 4, 1, pfile);
        fread(&CenterLat, 4, 1, pfile);
        fread(&XReso, 4, 1, pfile);
        fread(&YReso, 4, 1, pfile);
        cout << StartLon << "\t" << StartLat << endl;
        cout << XReso << "\t" << YReso << endl;

        fread(ZhighGrids, 160, 1, pfile);
        fread(RadarStationName, 20 * 16, 1, pfile);
        fread(RadarLongitude, 4 * 20, 1, pfile);
        fread(RadarLatitude, 4 * 20, 1, pfile);
        fread(RadarAltitude, 4 * 20, 1, pfile);

        for (int i = 0; i < 40; i++)
                cout << ZhighGrids[i] << "\t";
        cout << endl;

        for (int i = 0; i < 20; i++)
        {
                for (int j = 0; j < 16; j++)
                {
                        cout << RadarStationName[i][j];
                }
        }
        cout << endl;

        for (int i = 0; i < 20; i++)
                cout << RadarLongitude[i] << "\t";
        cout << endl;
        for (int i = 0; i < 20; i++)
                cout << RadarLatitude[i] << "\t";
        cout << endl;
        for (int i = 0; i < 20; i++)
                cout << RadarAltitude[i] << "\t";
        cout << endl;

        fread(MosaicFlag, 20, 1, pfile);
        for (int i = 0; i < 20; i++)
                cout << MosaicFlag[i];
        cout << endl;

        fread(&m_iDataType, 2, 1, pfile);
        fread(&m_iLevelDimension, 2, 1, pfile);
        cout << "Datatype: " << m_iDataType << endl;
        cout << m_iLevelDimension << endl;

        fread(Reserved, 168, 1, pfile);
        for (int i = 0; i < 168; i++)
                cout << Reserved[i] << "\t";
        cout << endl;

        short int data[1200 * 1500];
        for (int i = 0; i < 1200; i++)
        {
                for (int j = 0; j < 1500; j++)
                {
                        fread(&data[i * 1500 + j], 2, 1, pfile);
                }
        }


        fclose(pfile);
        ofstream data_file(asc_path);
        //这里根据 读取到的 行和列修改 成asc 的文件头格式
        data_file << "ncols 1500" << endl;
        data_file << "nrows 1200" << endl;
        data_file << "xllcorner 105" << endl;
        data_file << "yllcorner 10" << endl;
        data_file << "cellsize 0.01" << endl;
        data_file << "NODATA_value -9999" << endl;

        for (int i = 0; i < 1200; i++)
        {
                for (int j = 0; j < 1500; j++)
                        data_file << data[i * 1500 + j] << " ";
                data_file << endl;
        }
}


密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表