ENVI使用的是通用栅格数据格式,包含一个简单的二进制文件( a simple flat binary )和一个相关的ASCII(文本)的头文件。
利用其他语言如C/C++等直接读取ENVI的数据,则可以先对hdr文件进行解析,获取数据类型。
hdr的文件结构如下,
ENVIdescription = {Canon City, Colorado, Landsat TM, Calibrated to Reflectance }samples = 640lines = 400bands = 6header offset = 0file type = ENVI Standarddata type = 1interleave = bsqsensor type = Landsat TMwavelength units = Micrometersz plot range = {0.00, 100.00}z plot titles = {Wavelength, Reflectance}band names = {TM Band 1, TM Band 2, TM Band 3, TM Band 4, TM Band 5, TM Band 7}wavelength = {0.48500, 0.56000, 0.66000, 0.83000, 1.65000, 2.21500}
解析的关键信息有samples:640(列),lines:400(行),header offset:0(头信息偏移量-单位为字节),data type=1(数据类型代码,见下表)。
数据类型 | 代码 |
字节型 | 1 |
16位有符号整型 | 2 |
32位有符号长整型 | 3 |
32位无符号长整型 | 13 |
浮点型 | 4 |
双精度浮点型 | 5 |
对常用数据类型文件进行了读写的测试,值完全一致。
利用IDL进行文件写出:
;+;C++读取ENVI格式技术测试代码; :输出不同数据类型的二进制文件;; Author: DYQ 2011年6月2日;; BBS: http://bbs.esrichina-bj.cn/ESRI/forum-28-1.html; E-Mail: dongyq@esrichina-bj.cn; Blog: http://hi.baidu.com/dyqwrp;-PRO test_out_binoutdir = 'c:\temp\'if file_test(outdir,/directory) ne 1 then file_mkdir,outdir;字节byteOPENW,lun,outdir+'a.dat',/get_lunWRITEU,lun,BINDGEN(10)FREE_LUN,lun;整型intOPENW,lun,outdir+'b.dat',/get_lunWRITEU,lun,INDGEN(10)FREE_LUN,lun;浮点floatOPENW,lun,outdir+'c.dat',/get_lunWRITEU,lun,FINDGEN(10)FREE_LUN,lun;长整型longOPENW,lun,outdir+'d.dat',/get_lunWRITEU,lun,LINDGEN(10)FREE_LUN,lun;双精度doubleOPENW,lun,outdir+'e.dat',/get_lunWRITEU,lun,DINDGEN(10)FREE_LUN,lunEND
//;C++读取ENVI格式技术测试代码#include "stdafx.h"#include "iostream.h"int main(int argc, char* argv[]){printf("Hello ! Successful Using C++! ^_^ \n");int i,n;FILE*fp;//二进制字节型char *bdata=new char[10];fp=fopen("c:\\temp\\a.dat","rb");n=fread(bdata,1,10,fp);fclose(fp);for(i=0;i<10;i++){cout<<"二进制";cout<<i<<":"<<short(bdata[i])<<endl;}//二进制整型文件short int *idata=new short int[10];fp=fopen("c:\\temp\\b.dat","rb");n=fread(idata,2,10,fp);fclose(fp);for(i=0;i<10;i++){cout<<"整型";cout<<i<<":"<<idata[i]<<endl;}//二进制浮点文件float *fdata=new float[10];fp=fopen("c:\\temp\\c.dat","rb");n=fread(fdata,4,10,fp);fclose(fp);for(i=0;i<10;i++){cout<<"浮点";cout<<i<<":"<<fdata[i]<<endl;}//二进制长整型文件long *ldata=new long[10];fp=fopen("c:\\temp\\d.dat","rb");n=fread(ldata,4,10,fp);fclose(fp);for(i=0;i<10;i++){cout<<"长整型";cout<<i<<":"<<ldata[i]<<endl;}//双精度doubledouble *ddata=new double[10];fp=fopen("c:\\temp\\e.dat","rb");n=fread(ddata,8,10,fp);fclose(fp);for(i=0;i<10;i++){cout<<"双精度型";cout<<i<<":"<<ddata[i]<<endl;}return 0;}
推荐文章:C/C++下读取ENVI栅格文件格式 - ENVI-IDL技术殿堂 - 博客园
关于ENVI遥感影像的hdr元数据信息设置与读取(C++ 、Python)_envi hdr数据-CSDN博客
FR:徐海涛(hunkxu)