以三维数据读写为例
打开,读取空间属性、维度,数据集属性,文件属性,数据集的数据;
// 写入txt文件(动态定义数组——用指针),写入DAT文件(可以用ENVI打开查看图像),写入HDF文件
写入HDF文件属性、数据属性、空间属性,数据压缩。
hid_t file_id, space_id,dset_id;
hsize_t dims[3]={0,0,0};
int ndims=0;
int status;
int col = 0;
int row =0;
int high=0;
char FileName[200];
char OutFileName[200];
int N=0;
int i,j,k;
memset(FileName,0,sizeof(FileName));
memset(OutFileName,0,sizeof(OutFileName));
strcpy(FileName,"C:\\Users\\hanss\\Desktop\\FY3B_MERSI_GBAL_L1_20170301_0000_1000M_MS.HDF");
strcpy(OutFileName,"C:\\Users\\hanss\\Desktop\\FY3B.HDF");
unsigned int* dset=new unsigned int[row * col*high];
memset(dset,0,sizeof(unsigned int)* row * col*high);
一、 打开HDF文件并读取相关数据信息
1、打开HDF文件
file_id = H5Fopen(FileName, H5F_ACC_RDONLY, H5P_DEFAULT);
2、打开数据集
dset_id = H5Dopen(file_id,"EV_1KM_RefSB",H5P_DEFAULT);
3、获取空间地址
space_id = H5Dget_space(dset_id);
4、获取空间维度信息
ndims=H5Sget_simple_extent_dims(space_id,dims,NULL);
5、读取数据集
status=H5LTread_dataset(file_id,"EV_1KM_RefSB",H5T_NATIVE_UINT,dset);
6、读取数据属性
float Slope[30];
int _FillValue[1];
char band_name[41];
H5LTget_attribute_float(file_id,"EV_1KM_RefSB","Slope",Slope);
for(int i=0;i<15;i++)
printf("Slope:%f\n",Slope[i]);
H5LTget_attribute_int(file_id,"EV_1KM_RefSB","_FillValue",_FillValue);
printf("_FillValue:%d\n",_FillValue[0]);
H5LTget_attribute_string(file_id,"EV_1KM_RefSB","band_name",band_name);
printf("%s\n",band_name);
或者用
H5LTget_attribute_float(dset_id,"/EV_1KM_RefSB","Slope",Slope);(推荐)
H5LTget_attribute_float(file_id,"/EV_1KM_RefSB","Slope",Slope);
或者
char dset_name[20]="EV_1KM_RefSB";
H5LTget_attribute_float(file_id,dset_name,"Intercept",Intercept);
【注释】
1、 如果是file_id的话,不加斜杠也是可以的,但是如果时dse_id则一定要加斜杠
2、 如果是file_id,加斜杠也可以
3、 输出数组时遍历每个元素才行,直接输出数组名,其实是输出了数组地址,需要加*,那就是输出数组第一个元素值;
也可以定义指针,首先分配空间
float *Intercept;
Intercept=(float*)malloc(sizeof(float)*15);
H5LTget_attribute_float(dset_id,"/EV_1KM_RefSB","Intercept",Intercept);
printf("Intercept:\n");
for(int i=0;i<15;i++)
printf("%f\n",*(Intercept+i));
4、 不要把IDL语法放到C中
5、 C++中的unsigned char就是byte型,0-255值
unsigned char DQ[1];
H5LTget_attribute_uchar(file_id,"/","Data Quality",DQ); //读取文件属性
printf("Data Quality:%d\n",*DQ);
H5LTset_attribute_uchar(ofile_id,"/","Data Quality",DQ,1); //写入文件属性
最后显示的数据类型是 8-bit unsigned integer
7、读取文件属性
float BB[200];
H5LTget_attribute_float(file_id,"/","BB start time",BB);
for(int i=0;i<200;i++)
printf("BB:%f\n",BB[i]);
二、将数据和信息写入HDF文件
hid_t file_id;
hid_t dataset_id;
hid_t filespace_id;
1、创建HDF文件
file_id = H5Fcreate(OutFileName,H5F_ACC_TRUNC, H5P_DEFAULT,H5P_DEFAULT);
2、设置空间维度属性
filespace_id = H5Screate_simple(3,hdims,NULL);
3、创建数据集(或组)
dataset_id = H5Dcreate(file_id,datasetName,H5T_NATIVE_UINT,filespace_id,H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT);
4、写入数据
H5Dwrite(dataset_id,H5T_NATIVE_UINT,H5S_ALL,H5S_ALL,H5P_DEFAULT,pData);
5、写文件属性
H5LTset_attribute_string(ofile_id,"/","AdditionalAnotation",AA);
H5LTset_attribute_double(ofile_id,"/","BB start time",BB,200);
6、写数据集属性
H5LTset_attribute_float(ofile_id,"EV_1KM_RefSB","Intercept",Intercept,15);
H5LTset_attribute_string(odset_id,"/EV_1KM_RefSB","band_name",band_name);
7、 数据压缩
hid_t plist_id;
// 创建数据集生成的性质列表
plist_id = H5Pcreate(H5P_DATASET_CREATE);
hsize_t cdims[3];
cdims[0] = 1;
cdims[1] = 256;
cdims[2] = 2048;
// // 创建分块的性质
status = H5Pset_chunk(plist_id,3,cdims);
// 设置压缩方法, zlib同gzip
status = H5Pset_deflate(plist_id,5);
压缩后,创建数据集时要用
odset_id = H5Dcreate(ofile_id,"EV_1KM_RefSB",H5T_STD_U16BE,ofspace_id,H5P_DEFAULT,plist_id,H5P_DEFAULT);
三、关闭HDF文件
1、关闭相关id
H5Dclose(dataset_id);
H5Sclose(filespace_id);
H5Fclose(file_id);
2、释放数据
delete []dset;
展开阅读全文