ENVI/IDL——获取AVIRIS数据波段值和经纬度

以前,这一步,我都是手动导出的,详细请看另一篇博文:http://blog.chinaunix.net/uid-28490468-id-3462577.html

最近要处理较多的遥感数据,所以要把这一步通过代码自动化。

看了看help文档,发现ENVI支持一种叫IDL的语言,完全没有听说过,可能是我孤陋寡闻了,呵呵,有同感的举手。

有好玩的东西,那么就开始学呗。

打开ENVI+IDLX.X,编写IDL的IDE会自动和ENVI一起打开,这IDE很面熟,像eclipse。

IDL有自己的help文档,通过IDE可以打开。

另外网上也有些资料:

简洁明了: http://www2.geog.ucl.ac.uk/~mdisney/teaching/unix/idl/idl.html 

一个国内的论坛,要注册,审核时间要几天(最好快点,呵呵):http://bbs.esrichina-bj.cn/ESRI/forumdisplay.php?fid=28

各种资料胡乱看了一通,稍微总结几点:

IDL

1)IDL的数组是列优先的array[cols, rows]

2)数组是0开始的,和matlab不一样

3)procedure和function都叫routine,其中文件命名

File naming—a program file must be named the same as the main routine.

4)Primary routine must be the last in the file,这个关系到自动编译

5)对routine的参数传递有两种,argument和keyword

具体大家看help文档吧。

但是光有IDL这些基本的知识,根本无法处理像AVIRIS这种超光谱图片,我甚至尝试着去手动解析hdr头文件。

不过在愚蠢之余,试着google大法了一把,结果发现原来ENVI用IDL另外开发了一些API,特意用来处理硕大的遥感图片,

太激动了,呵呵。http://www.360doc.com/content/10/1101/20/472115_65790354.shtml

这些API在IDL的help文档里没有,要在ENVI的help文档里有,真是坑爹。

ENVI+IDL

怎么使用这些API来完成我的任务呢?我是参考:http://www.360doc.com/content/10/0405/21/472115_21741788.shtml

用第一题的做法就能完成我的任务了,不过读取波段值可以用另一个函数,更方便。

具体API

获取波段值
envi_open_file
     filename, r_fid=fid, /no_realize, /no_interactive_query

     if (fid eq - 1) then return

envi_file_query
     fid, ns=ns, nl=nl, nb=nb, wl=wl

envi_get_slice

获取经纬度
envi_convert_file_coordinates
envi_convert_projection_coordinates
envi_get_projection
envi_proj_create

下面是我的实验代码:(要把图片和对应的hdr头文件放在一个文件目录下)

PRO file_test
  data_dir = "E:\Data\OilLeakData\data\f100524t01p00r11rdn_b\"
  filename = data_dir + "f100524t01p00r11rdn_b_sc01_ort_img"
  envi_open_file, filename, r_fid=fid, /no_realize, /no_interactive_query
  if (fid eq -1) then return ;;check fid
  envi_file_query, fid, ns=ns, nl=nl, nb=nb
  pos = lindgen(nb);
  xs = 225
  xe = 344
  ys = 6183
  ye = 6193
  iproj = envi_get_projection(fid=fid)
  oproj = envi_proj_create(/geographic)
  print, 'content'
  for y = ys, ye do begin
    for x = xs, xe do begin
      data = envi_get_slice(fid=fid, line=y, pos=pos, $
        xs=x, xe=x, /bip)   ;; get bands' value
      envi_convert_file_coordinates, fid, x, y, xmap, ymap, /to_map
      envi_convert_projection_coordinates, xmap, ymap, iproj, oxmap, oymap, oproj ;;Lon = oxmap, Lat = oymap
      help, x, xmap, oxmap, data
      print, x, y, xmap, ymap, oxmap, oymap, data
    endfor
  endfor
  envi_file_mng, id=fid, /remove ;;Don't forget to close file
END


  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
使用ENVI中的IDL脚本可以批量获取卫星影像的轮廓边界。具体步骤如下: 1. 打开ENVI软件,选择“File”菜单下的“New -> Procedure”打开ENVIIDL环境。 2. 在IDL环境中输入以下命令,导入ENVIIDL库: ``` ENVIRasterToVector, /QUIET ENVI_SELECT, /QUIET ``` 3. 定义一个字符串变量,用于存储待处理影像的文件路径: ``` dir = 'C:\image_folder\' ``` 其中,C:\image_folder\为待处理影像所在文件夹的路径。 4. 定义一个字符串数组,用于存储待处理影像的文件名: ``` files = ['image1.tif', 'image2.tif', 'image3.tif'] ``` 其中,image1.tif、image2.tif、image3.tif为待处理影像的文件名,可根据实际情况进行修改。 5. 使用循环语句,对待处理影像进行遍历,并获取其轮廓边界: ``` FOR i=0, N_ELEMENTS(files)-1 DO BEGIN ; 打开待处理影像 file = dir + files[i] raster = ENVIRaster(file) ; 将影像转为矢量数据 vector = ENVIRasterToVector(raster, /BOUNDARY, /POLYGON, /QUIET) ; 选择矢量数据 ENVIRasterSelect, vector ; 获取矢量数据的边界 ENVI_SELECT, /BOUNDARY ; 保存矢量数据的边界 SAVE_DIR = dir + 'boundary_' + files[i] ENVISaveSelectedFeatures, SAVE_DIR, /POLYGON, /QUIET ; 关闭矢量数据 ENVIClose, vector ENDFOR ``` 6. 执行以上脚本,即可批量获取待处理影像的轮廓边界,并将结果保存在与待处理影像同一文件夹下的文件中,文件名为“boundary_原文件名”。 需要注意的是,以上脚本仅适用于获取影像的轮廓边界,如果需要获取影像的实际范围边界,请参考之前的回答中的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值