注册 登录
  • 注册时,本站名称为:RGB空格3S博客,注意中间的空格。
  • 2018.8.14本站全面接入google广告
  • 2017.2.14今天收到45条恶意评论(全是外文),故评论时请填写必要信息,匿名评论全部拉黑,迫不得已而为之
  • 2017.1.27,2017年春节及至,我谨代表本人祝大家新春快乐,本人年终总结文章请访问:2016年终总结
  • 为防止恶意转载,本站全面禁止复制,并添加图片水印:RGB 3S博客www.ixxin.cn。
  • 本站正式更名为RGB 3S博客,本站将撤消所有非3S内容,其将转移到新博客江湖时代

IDL读取ENVI标准文件源码

ID L admin 5342次浏览 已收录 0个评论
; PURPOSE:
; IDL program, which reads standard ENVI image files (*.img).
;
; CALLING SEQUENCE:
; read_envi_file, infile, img, xs, ys, type,offset
;
; INPUTS:
; infile - 传入数据文件名
;
; OPTIONAL INPUTS:
; None
;
; KEYWORD PARAMETERS:
; None
;
; OUTPUTS:--这些均是返回值,注意是位置参数
; img - ENVI的图像文件;
; xs - 列号;
; ys - 行号;
; type - 数据类型代码
; offset - 头文件偏移量;
; mapinfo - map及地理坐标信息;
;
; EXAMPLE:read_envi_image, 'C:Program FilesITTIDL708productsenvi46dataddd', data;;;data即读取的数据值
;
; MODIFICATION HISTORY:
; Written by: Carsten Pathe, cp@ipf.tuwien.ac.at
; Date: 25.08.2003
;
; Modified By DYQ
; 2009-8-18 修正:数据无扩展名会读取错误
; 简化数组创建代码
; 2009-12-22 修正:添加BIP、BIL多波段数据支持
; 
; SUXIN,2020.6.11
; 修改头文件读取代码
; 头文件是否存在判断
; Mapinfo支持两个方向的分辨率
;-
PRO Read_envi_image, infile, img, bandsnum,xs, ys, type, offset, mapinfo

  COMPILE_OPT IDL2

  image = infile
  
  header = file_dirname(image)+PATH_SEP()+FILE_BASENAME(image,'.dat')+'.hdr'
  
  if ~file_test(header) then begin
    d = DIALOG_MESSAGE('头文件不存在:'+header,/ERROR)
    return 
  endif

  ;打开解析头文件
  OPENR, unit, header, /get_lun

  header_line = ''
  ;文件未读取完之前一直循环
  WHILE NOT EOF(unit) DO BEGIN

    READF, unit, header_line
    tmp = STRSPLIT(header_line[0], '=', /extract)
    header_keyword = STRSPLIT(tmp[0], ' ', /extract)
    ;解析头文件中的信息
    IF header_keyword[0] EQ 'samples' THEN xs = LONG(tmp[1])
    IF header_keyword[0] EQ 'lines' THEN ys = LONG(tmp[1])
    IF header_keyword[0] EQ 'header' THEN offset = LONG(tmp[1])
    IF header_keyword[0] EQ 'bands' THEN bandsnum = LONG(tmp[1])
    IF header_keyword[0] EQ 'interleave' THEN dataInter = STRUPCASE(STRTRIM(tmp[1],2))
    IF header_keyword[0] EQ 'data' THEN type = LONG(tmp[1])
    ;如读取map信息则解析map信息
    IF header_keyword[0] EQ 'map' THEN BEGIN

      mapinfo_tmp=STRSPLIT(tmp[1],'{',/extract)
      mapinfo_tmp=STRSPLIT(mapinfo_tmp[1],',',/extract)

      mapinfo={ULX:0.,ULY:0.,XResolution:0.,YResolution:0.}
      mapinfo.ULX=mapinfo_tmp[3]
      mapinfo.ULY=mapinfo_tmp[4]
      mapinfo.XResolution=mapinfo_tmp[5]
      mapinfo.YResolution=mapinfo_tmp[6]
    ENDIF
  ENDWHILE

  ;关闭头文件
  CLOSE,unit & FREE_LUN, unit

  ;modified by dyq

  ;打开数据文件定位到数据位置
  OPENR, unit,IMAGE, /get_lun
  POINT_LUN, unit, offset

  ;判断数据存储类型
  ;完全按照ENVI的数据存储格式定义
  CASE dataInter OF
    'BSQ': BEGIN

      img = MAKE_ARRAY(xs,ys,bandsnum,type = type)
      ;读取数据文件中的数据
      READU,unit,img
    END
    ;按行保存
    'BIL': BEGIN

      img = MAKE_ARRAY(xs,bandsnum, ys,type = type)
      ;读取数据文件中的数据
      READU,unit,img
      ;转换为BSQ
      img= TRANSPOSE(img,[0,2,1])
    END
    'BIP': BEGIN
      ; IF bandsnum GT 1 THENimg = MAKE_ARRAY(bandsnum,xs,ys,type = type) $
      ; ELSE img = MAKE_ARRAY(xs,ys,type = type)
      img = MAKE_ARRAY(bandsnum,xs,ys,type = type)
      ;读取数据文件中的数据
      READU,unit,img
      ;转换为BSQ
      img= TRANSPOSE(img,[1,2,0])
    END
    ELSE:
  ENDCASE
  FREE_LUN, unit
  img = REFORM(img)
end

xxin blog , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明IDL读取ENVI标准文件源码
喜欢 (1)
支付宝[853060844@qq.com]
分享 (0)
admin
关于作者:
坐标山科大遥感系小鲜肉一枚。
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址