《IDL程序设计笔记教案.doc》由会员分享,可在线阅读,更多相关《IDL程序设计笔记教案.doc(23页珍藏版)》请在金锄头文库上搜索。
1、目录Part one:文件读写操作11、格式化输入与输出(readprint)12、ASCII文件读写23、二进制文件读写54、图像格式文件读写75、科学数据格式读写*8Part two:图形绘制11(一)plot过程绘制11(二)plotg()函数绘制12(三)散点图12(四)柱状图、条形图15(五)绘制颜色条colorbar18Part three: ENVI二次开发201、自定义波段运算函数202、IDL中常见波段运算213、ENVI classic 创建自定义菜单224、ENVI classic+IDL 二次开发23 Part one:文件读写操作1、格式化输入与输出(readprin
2、t)1) Read:该函数用于从键盘键入数据,默认数据类型为浮点型,若要输入其他类型数据,需要先定义数据类型。Eg:2) Print:该函数用于将数据输出打印到控制台,这里主要讲格式化控制输出format关键字。表01 常用格式化控制符格式代码输出效果aN字符或者字符串按照N个字符宽度输出fn.m浮点型数组按照N个字符宽度输出,小数点保留M位dn.mdouble型数组按照N个字符宽度输出,小数点保留M位en.m按照N个字符宽度的科学计数法输出,小数点后精确到M位Nx输出N个空格字符串/H直接引用字符串输出或者用H直接输出字符串c( )用于输出日期数据Eg:2、ASCII文件读写 常见ASCII
3、文件:txt、matlab程序文件(*.m)、c程序文件(*.c)、遥感影像头文件(如ENVI格式的头文件*.hdr)1) 选择文件:fn = dialog_pickfile(title=选择ASCII文件:,get_path = work_dir)cd,work_dir ;用于跳转到当前工作路径2) 查询文件:file_search()函数Eg:查找当前工作路径下所有的txt文件,并返回文件数目*: File_lines(fname)函数用于查询文本文件的行数。3) 打开文件:在IDL中读写ASCII码或者二进制文件,首先需要将文件与一个逻辑设备号关联起来。语法:openr/openw/op
4、enu, lun, fname, /get_lun, width=10,/append4) 读写操作:IDL中利用readf函数读取文本文件、利用printf函数写入ASCII文件 Readf, lun, var01, var02. printf, lun, var01, var02.5) 文件关闭:在对文件操作完成之后,需要关闭文件的逻辑设备号,eg: freee_lun,lunEG:*如何获取某个文件你的列数:先读取一行数据,然后利用空格进行字符串拆分;最后利用n_elements()计算元素个数即为ns对于某些遥感数据的头文件前面几行是说明文件,后一部分才是数据的,读取有两种方式:1)
5、定义一个临时变量temp,将说明文字用该变量存储2) 直接跳行:skip_lun, lun, 3, /lines ;跳过文件的前三行3、二进制文件读写多数遥感数据的数据文件都是二进制文件。1) 函数readu, lun, var01, var02.用于读取二进制文件*:对于某些数据文件开头是说明信息,读取时可以用point_lun, lun, position直接按字节跳过。Eg:读取IDL文件下的envi.img数据2) 函数writeu, lun, var01, var02用于写入二进制文件。Eg01:将上面读取的envi.img计算其NDVI并保存为二进制文件Eg02:Eg03:;读取c
6、ha06下的风云02卫星数据pro read_AWX file = E:zengskIDLCha06dataFY2C_TBB_IR1_OTG_20061130_AOAD.AWX openr, lun, file, /get_lun ;跳过前20个字节 point_lun,lun,20 Headline = indgen(3);定义三个整型数据,分别读取记录长度、头文件记录数、数据记录数 readu, lun, Headline print,headline0, headline1,headline2 ;定位到第58个字节,读取数据日期 point_lun, lun, 58 Begindate
7、= indgen(5);记录开始日期 readu, lun, Begindate Enddate = indgen(5);记录结束日期 readu, lun, Enddate lat_long = indgen(4);记录网格左上和右上角的经纬度 readu, lun, lat_long print,Begindate print,Enddate print,lat_long ;基于Headline信息数组,定义字节数组,其行列数分别为记录长度和数据记录数 data = bytarr(Headline2,Headline0) ;定位到数据部分,其头文件结束的字节位置为“头文件记录数*记录长度”
8、 point_lun, lun, Headline0 * Headline1 print,Headline0 * Headline1 ;读取数据部分 readu, lun, data help,data ;显示数据 window, 0, xsize = 500, ysize = 500 tv, congrid(data, 500, 500)end4、图像格式文件读写IDL自带了丰富的多种图像读写函数,如BMP,JPG,PNG, JPEG2000, DICOM,TIFF等相关函数:文件查询:query_image(fname, dimensions = dimensions, channels
9、= nb ) ;channels返回波段数、dimensions返回图像的行列数 读取图像:read_image ( fname );结果返回图像数组 写入图像:write_image, fname(可带路径), jpg/bmp/tiff ,data, /order ; order关键字用于设置图像的纵坐标从上往下算起,默认为从下往上。*注: I、以上三个函数对于IDL支持的图像格式都适用。 II、显示图像时:tv用法:tv, data, true = 1/2/3 ;其中关键字true = 1表示数据格式为(3, m, n)、true = 2表示数组格式为(m, 3, n)、true = 3表
10、示格式为(m, n, 3) III、tvrd:屏幕拷贝函数,返回当前直接图形窗口或设备的指定矩形部分的内容。IV、对遥感图像而言,其数据存放方式有BSQBIPBIL,以一个三维m列n行的遥感数据为例:BSQ的表示方式为m, n, 3、BIP表达方式为3, m ,n、BIL的表达方式为m, 3, n,常用的图像文件一般是BIP方式存储,遥感文件一般是BSQ。1) JPEG格式:读read_jpeg写write_jpegEg01:Eg02:2) BMP格式:(不采用任何压缩),数据存储量一般很大读:read_imge(fname) or read_bmp(fname, /rgb)写:write_b
11、mp, fname, data, /rgb3) TIFF格式: TIFF可以存储多波段图像,还可以包含投影信息,如landsat-7就是直接用.tiff存储的。Eg01: 5、科学数据格式读写*IDL中支持的科学数据格式包括CDF、HDF、HDF5、HDF-EOS、NetCDF等等。1) HDF4文件: 目前国内外的多种卫星传感器都是将HDF作为标准数据格式,包括EOS/MODIS、EOS/OMI、HJ-01/HSI、FY-3/MERSI。EG01:;读取E:ENVIIDL下的MODIS数据的经纬度以及其1KM的反射率数据集pro test_hdf fname=dialog_pickfile(
12、title =选择数据文件:,get_path=cur_dir) cd, cur_dir hdf_id=hdf_sd_start(fname);打开hdf文件,返回一个文件id hdf_sd_fileinfo,hdf_id,sd_nums,attribute;用于获取HDF文件的数据集数目和属性数目 print,sd_nums,attribute ;读取经度 lat_index=hdf_sd_nametoindex(hdf_id,Latitude);根据数据集名称来获取数据集的索引号 lat_id=hdf_sd_select(hdf_id,lat_index);利用索引号选择数据集,返回一个数
13、据集的id hdf_sd_getinfo,lat_id,name=name,unit=unit;查询已打开的数据集的基本信息 print,name, , unit hdf_sd_getdata,lat_id,lat;读取数据,参数lat用于返回读取的数据 hdf_sd_endaccess,lat_id;关闭已经打开的数据集 help,lat ;读取纬度 lon_index=hdf_sd_nametoindex(hdf_id,Longitude) lon_id=hdf_sd_select(hdf_id,lon_index) hdf_sd_getinfo,lon_id,name=name,unit
14、=unit print,name, , unit hdf_sd_getdata,lon_id,lon hdf_sd_endaccess,lon_id help,lon ;读取1KM反射率数据 ref_index=hdf_sd_nametoindex(hdf_id,EV_1KM_RefSB) ref_id=hdf_sd_select(hdf_id,ref_index) hdf_sd_getinfo,ref_id,name=name,unit=unit print,name, , unit hdf_sd_getdata,ref_id,ref_value hdf_sd_endaccess,ref_id help,ref_value hdf_sd_end, hdf_id;关闭打开的文件 end运行效果2)*.h5、*.hdf5、*.he5格式的读取:;下面介绍一个读取环境卫星*.h5数据格式的例子pro read_hdf5 fname=dialog_pickfile(title =选择数据文件:,get_path=cur_