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