ArcObjects Library Reference  

CreateRasterFunctionTemplate

About the Create a Raster Function template Sample

[C#]

CreateRasterFunctionTemplate.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ESRI.ArcGIS;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.DataSourcesRaster;

namespace RasterSamples
{
    class CreateRasterFunctionTemplate
    {
        [STAThread]
        static void Main(string[] args)
        {
            ESRI.ArcGIS.esriSystem.AoInitialize aoInit;

            #region Initialize License
            try
            {
                Console.WriteLine("Obtaining license");
                ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop);
                aoInit = new AoInitializeClass();
                esriLicenseStatus licStatus = aoInit.Initialize(esriLicenseProductCode.esriLicenseProductCodeBasic);
                Console.WriteLine("Ready with license.");
            }
            catch (Exception exc)
            {
                // If it fails at this point, shutdown the test and ignore any subsequent errors.
                Console.WriteLine(exc.Message);
                return;
            }
            #endregion

            try
            {
                #region Specify input directory and dataset name
                // The directory which contains the Panchromatic Image.
                string panDir = @"C:\Data\QB\Pan";
                // The directory which contains the Multispectral Image.
                string rgbDir = @"C:\Data\QB\MS";
                
                string panImageName = "05JAN27104436-P1BS-005533787010_01_P002.TIF";
                string rgbImageName = "05JAN27104436-M1BS-005533787010_01_P002.TIF";

                // Output filename.
                string outputDataset = @"c:\Temp\QBTemplateCS.afr";
                #endregion

                #region Initialize
                // Setup Workspaces.
                Type factoryType = Type.GetTypeFromProgID("esriDataSourcesRaster.RasterWorkspaceFactory");
                IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
                IRasterWorkspace panRasterWorkspace = (IRasterWorkspace)workspaceFactory.OpenFromFile(panDir, 0);
                IRasterWorkspace rgbRasterWorkspace = (IRasterWorkspace)workspaceFactory.OpenFromFile(rgbDir, 0);

                // Open Datasets
                IRasterDataset panDataset = panRasterWorkspace.OpenRasterDataset(panImageName);
                IRasterDataset rgbDataset = rgbRasterWorkspace.OpenRasterDataset(rgbImageName);
                #endregion

                #region Create Variables
                // Create one variable of type IRasterFunctionVariable for each 
                // Raster Dataset opened above
                
                // Create a new Raster Function Variable
                IRasterFunctionVariable panVar = new RasterFunctionVariableClass();
                // Set the name of the variable
                panVar.Name = "panImage";
                // Describe the variable
                panVar.Description = "Panchromatic Image to be used for pansharpening";
                // Specify whether it represents a dataset
                panVar.IsDataset = true;

                // Create a new Raster Function Variable
                IRasterFunctionVariable rgbVar = new RasterFunctionVariableClass();
                // Set the name of the variable
                rgbVar.Name = "rgbImage";
                // Describe the variable
                rgbVar.Description = "Multispectral Image to be used for pansharpening";
                // Specify whether it represents a dataset
                rgbVar.IsDataset = true;
                #endregion

                #region Prepare the Pan Image
                // Setup statistics for each band
                IArray statsArrayPan = new ArrayClass();
                IRasterStatistics statsPanBand = new RasterStatisticsClass();
                statsPanBand.Minimum = 1;
                statsPanBand.Maximum = 2047;
                statsArrayPan.Add(statsPanBand);
                // Create the arguments object for the stretching function
                IStretchFunctionArguments stretchingPanFunctionArguements = new StretchFunctionArgumentsClass();
                // Set the stretching type
                stretchingPanFunctionArguements.StretchType =
                    esriRasterStretchType.esriRasterStretchMinimumMaximum;
                // Set the statistics created above
                stretchingPanFunctionArguements.Statistics = statsArrayPan;
                // Set the input raster, in this case, the variable for the Pan Image
                stretchingPanFunctionArguements.Raster = panVar;

                // Create the function object to stretch the Pan Image.
                IRasterFunction stretchingPanFunction = new StretchFunction();

                // Create a Raster Function Template object for the stretch function
                IRasterFunctionTemplate stretchingPanFunctionT = new RasterFunctionTemplateClass();
                // Set the function on the template
                stretchingPanFunctionT.Function = (IRasterFunction)stretchingPanFunction;
                // Set the arguments for the function
                stretchingPanFunctionT.Arguments = stretchingPanFunctionArguements;
                #endregion

                #region Prepare the Multispectral (RGB) Image
                // Create an array which defines the order of bands
                ILongArray bandIDs = new LongArrayClass();
                bandIDs.Add(2);
                bandIDs.Add(1);
                bandIDs.Add(0);
                // Create an Extract Band Function Arguments object
                IExtractBandFunctionArguments extractRgbBandFunctionArgs = (IExtractBandFunctionArguments)
                    new ExtractBandFunctionArguments();
                // Set the order of bands of the output
                extractRgbBandFunctionArgs.BandIDs = bandIDs;
                // Set the input raster, in this case the variable for the Multispectral Image
                extractRgbBandFunctionArgs.Raster = rgbVar;

                // Create the Extract Band Function object
                IRasterFunction extractRgbBandFunction = new ExtractBandFunction();

                // Create a Raster Function Template object for the function created above
                IRasterFunctionTemplate extractRgbBandFunctionT = new RasterFunctionTemplateClass();
                // Set the function on the template
                extractRgbBandFunctionT.Function = (IRasterFunction)extractRgbBandFunction;
                // Set the arguments for the function
                extractRgbBandFunctionT.Arguments = extractRgbBandFunctionArgs;

                // Setup statistics for each band
                IArray statsArray = new ArrayClass();
                IRasterStatistics statsMulBand1 = new RasterStatisticsClass();
                statsMulBand1.Minimum = 100;
                statsMulBand1.Maximum = 1721;
                statsArray.Add(statsMulBand1);
                IRasterStatistics statsMulBand2 = new RasterStatisticsClass();
                statsMulBand2.Minimum = 95;
                statsMulBand2.Maximum = 2047;
                statsArray.Add(statsMulBand2);
                IRasterStatistics statsMulBand3 = new RasterStatisticsClass();
                statsMulBand3.Minimum = 34;
                statsMulBand3.Maximum = 2006;
                statsArray.Add(statsMulBand3);

                // Create a stretching function for the multispectral image
                IRasterFunction stretchingRGBFunction = new StretchFunction();
                // Create an arguments object for the stretch function
                IStretchFunctionArguments stretchingRGBFunctionArguments = 
                    new StretchFunctionArgumentsClass();
                // Set the type of stretchings to perform
                stretchingRGBFunctionArguments.StretchType =
                    esriRasterStretchType.esriRasterStretchMinimumMaximum;
                // Set the statistics created above
                stretchingRGBFunctionArguments.Statistics = statsArray;
                // Set the extract band function template created above as the input
                stretchingRGBFunctionArguments.Raster = extractRgbBandFunctionT;

                // Create a Raster Function Template object for the function created above
                IRasterFunctionTemplate stretchingRGBFunctionT = new RasterFunctionTemplateClass();
                // Set the function on the template
                stretchingRGBFunctionT.Function = (IRasterFunction)stretchingRGBFunction;
                // Set the arguments for the function
                stretchingRGBFunctionT.Arguments = stretchingRGBFunctionArguments;
                #endregion

                #region Pansharpen the Pan Image with the Multispectral
                // Create a Raster Function Arguments object for the pansharpen function
                IPansharpeningFunctionArguments pansharpFunctionArguements = 
                    new PansharpeningFunctionArgumentsClass();
                // Set the Panchromatic image which has been prepared above
                pansharpFunctionArguements.PanImage = stretchingPanFunctionT;
                // Set the Multispectral image which has been prepared above
                pansharpFunctionArguements.MSImage = stretchingRGBFunctionT;

                // Create a new pansharpen raster function object
                IRasterFunction pansharpenFunction = new PansharpeningFunction();
                // Create a new pansharpen function arguments object
                IPansharpeningFunctionArguments pansharpenFunctionArguements = 
                    new PansharpeningFunctionArgumentsClass();
                // Set the pansharpening type
                pansharpenFunctionArguements.PansharpeningType = 
                    esriPansharpeningType.esriPansharpeningESRI;
                // Create an array of doubles that sets the weights for each band
                IDoubleArray weightsArray = new DoubleArrayClass();
                weightsArray.Add(0.167);
                weightsArray.Add(0.166);
                weightsArray.Add(0.166);
                // and set it on the arguments object
                pansharpenFunctionArguements.Weights = weightsArray;

                // Create a Raster Function Template object for the pansharpen function
                IRasterFunctionTemplate rasterFunction = new RasterFunctionTemplateClass();
                rasterFunction.Function = (IRasterFunction)pansharpenFunction;
                rasterFunction.Arguments = pansharpFunctionArguements;
                ((IRasterFunction)rasterFunction).PixelType = rstPixelType.PT_UCHAR;
                #endregion

                #region Resolve variables
                // Create a PropertySet object to set the values for the 
                // Raster Function Variables created above
                IPropertySet variables = new PropertySet();
                variables.SetProperty("panImage", panDataset);
                variables.SetProperty("rgbImage", rgbDataset);
                #endregion

                #region Create the Function Raster Dataset
                // Create the Function Raster Dataset Object for the Pansharpened Dataset
                IFunctionRasterDataset functionRasterDataset = new FunctionRasterDataset();
                // Create a name object for the Function Raster Dataset.
                IFunctionRasterDatasetName functionRasterDatasetName =
                    new FunctionRasterDatasetNameClass();
                // Specify the output filename for the new dataset (including 
                // the .afr extension at the end).
                functionRasterDatasetName.FullName = outputDataset;
                functionRasterDataset.FullName = (IName)functionRasterDatasetName;
                // Initialize the new Function Raster Dataset with the Raster Function 
                // Template and the property set containing the variables and their values.
                functionRasterDataset.Init((IRasterFunction)rasterFunction, variables);

                ITemporaryDataset myTempDset = (ITemporaryDataset)functionRasterDataset;
                myTempDset.MakePermanent();
                #endregion

                #region Shutdown
                Console.WriteLine("Success.");
                Console.WriteLine("Press any key...");
                Console.ReadKey();

                // Shutdown License
                aoInit.Shutdown();
                #endregion
            }
            catch (Exception exc)
            {
                #region Shutdown
                Console.WriteLine("Exception Caught while creating Function Raster Dataset. " + exc.Message);
                Console.WriteLine("Failed.");
                Console.WriteLine("Press any key...");
                Console.ReadKey();

                // Shutdown License
                aoInit.Shutdown();
                #endregion
            }        
        }
    }
}

[Visual Basic .NET]

CreateRasterFunctionTemplate.vb

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports ESRI.ArcGIS
Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.Geodatabase
Imports ESRI.ArcGIS.Geometry
Imports ESRI.ArcGIS.DataSourcesRaster

Namespace RasterSamples
    Class CreateRasterFunctionTemplate
        <STAThread()> _
        Public Shared Sub Main(ByVal args As String())
            Dim aoInit As ESRI.ArcGIS.esriSystem.AoInitialize

            ' Initialize License
            Try
                Console.WriteLine("Obtaining license")
                ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop)
                aoInit = New AoInitializeClass()
                Dim licStatus As esriLicenseStatus = aoInit.Initialize(esriLicenseProductCode.esriLicenseProductCodeBasic)
                Console.WriteLine("Ready with license.")
            Catch exc As Exception
                ' If it fails at this point, shutdown the test and ignore any subsequent errors.
                Console.WriteLine(exc.Message)
                Exit Sub
            End Try

            Try
                ' Specify input directory and dataset name
                ' The directory which contains the Panchromatic Image.
                Dim panDir As String = "C:\Data\QB\Pan"
                ' The directory which contains the Multispectral Image.
                Dim rgbDir As String = "C:\Data\QB\MS"

                Dim panImageName As String = "05JAN27104436-P1BS-005533787010_01_P002.TIF"
                Dim rgbImageName As String = "05JAN27104436-M1BS-005533787010_01_P002.TIF"

                ' Output filename.
                Dim outputDataset As String = "c:\Temp\RFT\QBTemplateVB.afr"


                ' Initialize
                ' Setup Workspaces.
                Dim factoryType As Type = Type.GetTypeFromProgID("esriDataSourcesRaster.RasterWorkspaceFactory")
                Dim workspaceFactory As IWorkspaceFactory = DirectCast(Activator.CreateInstance(factoryType), IWorkspaceFactory)
                Dim panRasterWorkspace As IRasterWorkspace = DirectCast(workspaceFactory.OpenFromFile(panDir, 0), IRasterWorkspace)
                Dim rgbRasterWorkspace As IRasterWorkspace = DirectCast(workspaceFactory.OpenFromFile(rgbDir, 0), IRasterWorkspace)

                ' Open Datasets
                Dim panDataset As IRasterDataset = panRasterWorkspace.OpenRasterDataset(panImageName)
                Dim rgbDataset As IRasterDataset = rgbRasterWorkspace.OpenRasterDataset(rgbImageName)


                ' Create Variables
                ' Create one variable of type IRasterFunctionVariable for each 
                ' Raster Dataset opened above

                ' Create a new Raster Function Variable
                Dim panVar As IRasterFunctionVariable = New RasterFunctionVariableClass()
                ' Set the name of the variable
                panVar.Name = "panImage"
                ' Describe the variable
                panVar.Description = "Panchromatic Image to be used for pansharpening"
                ' Specify whether it represents a dataset
                panVar.IsDataset = True

                ' Create a new Raster Function Variable
                Dim rgbVar As IRasterFunctionVariable = New RasterFunctionVariableClass()
                ' Set the name of the variable
                rgbVar.Name = "rgbImage"
                ' Describe the variable
                rgbVar.Description = "Multispectral Image to be used for pansharpening"
                ' Specify whether it represents a dataset
                rgbVar.IsDataset = True


                ' Prepare the Pan Image
                ' Setup statistics for each band
                Dim statsArrayPan As IArray = New ArrayClass()
                Dim statsPanBand As IRasterStatistics = New RasterStatisticsClass()
                statsPanBand.Minimum = 1
                statsPanBand.Maximum = 2047
                statsArrayPan.Add(statsPanBand)
                ' Create the arguments object for the stretching function
                Dim stretchingPanFunctionArguements As IStretchFunctionArguments = New StretchFunctionArgumentsClass()
                ' Set the stretching type
                stretchingPanFunctionArguements.StretchType = esriRasterStretchType.esriRasterStretchMinimumMaximum
                ' Set the statistics created above
                stretchingPanFunctionArguements.Statistics = statsArrayPan
                ' Set the input raster, in this case, the variable for the Pan Image
                stretchingPanFunctionArguements.Raster = panVar

                ' Create the function object to stretch the Pan Image.
                Dim stretchingPanFunction As IRasterFunction = New StretchFunction()

                ' Create a Raster Function Template object for the stretch function
                Dim stretchingPanFunctionT As IRasterFunctionTemplate = New RasterFunctionTemplateClass()
                ' Set the function on the template
                stretchingPanFunctionT.[Function] = DirectCast(stretchingPanFunction, IRasterFunction)
                ' Set the arguments for the function
                stretchingPanFunctionT.Arguments = stretchingPanFunctionArguements


                ' Prepare the Multispectral (RGB) Image
                ' Create an array which defines the order of bands
                Dim bandIDs As ILongArray = New LongArrayClass()
                bandIDs.Add(2)
                bandIDs.Add(1)
                bandIDs.Add(0)
                ' Create an Extract Band Function Arguments object
                Dim extractRgbBandFunctionArgs As IExtractBandFunctionArguments = DirectCast(New ExtractBandFunctionArguments(), IExtractBandFunctionArguments)
                ' Set the order of bands of the output
                extractRgbBandFunctionArgs.BandIDs = bandIDs
                ' Set the input raster, in this case the variable for the Multispectral Image
                extractRgbBandFunctionArgs.Raster = rgbVar

                ' Create the Extract Band Function object
                Dim extractRgbBandFunction As IRasterFunction = New ExtractBandFunction()

                ' Create a Raster Function Template object for the function created above
                Dim extractRgbBandFunctionT As IRasterFunctionTemplate = New RasterFunctionTemplateClass()
                ' Set the function on the template
                extractRgbBandFunctionT.[Function] = DirectCast(extractRgbBandFunction, IRasterFunction)
                ' Set the arguments for the function
                extractRgbBandFunctionT.Arguments = extractRgbBandFunctionArgs

                ' Setup statistics for each band
                Dim statsArray As IArray = New ArrayClass()
                Dim statsMulBand1 As IRasterStatistics = New RasterStatisticsClass()
                statsMulBand1.Minimum = 100
                statsMulBand1.Maximum = 1721
                statsArray.Add(statsMulBand1)
                Dim statsMulBand2 As IRasterStatistics = New RasterStatisticsClass()
                statsMulBand2.Minimum = 95
                statsMulBand2.Maximum = 2047
                statsArray.Add(statsMulBand2)
                Dim statsMulBand3 As IRasterStatistics = New RasterStatisticsClass()
                statsMulBand3.Minimum = 34
                statsMulBand3.Maximum = 2006
                statsArray.Add(statsMulBand3)

                ' Create a stretching function for the multispectral image
                Dim stretchingRGBFunction As IRasterFunction = New StretchFunction()
                ' Create an arguments object for the stretch function
                Dim stretchingRGBFunctionArguments As IStretchFunctionArguments = New StretchFunctionArgumentsClass()
                ' Set the type of stretchings to perform
                stretchingRGBFunctionArguments.StretchType = esriRasterStretchType.esriRasterStretchMinimumMaximum
                ' Set the statistics created above
                stretchingRGBFunctionArguments.Statistics = statsArray
                ' Set the extract band function template created above as the input
                stretchingRGBFunctionArguments.Raster = extractRgbBandFunctionT

                ' Create a Raster Function Template object for the function created above
                Dim stretchingRGBFunctionT As IRasterFunctionTemplate = New RasterFunctionTemplateClass()
                ' Set the function on the template
                stretchingRGBFunctionT.[Function] = DirectCast(stretchingRGBFunction, IRasterFunction)
                ' Set the arguments for the function
                stretchingRGBFunctionT.Arguments = stretchingRGBFunctionArguments


                ' Pansharpen the Pan Image with the Multispectral
                ' Create a Raster Function Arguments object for the pansharpen function
                Dim pansharpFunctionArguements As IPansharpeningFunctionArguments = New PansharpeningFunctionArgumentsClass()
                ' Set the Panchromatic image which has been prepared above
                pansharpFunctionArguements.PanImage = stretchingPanFunctionT
                ' Set the Multispectral image which has been prepared above
                pansharpFunctionArguements.MSImage = stretchingRGBFunctionT

                ' Create a new pansharpen raster function object
                Dim pansharpenFunction As IRasterFunction = New PansharpeningFunction()
                ' Create a new pansharpen function arguments object
                Dim pansharpenFunctionArguements As IPansharpeningFunctionArguments = New PansharpeningFunctionArgumentsClass()
                ' Set the pansharpening type
                pansharpenFunctionArguements.PansharpeningType = esriPansharpeningType.esriPansharpeningESRI
                ' Create an array of doubles that sets the weights for each band
                Dim weightsArray As IDoubleArray = New DoubleArrayClass()
                weightsArray.Add(0.167)
                weightsArray.Add(0.166)
                weightsArray.Add(0.166)
                ' and set it on the arguments object
                pansharpenFunctionArguements.Weights = weightsArray

                ' Create a Raster Function Template object for the pansharpen function
                Dim rasterFunction As IRasterFunctionTemplate = New RasterFunctionTemplateClass()
                rasterFunction.[Function] = DirectCast(pansharpenFunction, IRasterFunction)
                rasterFunction.Arguments = pansharpFunctionArguements
                DirectCast(rasterFunction, IRasterFunction).PixelType = rstPixelType.PT_UCHAR


                ' Resolve variables
                ' Create a PropertySet object to set the values for the 
                ' Raster Function Variables created above
                Dim variables As IPropertySet = New PropertySet()
                variables.SetProperty("panImage", panDataset)
                variables.SetProperty("rgbImage", rgbDataset)


                ' Create the Function Raster Dataset
                ' Create the Function Raster Dataset Object for the Pansharpened Dataset
                Dim functionRasterDataset As IFunctionRasterDataset = New FunctionRasterDataset()
                ' Create a name object for the Function Raster Dataset.
                Dim functionRasterDatasetName As IFunctionRasterDatasetName = New FunctionRasterDatasetNameClass()
                ' Specify the output filename for the new dataset (including 
                ' the .afr extension at the end).
                functionRasterDatasetName.FullName = outputDataset
                functionRasterDataset.FullName = DirectCast(functionRasterDatasetName, IName)
                ' Initialize the new Function Raster Dataset with the Raster Function 
                ' Template and the property set containing the variables and their values.
                functionRasterDataset.Init(DirectCast(rasterFunction, IRasterFunction), variables)

                Dim myTempDset As ITemporaryDataset = DirectCast(functionRasterDataset, ITemporaryDataset)
                myTempDset.MakePermanent()


                ' Shutdown
                Console.WriteLine("Success.")
                Console.WriteLine("Press any key...")
                Console.ReadKey()

                ' Shutdown License
                aoInit.Shutdown()
            Catch exc As Exception
                ' Shutdown
                Console.WriteLine("Exception Caught while creating Function Raster Dataset. " & exc.Message)
                Console.WriteLine("Failed.")
                Console.WriteLine("Press any key...")
                Console.ReadKey()

                ' Shutdown License
                aoInit.Shutdown()
            End Try
        End Sub
    End Class
End Namespace