ArcGIS Engine基础(8)之栅格计算器

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);
           }
       }