加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

转——envi二次开发中文件的读取和存储

(2013-08-04 16:21:12)
分类: IDL/ENVI

在做程序开发时,最基本需要做的是如何编程实现文件的打开和保存,这里我们来介绍一下如何采用envi+idl的方式打开和保存一个文件

首先我们来看这么一个程序

;该程序是利用envi的二次开发功能来对数据进行处理
;主要功能是利用envi打开文件,并将文件保存为另外一种格式
;这个程序对于envi处理后的文件只能envi打开,其他文件打不开的情况下非常有用
;这个程序包含了两个小程序,一个是处理单个文件,另外一个便是批处理的方式
pro envi_savefile

    filename =envi_pickfile()
    ;envi_pickflie()打开一个文件,返回选择的文件名

      cd,'d:\test'
      filenames=file_search('*.tif',count=n)
     print,n,filenames
     len=strlen(filenames[0])
    ;len计算文件名的长度
  for i=0,n-1 do begin
     filename=filenames[i]
     envi_open_file,filename,r_fid =fid
     ;envi_open_file,返回文件的fid
     ;envi_select可以交互的选择文件,并返回fid
    envi_file_query,fid,data_type=data_type, xstart=xstart, $
    ystart=ystart, interleave=interleave, nb=nb, nl=nl, ns=ns,$
   offset=offset,dims=dims
   ;envi_file_query查询文件的头文件信息
    map_info=envi_get_map_info(fid=fid)
    proinfo=envi_get_projection(fid=fid)
    ;envi_get_map_info and envi_get_projection返回图像的投影坐标信息
    data =envi_get_data(fid=fid,dims=dims,pos=[0])
    ;envi_get_data是获取一个波段数据,dims是数据的范围,pos是波段;用envi_get_data的方式,一次只能打开一个波段

   ;envi_get_slice,可以获取一个数据中某一行的所有波段数据

  ;envi_enter_data,将文件输出到envi文件列表中                                                                 
   image =strmid(filename,0,len-8)+'.tif';'tif'
    ;同样也可以用下面这一行程序
    image=envi_pickfile()
    ;在打开对话框中输入文件名即可,记着加后缀
    ; 但是利用打开对话框的方式写入img格式的话,其他软件不能识别
   openw,lun,image,/get_lun
  
   writeu,lun,data
  
   free_lun,lun
    ;如果是保存为img格式,必须用writeu的方式写入,但是如果是tif,则用下面的命令
    write_tiff,image,data,/float
    envi_setup_head, fname=image, ns=ns, nl=nl, nb=nb, $
      data_type=data_type, offset=offset, interleave=interleave, $
       xstart=xstart, ystart=ystart, $
      descrip='iimage', /write, /open, $
        map_info=map_info file_type=33

    ;将头文件信息写入新的文件
   endfor
end

如果采用envi_setup_head,来进行文件信息写入,要写上file_type对应的关键字,

否则的话,会导致保存的图像有个偏移,

此外ENVI_Write_ENVI_File也可以保存文件,如

ENVI_Write_ENVI_File,data,out_name=image,map_info=map_info,r_fid=fid

但是保存的文件不能被其他软件读

用ENVI_OUTPUT_TO_EXTERNAL_FORMAT也可以输出你想要的格式,并且相对于write来写更容易被其他软件接受
;其实用write_tiff写出的文件,在erdas中不认其坐标除非是采用了geotiff=geographictypegeokey

如果是二进制文件,可以采用writeu保存,然后写入头文件

 

来源:http://liangshzh0816.blog.163.com/blog/static/347767620105261020747/

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有