ENVI使用的是通用栅格数据格式,包含一个简单的二进制文件( a simple flat binary )和一个相关的ASCII(文本)的头文件。
利用其他语言如C/C++等直接读取ENVI的数据,则可以先对hdr文件进行解析,获取数据类型。
hdr的文件结构如下,
ENVI
description = {
Canon City, Colorado, Landsat TM, Calibrated to Reflectance }
samples = 640
lines = 400
bands = 6
header offset = 0
file type = ENVI Standard
data type = 1
interleave = bsq
sensor type = Landsat TM
wavelength units = Micrometers
z 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_bin
outdir = 'c:\temp\'
if file_test(outdir,/directory) ne 1 then file_mkdir,outdir
;字节byte
OPENW,lun,outdir+'a.dat',/get_lun
WRITEU,lun,BINDGEN(10)
FREE_LUN,lun
;整型int
OPENW,lun,outdir+'b.dat',/get_lun
WRITEU,lun,INDGEN(10)
FREE_LUN,lun
;浮点float
OPENW,lun,outdir+'c.dat',/get_lun
WRITEU,lun,FINDGEN(10)
FREE_LUN,lun
;长整型long
OPENW,lun,outdir+'d.dat',/get_lun
WRITEU,lun,LINDGEN(10)
FREE_LUN,lun
;双精度double
OPENW,lun,outdir+'e.dat',/get_lun
WRITEU,lun,DINDGEN(10)
FREE_LUN,lun
END
|
C++下读取文件:
//;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;
}
//双精度double
double *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;
}
|
最后输出:

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界