ENDFOR
默认条件下增量为1,也可以自定义增量。 (2). WHILE 语句
当特定的条件为真,WHILE语句执行单个语句或语句块 。 ? WHILE 条件 DO 语句 ? WHILE 条件 DO BEGIN 语句 ENDWHILE
二、 IDL基本操作介绍
下文以解决一个生态学问题为例,详细讲解IDL基本操作步骤。
1. 题目及要求
问题:现有北美1982-2006年每年的植被返青期数据。 要求:
(1). 计算出各像元的线性变化趋势及显著性概率。
(2). 统计出各个行政单元(州)内有效物候区中的返青期平均变化趋势。 (3). 对线性变化趋势制图输出。
2. 解决方案
2.1 数据说明
北美1982-2006年每年的植被返青期数据greenup_1982_2006,共25个波段,每个波段代表每年一景植被返青期数据,影像拍摄时间为每年的第80天或第100天。影像头文件信息见图1。
9
图1 北美1982-2006年每年的植被返青期数据
greenup_1982_2006头文件信息
2.2 二进制文件读取
2.2.1
文件打开
(1). 利用OPEN命令打开二进制文件
IDL 中的所有输入和输出都是通过逻辑设备号完成的。可以把一个逻辑设备设想为一个管道,这个管道连接着 IDL 和需要进行读写的数据文件。要从一个文件中读写数据,必须首先把一个逻辑设备号连接到一个特定的文件。这就是 IDL 中三个OPEN命令的作用。
OPENR (OPEN READ) :用只读方式打开一个现有的文件。
OPENW(OPEN WRITE) :打开一个新文件用于读写。如果文件已经存在,
则其原始文件内容将会被新内容所替代。
OPENU(OPEN UPDATE) :打开一个已经存在的文件用于读写。 这三个命令的语法结构是完全相同的。首先是命令名,后面是一个逻辑设备号和需要与该逻辑设备号相连的文件名。
用法如下:
openr, in_lun, in_filename [, /get_lun]
10
其中,in_lun代表打开文件的逻辑设备号,可以用户手动赋值,也可以由计算机随机赋值。in_filename为要打开的文件路径。/get_lun代表打开文件时,逻辑设备号由计算机随机赋值,而不是用户手动赋值。当用户打开多个文件时,使用/get_lun可以避免文件号被重复使用而造成的错误。
(2). 利用Read_Binary函数打开二进制文件
Read_Binary:利用已有的模板或者命令行关键字的方式读取二进制文件。 用法如下:
result
=
read_binary
([in_filename]|
fileunit
, [template
=template]
|
[data_start=value],[data_type=typecodes], [data_dims=array], [endian=string ])
其中,result 为读取的数据,in_filename代表输入文件路径, fileunit代表输入文件的文件号,in_filename, fileunit二者选一个输入即可。template为一个已定义(利用Binary_Template函数创建)的用于描述输入文件类型的模板结构体。 template不可与data_start,data_type,data_dims,endian同时使用。若使用了template关键字,则Read_Binary函数的返回值为一个与template结构相同的结构体,否则为一个数组。data_start用于表示数据的起始位置,类似于偏移量。data_type 用于表示数据类型。data_dims用于表示读入与返回的数据的范围。endian表示文件字节读取的顺序。
注意:如果需要打开的文件很大,无法全部读入内存中,则需要根据要求,考虑改变文件的数据排列方式,例如使用BIL、BIP方式。
例如,本例中,目的是获取数据的纵向剖面,因此可以采用BIL、BIP数据排列方式。由于BIL方式处理数据不需要频繁的读写,因此采取BIL方式更佳。 2.2.2
文件读入
利用上述两种方式将文件打开后,利用READU命令可以将文件读入指定的数组中。
READU:从文件中读取无格式二进制数据到一个IDL变量中。
用法如下:
readu, in_lun, data
其中,in_lun为已经打开的逻辑设备号。data为已定义的、与打开文件相同数据类型的IDL变量。 2.2.3
文件写出
利用WRITEU命令可以将数据写入无格式二进制文件中。 用法如下:
writeu, out_lun, data
11
其中,out _lun为已经打开的文件逻辑设备号。data为要写入文件的IDL变量。 2.2.4
文件关闭
所有打开的文件,在将数据读入到IDL变量后,都应该及时关闭,释放资源。以避免不必要的错误出现。 利用FREE_LUN或CLOSE命令可以将打开的文件关闭。
FREE_LUN:关闭打开的文件,取消分配的逻辑设备号,回收内存资源。 用法如下:
free_lun, in_lun
其中,in_lun为逻辑设备号。
CLOSE:根据指定参数关闭逻辑设备号。 用法如下:
close, [, unit1, ..., unitn] [, /all] [, exit_status=variable] [, /file] [, /force]
其中,uniti为指定逻辑设备号。/all代表关闭所有打开程序。 exit_status代表用已命名的变量variable设置退出状态,不可以和/all、/file联用。/file代表关闭逻辑设备号为0-99的文件,逻辑设备号大于99的文件将不被影像。 /force代表强制关闭文件。 2.2.5
IDL程序实现
将数据greenup_1982_2006在IDL中打开的语句如下:
定义输入、输出文件名
greenup_file='E:\\RS_ENVI\\chapter04\\data\\greenup_1982_2006' out_file='E:\\RS_ENVI\\chapter04\\data\\test\\greenup_trend'
;通过查看greenup_1982_2006.hdr文件,获取相关信息 ;创建输入变量,用来存储greenup_1982_2006的数据 greenup=intarr(400,400,25)
;将greenup_1982_2006文件打开并读入数组greenup中 openr, in_lun, greenup_file, /get_lun readu, in_lun, greenup free_lun, in_lun
2.3 各像元的线性变化趋势及显著性概率计算
2.3.1
计算过程分析
12