c语言读取hdf投影信息,C语言对HDF文件数据集和属性的读写

以三维数据读写为例

打开,读取空间属性、维度,数据集属性,文件属性,数据集的数据;

// 写入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;

展开阅读全文

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值