- 积分
- 35
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2018-4-23
- 最后登录
- 1970-1-1

|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
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;
}
}
|
|