level 6
[p=30, 2, left]ENVI (The Environment for Visualizing Images)和IDL(Interactive Data Language)是美国ITT VIS公司的旗舰产品,是由遥感领域的科学家采用IDL开发的一套功能强大的遥感图像处理软件。其软件处理技术覆盖了图像数据的输入/输出、定标、几何校正、正射校正、图像融合、镶嵌、裁剪、图像增强、图像解译、图像分类、基于知识的决策树分类、面向对象图像分类、动态监测、矢量处理、DEM提取及地形分析、雷达数据处理、制图、三维场景构建、与GIS的整合,提供了专业可靠的波谱分析工具和高光谱分析工具。ENVI软件几乎可支持所有的UNIX系统,Mac OSX,Linux,以及PC机的WindowsXP/ Vista/7/Server2008等操作系统。
[/p][p=30, 2, left]ENVI具有丰富的函数接口API,完整的示例代码帮助文档。ArcGIS Engine是一套完备的嵌入式GIS 组件库和工具库,即是一个用于开发新应用程序的二次开发功能组件包。开发者可以选择集成开发环境来建立 ArcGIS Engine 应用程序,而同时开发环境又可以集成ENVI/IDL的功能,这样使得开发一个遥感与GIS一体化的程序变得非常的容易。下面以ArcGISEngine10.0和ENVI4.8为例,开发一个一体化的示例程序。
[/p]1.新建项目
[p=30, 2, left]启动Visual Studio2008,项目类型选择VisualC#-ArcGIS-Extending ArcObjects,模版选择MapControlApplication,解决方案设置为ArcGISEngineUsingENVI(图1.1)。
[/p][p=30, 2, left]
2014年05月15日 12点05分
1
level 6
//初始化ENVI
COM_IDL_connectLib.COM_IDL_connectClass oComIDL = new COM_IDL_connectLib.COM_IDL_connectClass();
oComIDL.CreateObject(0, 0, 0);
//文件打开
OpenFileDialog pOpenFile = new OpenFileDialog();
pOpenFile.Title="打开栅格文件";
//文件选择
if (pOpenFile.ShowDialog() == DialogResult.OK)
//打开显示栅格文件
OpenRaster(pOpenFile.FileName);
//调用ENVI进行栅格放大*2处理示例
SaveFileDialog pSaveFile = new SaveFileDialog();
pSaveFile.Title = "输出放大后影像";
if (pSaveFile.ShowDialog() == DialogResult.OK)
{
//执行重采样
oComIDL.ExecuteString(".compile "" + System.IO.Directory.GetCurrentDirectory() + @"object_envi_resize__define.pro"");
oComIDL.ExecuteString(@"s = obj_new("object_envi_resize",""+pOpenFile.FileName+"",""+pSaveFile.FileName+"")");
oComIDL.ExecuteString("s.EXECUTERESIZE,2,2,0");
oComIDL.ExecuteString("Obj_destroy,s");
//加载放大后影像
OpenRaster(pSaveFile.FileName);
}
}
}[/p]
2014年05月15日 12点05分
2
level 6
//定义栅格打开函数
private void OpenRaster(string rasterFileName)
{
//文件名处理
string ws = System.IO.Path.GetDirectoryName(rasterFileName);
string fbs = System.IO.Path.GetFileName(rasterFileName);
//创建工作空间
IWorkspaceFactory pWork = new RasterWorkspaceFactoryClass();
//打开工作空间路径,工作空间的参数是目录,不是具体的文件名
IRasterWorkspace pRasterWS = (IRasterWorkspace)pWork.OpenFromFile(ws, 0);
//打开工作空间下的文件,
IRasterDataset pRasterDataset = pRasterWS.OpenRasterDataset(fbs);
IRasterLayer pRasterLayer = new RasterLayerClass();
pRasterLayer.CreateFromDataset(pRasterDataset);
2014年05月15日 12点05分
3
level 6
//添加到图层控制中
m_mapControl.Map.AddLayer(pRasterLayer as ILayer);
}[/p]2)IDL代码
[p=30, 2, left]IDL的功能代码以对象类的方式调用了重采样功能,其中ENVI的初始化和重采样分别是类的两个方法。[/p][p=30, 2, left]
CODE:
;重采样执行功能
;输入放缩比例和采样方法
PRO Object_ENVI_Resize::EXECUTEResize,$
xfactor, yfactor,method
COMPILE_OPT idl2, hidden
;打开文件
ENVI_OPEN_FILE, self.INFILENAME, R_FID=fid
IF (fid EQ -1) THEN RETURN
;查询文件基本信息
ENVI_FILE_QUERY, fid, dims=dims, nb=nb
pos = LINDGEN(nb)
;重采样处理
ENVI_DOIT, "resize_doit", $
fid=fid, pos=pos, dims=dims, $
interp=1, rfact=1./[XFACTOR,YFACTOR], $
method = METHOD,$
out_name=self.OUTFILENAME
END
;对象的析构函数
PRO Object_ENVI_Resize::CLEANUP
COMPILE_OPT idl2, hidden
;关闭ENVI二次开发模式
;需要注意,COM组件调用该功能的时候,必须设置如下参数:
; 在ENVI主菜单的File-Preference-Miscellaneous下
; 设置 Exit IDL on Exit from ENVI为"NO"
ENVI_BATCH_EXIT
END
;ENVI初始化方法
FUNCTION Object_ENVI_Resize::initEnvi
CATCH, error_status
IF Error_status NE 0 THEN BEGIN
RETURN,-1
CATCH, /CANCEL
ENDIF
;ENVI二次开发模式初始化
2014年05月15日 12点05分
4
level 6
ENVI,/Restore_Base_Save_Files
ENVI_BATCH_INIT
RETURN,1
END
;对象初始化函数
;包含两个参数:输入和输出文件名。
FUNCTION Object_ENVI_Resize::INIT,$
inFileName ,outFileName
COMPILE_OPT idl2
;文件名参数
self.INFILENAME = inFileName
self.OUTFILENAME = outFileName
;初始化ENVI
INITFALG = self->INITENVI()
RETURN, INITFALG
END
;类定义
PRO OBJECT_ENVI_RESIZE__DEFINE
;类定义结构体
void = {Object_ENVI_Resize, $
inFileName : "", $
outFileName : "" $
}
2014年05月15日 12点05分
5