C/C++下读取ENVI栅格文件格式

 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;

}

 

最后输出:

posted @   ENVI-IDL技术殿堂  阅读(491)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示