《enviidl二次开发.ppt》由会员分享,可在线阅读,更多相关《enviidl二次开发.ppt(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、ENVI/IDL 二次开发二次开发北京星图环宇科技有限公司北京星图环宇科技有限公司陈妍陈妍2主要内容主要内容1ENVI/IDL二次开发二次开发介绍介绍2波段、波谱运算波段、波谱运算3 批处理模式批处理模式4用户函数用户函数3ENVI/IDLENVI/IDL二次开发介绍二次开发介绍n如何进行如何进行ENVIENVI功能的扩展功能的扩展n波谱、波段函数波谱、波段函数 扩展扩展ENVIENVI功能的最简单方法功能的最简单方法,波段和波谱运算函数,不波段和波谱运算函数,不需要处理文件需要处理文件I/O,I/O,不需要进行事件控制,不需修改菜不需要进行事件控制,不需修改菜单,用户只需编写运算函数部分内容
2、,其它由单,用户只需编写运算函数部分内容,其它由ENVIENVI进进行管理。行管理。n批处理模式批处理模式不出现不出现ENVIENVI的菜单界面,通过调用的菜单界面,通过调用ENVIENVI提供的非提供的非交互式函数来实现交互式交互式函数来实现交互式ENVIENVI所提供的功能。所提供的功能。4ENVI/IDLENVI/IDL二次开发介绍二次开发介绍n用户函数用户函数用户函数可以用用户函数可以用IDLIDL、C C、FortranFortran或者其它的高或者其它的高级语言编写,并集成到级语言编写,并集成到ENVIENVI软件中,通过软件中,通过ENVIENVI的的菜单来执行。用户函数可以通过
3、菜单来执行。用户函数可以通过ENVIENVI获得输入数获得输入数据,并将结果直接输入到据,并将结果直接输入到ENVIENVI中。中。用户函数包括了部件的定义,事件的处理,以及用户函数包括了部件的定义,事件的处理,以及处理程序。用户函数和处理程序。用户函数和ENVIENVI菜单的一个按钮联系菜单的一个按钮联系起来,并像起来,并像ENVIENVI的其它函数一样执行。的其它函数一样执行。n 5ENVI/IDLENVI/IDL二次开发介绍二次开发介绍nENVIENVI程序中的通用关键字程序中的通用关键字nFIDFIDFIDFID是一个长整型的标量。是一个长整型的标量。FIDFID为为ENVIENVI的
4、程序员提的程序员提供了一个命名变量,可以用于一个或几个供了一个命名变量,可以用于一个或几个ENVIENVI程程序,来打开或选择文件。所有对该文件进行操作序,来打开或选择文件。所有对该文件进行操作的的ENVIENVI程序都是通过程序都是通过FIDFID完成。完成。如果文件打开失败,则如果文件打开失败,则FIDFID返回为返回为-1-1。6ENVI/IDLENVI/IDL二次开发介绍二次开发介绍nR_FIDR_FID和和M_FIDM_FIDENVIENVI处理程序产生结果一幅新图像也包括一个处理程序产生结果一幅新图像也包括一个R_FID,R_FID,或者称为返回或者称为返回FIDFID关键字。如果
5、结果是存关键字。如果结果是存在内存中的,设置在内存中的,设置R_FIDR_FID关键字是访问数据的唯关键字是访问数据的唯一方法。一方法。进行掩模的处理时还包括一个进行掩模的处理时还包括一个M_FIDM_FID,或,或者称为掩模关键字,用于确定用于掩模波段的文者称为掩模关键字,用于确定用于掩模波段的文件。件。7ENVI/IDLENVI/IDL二次开发介绍二次开发介绍nDIMSDIMS DIMS DIMS关键字是一个关键字是一个5 5个元素长整型数组。它定义了处个元素长整型数组。它定义了处理数据的空间子集。当需要确定理数据的空间子集。当需要确定FIDFID的时候,你必须同的时候,你必须同时确定该文
6、件的空间范围。时确定该文件的空间范围。DIMS0 DIMS0 存储一个打开的存储一个打开的ROIROI区域的指针,仅在区域的指针,仅在ROIROI被定义的时候使用,其它时候设为被定义的时候使用,其它时候设为-1L-1L DIMS1 DIMS1 采样的起始位置采样的起始位置 Sample startSample start DIMS2 DIMS2 采样的终止位置采样的终止位置 Sample endSample end DIMS3 DIMS3 行的起始位置行的起始位置 Line startLine start DIMS4 DIMS4 行的结束位置行的结束位置 Line endLine end8EN
7、VI/IDLENVI/IDL二次开发介绍二次开发介绍nPOSPOSPOSPOS关键字定义了用于处理的波段位置,是一个关键字定义了用于处理的波段位置,是一个变长的长整型数组。波段从变长的长整型数组。波段从0 0开始,例如,要处开始,例如,要处理第三波段和第四波段,理第三波段和第四波段,POS=2,3POS=2,3。9ENVI/IDLENVI/IDL二次开发介绍二次开发介绍n常用常用ENVIENVI功能函数介绍功能函数介绍n文件管理文件管理 ENVI_PICKFILEENVI_PICKFILE:产生一个提示用户选择文件的对话框,并返回产生一个提示用户选择文件的对话框,并返回用户所选择的文件名用户所
8、选择的文件名 ENVI_SELECTENVI_SELECT:产生对话框提示用户从产生对话框提示用户从ENVIENVI中已经打开的文件中中已经打开的文件中选择一个文件,并返回用户所选择文件的选择一个文件,并返回用户所选择文件的FIDFID,该函数还可以返回,该函数还可以返回DIMSDIMS和和POSPOS的值的值 ENVI_OPEN_FILEENVI_OPEN_FILE:该函数返回一个文件的:该函数返回一个文件的FIDFID,并将文件信息添加,并将文件信息添加到可用波段列表中到可用波段列表中 ENVI_FILE_MNGENVI_FILE_MNG:该函数可以打开、关闭或者删除硬盘上的文件。该函数可
9、以打开、关闭或者删除硬盘上的文件。无需用户干预无需用户干预 ENVI_GET_FILE_IDSENVI_GET_FILE_IDS:该函数返回所有当前打开的文件的:该函数返回所有当前打开的文件的FIDFID10ENVI/IDLENVI/IDL二次开发介绍二次开发介绍n打开外部文件格式打开外部文件格式 ENVI_OPEN_DATA_FILEENVI_OPEN_DATA_FILE:该函数打开该函数打开ENVIENVI所支持的外所支持的外部文件(无部文件(无ENVIENVI头文件)并返回头文件)并返回FIDFIDn获取数据获取数据 ENVI_GET_DATAENVI_GET_DATA:该函数从一个打开
10、的文件中获取影:该函数从一个打开的文件中获取影像数据。它每次只返回某一波段的数据,数据的范围像数据。它每次只返回某一波段的数据,数据的范围由由DIMSDIMS关键字控制。关键字控制。ENVI_GET_SLICEENVI_GET_SLICE:该函数从一个打开的文件中获取波:该函数从一个打开的文件中获取波谱影像数据,它返回影像某一行所有波段的数据值。谱影像数据,它返回影像某一行所有波段的数据值。结果以结果以BIPBIP或或BILBIL的格式返回的格式返回 11ENVI/IDLENVI/IDL二次开发介绍二次开发介绍n将数据输入到将数据输入到ENVIENVIENVI_ENTER_DATAENVI_E
11、NTER_DATA:该函数将:该函数将IDLIDL数组中的数据输数组中的数据输入到内存中,并通过可用波段列表进行管理。入到内存中,并通过可用波段列表进行管理。n将影像数据存入硬盘将影像数据存入硬盘 使用使用IDLIDL的的WRITEUWRITEU函数写入数据函数写入数据 ENVI_SETUP_HEAD:ENVI_SETUP_HEAD:使用该函数写某个影像数据使用该函数写某个影像数据的头文件的头文件 12波段、波谱运算波段、波谱运算n波段运算波段运算Function bm_func,b1,b2,bn,parameters and keywords processing steps return,
12、result end13波段、波谱运算波段、波谱运算n波谱运算波谱运算14ENVIENVI批处理模式批处理模式n批处理模式简介批处理模式简介n批处理模式的批处理模式的ENVIENVI和正常模式下没有什么区别,只是通和正常模式下没有什么区别,只是通过一系列的特定的函数库来执行过一系列的特定的函数库来执行ENVIENVI的功能。为了使用的功能。为了使用这些函数,必须首先将它们恢复到这些函数,必须首先将它们恢复到IDLIDL内存中。因此为了内存中。因此为了正确获取这些函数,有必要了解一下正确获取这些函数,有必要了解一下ENVIENVI程序的结构。程序的结构。nENVIENVI功能文件由大约功能文件由
13、大约5050多个小的多个小的IDL saveIDL save文件组成,这文件组成,这些文件是包括数据和编译后的程序的二进制文件。这些些文件是包括数据和编译后的程序的二进制文件。这些savesave文件存放在文件存放在ENVIENVI安装目录下的安装目录下的SaveSave目录下。目录下。ENVIENVI的的核心核心savesave文件包括文件包括ENVIENVI的基本功能函数,动态运行函数的基本功能函数,动态运行函数以及以及ENVIENVI运行所需的内部变量。运行所需的内部变量。15ENVIENVI批处理模式批处理模式n如何开始批处理模式如何开始批处理模式 恢复恢复ENVI ENVI savs
14、av文件文件 envienvi,/,/restore_base_save_filesrestore_base_save_files 开始批处理模式开始批处理模式 envi_batch_initenvi_batch_init,log_filelog_file=batch.txtbatch.txt 退出批处理模式退出批处理模式 envi_batch_exitenvi_batch_exitn批处理的例子批处理的例子16用户函数用户函数n用户函数简介用户函数简介n用户函数允许用户为用户函数允许用户为ENVIENVI添加新的功能并通过添加新的功能并通过ENVIENVI的菜单进行访问。用户能够添加任意数量
15、的菜单进行访问。用户能够添加任意数量的用户函数,并且每个函数都可以获得它自己的用户函数,并且每个函数都可以获得它自己的菜单选项。的菜单选项。n用户函数是事件的处理程序。因此,所有的用户函数是事件的处理程序。因此,所有的ENVIENVI用户函数必须遵循事件处理的基本规则,用户函数必须遵循事件处理的基本规则,即用户函数定义时必须要加上一个附加的变量即用户函数定义时必须要加上一个附加的变量来接受事件结构。来接受事件结构。17用户函数用户函数nENVIENVI菜单修改菜单修改使用任何文本编辑器就可以打开使用任何文本编辑器就可以打开envi.menenvi.men文件。文件的结构如下所文件。文件的结构如
16、下所示:示:0 File 0 File 1 Open Image 1 Open Image FileopenFileopen envienvi fileenvi_menu_eventfileenvi_menu_event 1 Open Vector 1 Open Vector FileopenFileopen vector vector fileenvi_menu_eventfileenvi_menu_event 1 Open External File 1 Open External File 2 2 LandsatLandsat 3 Fast open fast tm 3 Fast ope
17、n fast tm envi_menu_eventenvi_menu_event 3 3 GeoTIFFGeoTIFF open tiff open tiff envi_menu_eventenvi_menu_event 3 HDF open 3 HDF open envienvi file file envi_menu_eventenvi_menu_event 3 NLAPS open 3 NLAPS open nlapsnlaps envi_menu_eventenvi_menu_event 每一行开始的数据定义了菜单项的层次。每一行开始的数据定义了菜单项的层次。0 0表示最顶层,表示最顶
18、层,1 1表示一表示一级子菜单,级子菜单,2 2表示二级子菜单,依次类推。表示二级子菜单,依次类推。18用户函数用户函数n Open External FileOpen External File第一个大括号括起来的部分定义了显示在第一个大括号括起来的部分定义了显示在菜单上的内容。菜单上的内容。nopen open envienvi file file第二个大括号括起来的部分定义了为菜单项所第二个大括号括起来的部分定义了为菜单项所赋给的用户值。用户值在同一用户函数处理多个菜单项时非常有赋给的用户值。用户值在同一用户函数处理多个菜单项时非常有用,可以区别那个菜单项被选择。用,可以区别那个菜单项被
19、选择。n envi_menu_eventenvi_menu_event 第三个定义了菜单项事件处理程序的名称,即第三个定义了菜单项事件处理程序的名称,即编写的用户函数名。此处使用的是用户函数名,而不是用户函数编写的用户函数名。此处使用的是用户函数名,而不是用户函数所在的文件名,所以没有后缀。所在的文件名,所以没有后缀。n需要注意的部分:用户值在大多数需要注意的部分:用户值在大多数ENVIENVI的程序中是需要的,要保的程序中是需要的,要保持用户值的唯一性。但当编写用户函数时,大多数情况下,用户持用户值的唯一性。但当编写用户函数时,大多数情况下,用户值部分是没有用的,这时候,可以将用户值设为和用
20、户函数名一值部分是没有用的,这时候,可以将用户值设为和用户函数名一致,也可以将它设置为致,也可以将它设置为not usednot used等醒目的标示。等醒目的标示。n修改修改ENVIENVI菜单菜单添加如下部分:添加如下部分:0MyFunctions0MyFunctions 1Basic File 1Basic File InfonotInfonot usedfile_infousedfile_info 19用户函数用户函数n为用户函数添加为用户函数添加WidgetWidget部件部件nENVIENVI包括了包括了2020多种的小部件,可以为用户函数所用。大多种的小部件,可以为用户函数所用。
21、大多数的函数以多数的函数以WIDGET_WIDGET_开头。开头。nENVI_PICKFILEENVI_PICKFILE:用于从硬盘上选择一个文件。可以用来:用于从硬盘上选择一个文件。可以用来收集任意类型的文件名。收集任意类型的文件名。nENVI_SELECTENVI_SELECT:ENVIENVI标准的文件选择对话框,用来选择一标准的文件选择对话框,用来选择一个打开的文件,确定空间和光谱子区,以及掩模波段。个打开的文件,确定空间和光谱子区,以及掩模波段。它也包括了一个打开按钮,能够允许用户从硬盘上打开它也包括了一个打开按钮,能够允许用户从硬盘上打开一个新的文件。一个新的文件。nWIDGET_
22、EDITWIDGET_EDIT:提供了一个部件从列表中选择项目。:提供了一个部件从列表中选择项目。20用户函数用户函数nWIDGET_EDITWIDGET_EDIT:提供了一个部件从列表中选择项:提供了一个部件从列表中选择项目目nWIDGET_GEO:WIDGET_GEO:用于提示用户选择经纬度值。用于提示用户选择经纬度值。21用户函数用户函数nWIDGET_MAP:WIDGET_MAP:用于编辑地图坐标和投影用于编辑地图坐标和投影nWIDGET_MENUWIDGET_MENU22用户函数用户函数nWIDGET_MULTI:WIDGET_MULTI:用于多项选择用于多项选择nWIDGET_OU
23、TFWIDGET_OUTF 用于选择一个输出文件名用于选择一个输出文件名23用户函数用户函数nWIDGET_OUTFM:WIDGET_OUTFM:用于选择一个输出文件名或是输用于选择一个输出文件名或是输入到内存入到内存nWIDGET_PARAMWIDGET_PARAM24用户函数用户函数nWIDGET_PMENU:WIDGET_PMENU:提供下拉菜单提供下拉菜单nWIDGET_RGB:WIDGET_RGB:用于修改用于修改RGBRGB颜色值颜色值25用户函数用户函数nWIDGET_SLABEL:WIDGET_SLABEL:用于显示文本信息用于显示文本信息nWIDGET_STRINGWIDGE
24、T_STRING26用户函数用户函数nWidgetWidget部件自动事件管理程序部件自动事件管理程序nWIDGET_AUTO_BASEWIDGET_AUTO_BASE 如果要创建事件自动管理的部件构架,必须通如果要创建事件自动管理的部件构架,必须通过过WIDGET_AUTO_BASEWIDGET_AUTO_BASE创建顶级创建顶级BASEBASE,在构建,在构建GUIGUI的过程中使用的其它的过程中使用的其它BASEBASE使用原来的使用原来的WIDGET_BASEWIDGET_BASE函数创建。函数创建。nAUTO_WID_MNGAUTO_WID_MNG 调用调用AUTO_WID_MNGA
25、UTO_WID_MNG函数进行部件的注册,检测事函数进行部件的注册,检测事件,并以结构的形式返回用户输入的值件,并以结构的形式返回用户输入的值27用户函数用户函数n用户函数中错误的捕获用户函数中错误的捕获 使用使用CatchCatch函数进错误的捕获函数进错误的捕获Catch,errorCatch,errorIF(error NE 0)THEN BEGINIF(error NE 0)THEN BEGINok=ok=DIALOG_MESSAGE(!error_state.msgDIALOG_MESSAGE(!error_state.msg,/cancel)/cancel)IF(IF(STRUPC
26、ASE(okSTRUPCASE(ok)EQ CANCEL)THEN)EQ CANCEL)THEN returnreturnENDIFENDIF28用户函数用户函数n用户函数与显示组交互用户函数与显示组交互nENVIENVI中每一个三窗口的显示组都能够通过一个中每一个三窗口的显示组都能够通过一个唯一数字标识唯一数字标识DNDN进行区别。一旦获得某一显示进行区别。一旦获得某一显示组的组的DNDN值,值,ENVIENVI提供了几个函数能够提供显示提供了几个函数能够提供显示组的有用信息,并能够控制组的有用信息,并能够控制ZoomZoom窗口的移动位窗口的移动位置置nENVI_DISP_QUERYENV
27、I_DISP_QUERY:该函数体能够了获取当前显:该函数体能够了获取当前显示影像的基本信息,包括影像文件的示影像的基本信息,包括影像文件的FIDFID,空间,空间分辨率,影像的显示类型(分辨率,影像的显示类型(RGBRGB,灰度或分类),灰度或分类),显示的波段位置,以及三个窗口的大小显示的波段位置,以及三个窗口的大小29用户函数用户函数nENVI_GET_IMAGEENVI_GET_IMAGE:该函数类似于:该函数类似于ENVI_GET_DATAENVI_GET_DATA函数,但它用于从显示窗口中返回数据。给定函数,但它用于从显示窗口中返回数据。给定波段位置,维度,以及波段位置,维度,以及
28、DNDN值,值,ENVI_GET_IMAGEENVI_GET_IMAGE函数能够返回拉伸后的灰度值函数能够返回拉伸后的灰度值nDISP_GET_LOCATIONDISP_GET_LOCATION,该函数返回当前选定的像,该函数返回当前选定的像素的位置素的位置nDISP_GOTODISP_GOTO,该函数移动,该函数移动ZoomZoom窗口到一个指定的窗口到一个指定的位置,并在必要的情况下更新位置,并在必要的情况下更新ImageImage和和ScrollScroll窗窗口口30用户函数用户函数n在用户函数中使用影像分块技术在用户函数中使用影像分块技术n所有的所有的ENVIENVI用户函数也能够通
29、过用户函数也能够通过ENVIENVI内建的分内建的分块函数获取数据。这确保了用户函数也能够处块函数获取数据。这确保了用户函数也能够处理任意大小的数据文件。理任意大小的数据文件。ENVIENVI的分块来自于三的分块来自于三种格式:种格式:BSQBSQ格式,格式,BILBIL格式以及格式以及BIPBIP格式。格式。ENVIENVI还提供了进度条部件来显示分块的处理情况。还提供了进度条部件来显示分块的处理情况。31用户函数用户函数nENVIENVI分块处理将输入数据分成同样大小的单元,分块处理将输入数据分成同样大小的单元,可以是空间方式也可以是波谱方式,以确保所可以是空间方式也可以是波谱方式,以确保
30、所有大小的影像都能被处理。一个空间分块的大有大小的影像都能被处理。一个空间分块的大小是小是n n行行*所有列所有列 ,而波谱分块的大小是,而波谱分块的大小是Sample*bandSample*band。32用户函数用户函数n空间分块近似等于按输入波段对影像进行分块,空间分块近似等于按输入波段对影像进行分块,因此可以不用考虑文件的存储方式而进行空间因此可以不用考虑文件的存储方式而进行空间处理。但访问单一文件的多个波段,所有波段处理。但访问单一文件的多个波段,所有波段将拥有同样数目的空间分块。将拥有同样数目的空间分块。通常进行空间分通常进行空间分块的都是块的都是BSQBSQ文件,而进行波谱分块的是
31、文件,而进行波谱分块的是BILBIL或或BIPBIP文件。文件。使用和输入文件同样的存储方式非常使用和输入文件同样的存储方式非常有效。有效。n当进行邻域处理时,空间分块也当进行邻域处理时,空间分块也可以设定重叠可以设定重叠的行数。重叠行仅加在每个分块的顶部,在整的行数。重叠行仅加在每个分块的顶部,在整个波段作为一个分块时,没有重叠行。例如:个波段作为一个分块时,没有重叠行。例如:进行进行3x33x3卷积时,需要一行重叠来处理上一个分卷积时,需要一行重叠来处理上一个分块的最后一行。块的最后一行。33用户函数用户函数n分块处理的步骤如下:分块处理的步骤如下:初始化空间或波谱分块需求,使用初始化空间
32、或波谱分块需求,使用 ENVI_INIT_TILEENVI_INIT_TILE 获取分块输入数据,获取分块输入数据,ENVI_GET_TILEENVI_GET_TILE 当所有的分块数据都处理完毕,释放分块需求当所有的分块数据都处理完毕,释放分块需求,ENVI_TILE_DONE,ENVI_TILE_DONE34用户函数用户函数n保存结果保存结果 输出文件通过使用输出文件通过使用IDLIDL程序程序OPENWOPENW写入,在调用写入,在调用OPENWOPENW程序前,需要通过程序前,需要通过GET_LUNGET_LUN函数获得文件单元号。通过函数获得文件单元号。通过IDLIDL程序程序WRI
33、TEUWRITEU函数将处理后的分块数据写入文件。在函数将处理后的分块数据写入文件。在所有分块数据都写入后,文件被关闭,文件单元号通所有分块数据都写入后,文件被关闭,文件单元号通过过IDLIDL程序程序FREE_LUNFREE_LUN释放。释放。一旦文件被写入硬盘,可以使用一旦文件被写入硬盘,可以使用ENVIENVI函数函数ENVI_SETUP_HEADENVI_SETUP_HEAD进行进行ENVIENVI头文件的写入。下列文件信头文件的写入。下列文件信息必须写入头文件:文件名,采样数,行数,波段数,息必须写入头文件:文件名,采样数,行数,波段数,偏移,存储方式,以及数据类型。此外还有一些可选
34、偏移,存储方式,以及数据类型。此外还有一些可选的关键字。如的关键字。如X X、Y Y的起始位置,文本描述,波段名称的起始位置,文本描述,波段名称等等。等等。35用户函数用户函数n对于内存输出,结果存储在内存中分配的数组中。处对于内存输出,结果存储在内存中分配的数组中。处理后的数据块插入合适的存储位置。内存数组的大小理后的数据块插入合适的存储位置。内存数组的大小为为NS*NL*NBNS*NL*NB,IDLIDL函数函数BYTARRBYTARR,INTARRINTARR,LONARRLONARR,FLTARRFLTARR,DBLARRDBLARR,以及,以及MAKE_ARRAYMAKE_ARRAY
35、用来创建相对应的用来创建相对应的比特类型、整型、长整型、浮点、双精度浮点以及任比特类型、整型、长整型、浮点、双精度浮点以及任意类型的内存数组。意类型的内存数组。n当处理结果完成后,包含处理结果的内存数组可以使当处理结果完成后,包含处理结果的内存数组可以使用用ENVI_ENTER_DATAENVI_ENTER_DATA传递给传递给ENVIENVI。在最简单的情况下,。在最简单的情况下,仅仅内存数组是必须的。同样有一些额外的信息可以仅仅内存数组是必须的。同样有一些额外的信息可以提供,如提供,如XYXY的起始位置以及文字描述和波段名称。的起始位置以及文字描述和波段名称。36用户函数用户函数n非分块处
36、理程序非分块处理程序nENVI_GET_DATAENVI_GET_DATA 该函数从文件中获取数据,一次只能对单该函数从文件中获取数据,一次只能对单一波段操作,范围由一波段操作,范围由DIMSDIMS关键字指定。该函数关键字指定。该函数提供了提供了xfactorxfactor和和yfactoryfactor两个参数能够产生放两个参数能够产生放大和缩小的影像。大和缩小的影像。nENVI_GET_SLICE ENVI_GET_SLICE 该函数从文件中获取波谱数据,以该函数从文件中获取波谱数据,以BIPBIP或或BILBIL的格式返回。的格式返回。37用户函数用户函数n使用处理进度报告使用处理进度
37、报告 处理进度报告显示了当前处理的完成程度。使用处理进度报告显示了当前处理的完成程度。使用ENVIENVI提供的处理提供的处理进度报告,开发人员只需控制增量大小和更新频率。可选的关键进度报告,开发人员只需控制增量大小和更新频率。可选的关键字字CancelCancel用来在下次增量更新时终止处理进程。处理进度报告由用来在下次增量更新时终止处理进程。处理进度报告由三个程序控制,分别为初始化、设置增量、更新状态。这些函数三个程序控制,分别为初始化、设置增量、更新状态。这些函数列在下面:列在下面:ENVI_REPORT_INC ENVI_REPORT_INC 设置报告的增量设置报告的增量 ENVI_R
38、EPORT_INIT ENVI_REPORT_INIT 初始化报告对话框初始化报告对话框 ENVI_REPORT_STAT ENVI_REPORT_STAT 更新完成的百分数并检查用更新完成的百分数并检查用户是否执行了户是否执行了CancelCancel 注:只有在处理进程小于注:只有在处理进程小于100%100%时,用户才可以取消处理,如果时,用户才可以取消处理,如果处理进度已达到处理进度已达到100%100%,CancelCancel将被忽略。将被忽略。38用户函数用户函数n用户函数编译用户函数编译n由于由于IDLIDL编译器不能识别编译器不能识别ENVIENVI库函数,因此用户库函数,因
39、此用户程序在编译的时候通常会报错。程序在编译的时候通常会报错。n同时为了向下兼容,同时为了向下兼容,IDLIDL编译器将()作为数组编译器将()作为数组的定义,当的定义,当IDLIDL编译器不能识别函数时,它会将编译器不能识别函数时,它会将它当作是数组定义,从而导致编译错误。它当作是数组定义,从而导致编译错误。nFORWARD_FUNCTIONFORWARD_FUNCTION可以告诉编译器,哪些变量可以告诉编译器,哪些变量是函数,而非数组定义。是函数,而非数组定义。nCOMPILE_OPT STRICTARRCOMPILE_OPT STRICTARR则强制编译器以则强制编译器以作为作为数组的定
40、义。数组的定义。39用户函数用户函数RESOLVE_ALLRESOLVE_ALLn在在IDLIDL程序中,用到许多程序中,用到许多IDLIDL内置的函数,都是以源码内置的函数,都是以源码的形式提供的。在的形式提供的。在IDLIDL编译器中,它们被自动编译。但编译器中,它们被自动编译。但是在是在ENVIENVI中,中,ENVIENVI不能编译这些函数,因此要想将用不能编译这些函数,因此要想将用户函数打包,必须要找到所有依赖的函数,而户函数打包,必须要找到所有依赖的函数,而IDLIDL提供提供了一个工具函数就是了一个工具函数就是RESOLVE_ALLRESOLVE_ALL,该函数可以自动寻,该函数可以自动寻找和编译用户程序所依赖的所有函数。找和编译用户程序所依赖的所有函数。n在使用在使用RESOLVE_ALLRESOLVE_ALL函数时要注意,它也不能识别函数时要注意,它也不能识别ENVIENVI库函数,在遇到库函数,在遇到ENVIENVI库函数时会报错,因此在使用时,库函数时会报错,因此在使用时,必须加上必须加上CONTINUE_ON_ERRORCONTINUE_ON_ERROR关键字。关键字。