About executing a map algebra expression
In addition to the standard operator objects in ArcGIS Spatial Analyst, another way to apply raster operations is through RasterMapAlgebraOp and RasterModel. These two objects allow you to execute map algebra expressions on your data. Since, the entire expression is executed by the internal raster engine, it might be difficult to debug a complex expression performing several operations if an error occurs. These objects only perform operations on an ESRI grid and, therefore, data is converted internally when required. Use other analysis objects or geoprocessing tools wherever possible to take full advantage of better debugging options, optimized code, and improved performance.
The following code example shows how to execute a complex multiline map algebra expression using RasterModel:
[C#]
public void UsingRasterModel()
{
//Get rasters.
IRasterDataset inRasDS01;
inRasDS01 = OpenRasterDataset("c:\\temp", "elev1");
IRasterDataset inRasDS02;
inRasDS02 = OpenRasterDataset("c:\\temp", "elev2");
IRaster ras01 = inRasDS01.CreateDefaultRaster();
IRaster ras02 = inRasDS02.CreateDefaultRaster();
//Raster model 01 - Declare.
IRasterModel rasterModel;
rasterModel = new RasterModelClass();
//Raster model 02 - Create raster analysis environment.
IRasterAnalysisEnvironment env;
env = (IRasterAnalysisEnvironment)rasterModel;
IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();
IWorkspace workspace = workspaceFactory.OpenFromFile("c:\\temp", 0);
env.OutWorkspace = workspace;
//Raster model 03 - Script.
rasterModel.Script = "[out] = [in01] + [in02]";
//Raster model 04 - Bind.
rasterModel.BindRaster(ras01, "in01");
rasterModel.BindRaster(ras02, "in02");
//Raster model 05 - Execute.
rasterModel.Execute();
//Raster model 06 - Get bound raster.
IRaster rasOut;
rasOut = rasterModel.get_BoundRaster("out");
//Raster model 07 - Unbind symbols.
rasterModel.UnbindSymbol("in01");
rasterModel.UnbindSymbol("in02");
rasterModel.UnbindSymbol("out");
//Save output raster.
ISaveAs2 saveAs;
saveAs = (ISaveAs2)rasOut;
saveAs.SaveAs("rasmodel1", workspace, "GRID");
}
[VB.NET]
Public Sub UsingRasterModel()
'Get rasters.
Dim inRasDS01 As IRasterDataset
inRasDS01 = OpenRasterDataset("c:\temp", "elev1")
Dim inRasDS02 As IRasterDataset
inRasDS02 = OpenRasterDataset("c:\temp", "elev2")
Dim ras01 As IRaster
ras01 = inRasDS01.CreateDefaultRaster()
Dim ras02 As IRaster
ras02 = inRasDS02.CreateDefaultRaster()
'Raster model 01 - Declare.
Dim rasterModel As IRasterModel
rasterModel = New RasterModelClass()
'Raster model 02 - Create raster analysis environment.
Dim env As IRasterAnalysisEnvironment
env = rasterModel
Dim workspaceFactory As IWorkspaceFactory = New RasterWorkspaceFactoryClass()
Dim workspace As IWorkspace = workspaceFactory.OpenFromFile("c:\temp", 0)
env.OutWorkspace = workspace
'Raster model 03 - Script.
rasterModel.Script = "[out] = [in01] + [in02]"
'Raster model 04 - Bind.
rasterModel.BindRaster(ras01, "in01")
rasterModel.BindRaster(ras02, "in02")
'Raster model 05 - Execute.
rasterModel.Execute()
'Raster model 06 - Get bound raster.
Dim rasOut As IRaster
rasOut = rasterModel.BoundRaster("out")
'Raster model 07 - Unbind symbols.
rasterModel.UnbindSymbol("in01")
rasterModel.UnbindSymbol("in02")
rasterModel.UnbindSymbol("out")
'Save output raster.
Dim saveAs As ISaveAs2
saveAs = rasOut
saveAs.SaveAs("rasmodel1", workspace, "GRID")
End Sub
The following code example shows how to create a map algebra expression using RasterMapAlgebraOp:
[C#]
public void UsingRasterMapAlgebra()
{
//Get rasters.
IRasterDataset inRas01;
inRas01 = OpenRasterDataset("c:\\temp", "elev1");
IRasterDataset inRas02;
inRas02 = OpenRasterDataset("c:\\temp", "elev2");
//Create RasterMapAlgebraOp.
IMapAlgebraOp mapAlgebraOp;
mapAlgebraOp = new RasterMapAlgebraOpClass();
//Set environment.
IRasterAnalysisEnvironment env = default(IRasterAnalysisEnvironment);
env = (IRasterAnalysisEnvironment)mapAlgebraOp;
IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();
IWorkspace workspace = workspaceFactory.OpenFromFile("c:\\temp", 0);
env.OutWorkspace = workspace;
//Bind rasters.
mapAlgebraOp.BindRaster((IGeoDataset)inRas01, "Ras01");
mapAlgebraOp.BindRaster((IGeoDataset)inRas02, "Ras02");
//Execute script.
IRaster rasOut;
rasOut = (IRaster)mapAlgebraOp.Execute("[Ras01] + [Ras02]");
//Save output raster.
ISaveAs2 saveAs;
saveAs = (ISaveAs2)rasOut;
saveAs.SaveAs("outMA", workspace, "GRID");
}
[VB.NET]
Public Sub UsingRasterMapAlgebra()
'Get rasters.
Dim inRas01 As IRasterDataset
inRas01 = OpenRasterDataset("c:\temp", "degs")
Dim inRas02 As IRasterDataset
inRas02 = OpenRasterDataset("c:\temp", "negs")
'Create RasterMapAlgebraOp.
Dim mapAlgebraOp As IMapAlgebraOp
mapAlgebraOp = New RasterMapAlgebraOpClass()
'Set environment.
Dim env As IRasterAnalysisEnvironment
env = mapAlgebraOp
Dim workspaceFactory As IWorkspaceFactory = New RasterWorkspaceFactoryClass()
Dim workspace As IWorkspace = workspaceFactory.OpenFromFile("c:\temp", 0)
env.OutWorkspace = workspace
'Bind rasters.
mapAlgebraOp.BindRaster(inRas01, "Ras01")
mapAlgebraOp.BindRaster(inRas02, "Ras02")
'Execute script.
Dim rasOut As IRaster
rasOut = mapAlgebraOp.Execute("[Ras01] + [Ras02]")
'Save output raster.
Dim saveAs As ISaveAs2
saveAs = rasOut
saveAs.SaveAs("outMA", workspace, "GRID")
End Sub
To use the code in this topic, reference the following assemblies in your Visual Studio project. In the code files, you will need using (C#) or Imports (VB .NET) directives for the corresponding namespaces (given in parenthesis below if different from the assembly name):
Development licensing | Deployment licensing |
---|---|
ArcGIS for Desktop Basic: Spatial Analyst | ArcGIS for Desktop Basic: Spatial Analyst |
ArcGIS for Desktop Standard: Spatial Analyst | ArcGIS for Desktop Standard: Spatial Analyst |
ArcGIS for Desktop Advanced: Spatial Analyst | ArcGIS for Desktop Advanced: Spatial Analyst |