《ENVI IDL编程入门学习笔记》是一份系统介绍遥感图像处理软件ENVI及其内置编程语言IDL的基础教程。适合初学者快速掌握相关编程技巧和应用方法,助力科研与工程实践。
### ENVI IDL编程基础知识点总结
#### 一、IDL进程重置
在IDL环境中有时需要清除当前进程中所有已定义的变量及其值。这可以通过以下两种方式实现:
1. **图形界面操作**:点击IDL环境中的“重置”按钮。
2. **命令行操作**:在IDL控制台输入 `.f` 并按回车键。(`.f` 是 `.full_reset_session` 的快捷方式)
#### 二、HelloWorld文件操作
打开IDL环境中的 `HelloWorld` 文件可以通过命令`.edit`或简写为`.e`。
#### 三、变量与向量生成
- **向量生成**:类似于MATLAB,IDL也支持向量生成。例如,使用 `indgen()` 函数创建向量。
- **变量名称验证**:在IDL中,可以通过 `idl_validname()` 函数来判断一个自定义字符串是否可以作为变量名使用。例如:
- `print, idl_validname(idl)` 返回 `idl` 表示这是一个有效的变量名。
- `print, idl_validname(5idl)` 返回 `0`,表示这不是一个有效的变量名。
- `print, idl_validname( 5idl, convert_spaces)` 返回 `_5idl` ,表示可以通过参数 `convert_spaces` 将空格转换为下划线。
- `print, idl_validname( 5i d l, convert_spaces)` 返回 `_5i_d_l`, 表示可以将多个空格转换为单个下划线。
- `print, idl_validname(5i*d%l, convert_all)` 返回 `_5i_d_l` ,表示可以将非字母数字字符转换为下划线。
#### 四、数据类型与转换
- **整型到浮点型转换**:需要注意整型与浮点型之间的隐式转换问题。例如, `result = 85` 的结果将是1(整数除法)。为了避免这个问题,可以显式地将整数转换为浮点数,例如 `result = float(8)5`。
- **精度问题**:当处理大数值时可能会遇到精度问题。例如,`A = 33000` ,然后 `B = fix(A)` 可能会出现精度丢失的情况。
#### 五、数组操作
- **索引数组创建**:使用 `indgen()` 函数可以创建一个指定长度的索引数组。例如,`array = indgen(3,2)` 创建了一个3×2的索引数组。
- **特定值数组创建**:使用 `make_array()` 函数可以创建具有特定值的数组。例如,`m = make_array(3,4,float,value=6)` 创建了一个 3×4 的浮点数组,其中每个元素都是6。
#### 六、字符串处理
- **路径分隔符**:使用 `path_sep()` 函数可以获得路径分隔符,这对于处理文件路径非常有用。
- **字符范围限制**:可以使用条件语句确保字符串中的字符值在某个范围内。例如,如果有一个数组`b1`,可以通过条件语句使其所有值都在 -1 到 1之间。
#### 七、流程控制语句
- **循环结构**:IDL支持常见的循环结构,如 `for` 循环。可以使用 `for` 循环遍历数组或执行重复任务。
- **条件语句**:`if` 语句用于根据不同的条件执行不同的代码块。
#### 八、多程序过程调用
当编写多个程序或过程时,建议将主要的过程或程序放在前面而需要调用的放在后面。这样有助于管理和理解代码结构。
#### 九、中文乱码问题
如果在IDL环境中出现中文乱码问题,可以在“菜单栏-窗口-首选项-工作空间”的“文本段落件编码”选项中手动设置为GB2312编码。
#### 十、工程管理与构建
在项目资源管理器中可以通过右键单击工程名称并选择 “构建工程” 来构建整个工程。这可以避免导出 `.sav` 文件时提示函数未定义的错误,并且可以直接执行主过程,同时编译所有`.pro`文件。
#### 十一、数据输入输出与文件读写
在IDL中可以通过内置函数进行数据的输入输出及文件读写操作。例如通过设置文件存储类型可以选择不同的文件格式如BSQ、BIL或BIP 格式。
#### 十二、图形绘制
- **中文显示问题**:默认情况下,IDL绘图工具可能无法正确显示中文。解决方法是将字体设为系统字体(即设置 `!p.font=0`),然后使用 `device, set_font=某字体`