1、实现类似arctoolbox中的 空间分析工具-》地图代数-》栅格计算器功能,对于需要使用表达式进行栅格计算时非常有效果。
如:实现两个栅格相加,并且将NODATA值设置为0,这样NODATA也可以参与计算。
string expression = string.Format("Con(IsNull([{0}]),0,[{0}])+ Con(IsNull([{1}]),0,[{1}])", rasterSymbol1, rasterSymbol2);
2、要保证输出范围与最大栅格范围一致时,需预先设置栅格分析环境
//设置所有图层中的最大范围作为栅格计算器的处理范围。
pEnv.SetExtent(esriRasterEnvSettingEnum.esriRasterEnvMaxOf);
3、在进行栅格计算保存到地理数据库时,如果工作空间saveWorkspace内容发生变化,注意工作空间一定要获取最新的,否则会保存失败。
public static void UsingRasterMapAlgebra(IRasterLayer rasterLayer,string rasterSymbol, string expression, string saveFileName, IWorkspace saveWorkspace,string format="FGDBR") { IRasterDataset pRasterDataset =RasterLayerWrapper.GetRasterDataset(rasterLayer); IMapAlgebraOp pMapAlgebraOp; pMapAlgebraOp = new RasterMapAlgebraOpClass(); IRasterAnalysisEnvironment pEnv = default(IRasterAnalysisEnvironment); pEnv = (IRasterAnalysisEnvironment)pMapAlgebraOp; //设置所有图层中的最大范围作为栅格计算器的处理范围。 pEnv.SetExtent(esriRasterEnvSettingEnum.esriRasterEnvMaxOf); pMapAlgebraOp.BindRaster((IGeoDataset)pRasterDataset, rasterSymbol); string sOut = expression; IGeoDataset rasOut = (IGeoDataset)pMapAlgebraOp.Execute(sOut); ISaveAs2 pSaveAs = (ISaveAs2)rasOut; //默认保存到文件地理库中,如果工作空间saveWorkspace内容发生变化,注意工作空间一定要获取最新的。 pSaveAs.SaveAs(saveFileName, saveWorkspace, format); // 释放IDataset对象 Marshal.ReleaseComObject(rasOut); pMapAlgebraOp.UnbindRaster(rasterSymbol); } public static void UsingRasterMapAlgebraWithMoreLayers(Dictionary<IRasterLayer,string> rasterLayerSymbolDic, string expression,string saveFileName, IWorkspace saveWorkspace, string format = "FGDBR") { IMapAlgebraOp pMapAlgebraOp; pMapAlgebraOp = new RasterMapAlgebraOpClass(); IRasterAnalysisEnvironment pEnv = default(IRasterAnalysisEnvironment); pEnv = (IRasterAnalysisEnvironment)pMapAlgebraOp; //设置所有图层中的最大范围作为栅格计算器的处理范围。 pEnv.SetExtent(esriRasterEnvSettingEnum.esriRasterEnvMaxOf); //绑定栅格符号 foreach (KeyValuePair<IRasterLayer, string> item in rasterLayerSymbolDic) { IRasterLayer rasterLayer = item.Key; string rasterSymbol = item.Value; IRasterDataset pRasterDataset = RasterLayerWrapper.GetRasterDataset(rasterLayer); pMapAlgebraOp.BindRaster((IGeoDataset)pRasterDataset, rasterSymbol); } //执行栅格计算 string sOut = expression; IGeoDataset rasOut = (IGeoDataset)pMapAlgebraOp.Execute(sOut); ISaveAs2 pSaveAs = (ISaveAs2)rasOut; //默认保存到文件地理库中,如果工作空间saveWorkspace内容发生变化,注意工作空间一定要获取最新的。 pSaveAs.SaveAs(saveFileName, saveWorkspace, format); //解绑栅格符号 foreach (KeyValuePair<IRasterLayer, string> item in rasterLayerSymbolDic) { IRasterLayer rasterLayer = item.Key; string rasterSymbol = item.Value; pMapAlgebraOp.UnbindRaster(rasterSymbol); } }