LearningENVI&IDL分享 http://blog.sciencenet.cn/u/dongyanqing Learning ENVI&IDL

博文

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

已有 5417 次阅读 2011-6-2 17:54 |系统分类:科研笔记

       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}

解析的关键信息有samples640(列),lines400(行),header offset0(头信息偏移量-单位为字节),data type=1(数据类型代码,见下表)。

 

数据类型

代码

字节型

1

16位有符号整型

2

32位有符号长整型

3

32位无符号长整型

13

浮点型

4

双精度浮点型

5

对常用数据类型文件进行了读写的测试,值完全一致。

利用IDL进行文件写出:

;+

;C++读取ENVI格式技术测试代码

; :输出不同数据类型的二进制文件

;

; Author: DYQ 201162

;

; 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;

}

 最后输出:





https://wap.sciencenet.cn/blog-344887-450948.html

上一篇:ENVI下开发时提供的界面小组件,好多
下一篇:IDL学习书籍《Modern IDL》
收藏 IP: 124.205.245.*| 热度|

0

发表评论 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-24 17:26

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部