How to create a raster dataset


Summary
This topic explains the basic steps to create a raster dataset in a given workspace, populate pixel values using a pixel block object, and set a NoData value of the raster dataset.


Creating a raster dataset

To create a tagged image file format (TIFF) file, perform the following steps:
  1. Create a workspace.
  2. Create a TIFF file with specified width, height, pixel type, cell size, and other necessary dimensions.
  3. Use the IPixelBlock and IRasterEdit interfaces to edit the pixel values.
See the following code example:
[C#]
public static IRasterDataset CreateRasterDataset(string Path, string FileName)
{
    try
    {
        IRasterWorkspace2 rasterWs = OpenRasterWorkspace(Path);
        //Define the spatial reference of the raster dataset.
        ISpatialReference sr = new UnknownCoordinateSystemClass();
        //Define the origin for the raster dataset, which is the lower left corner of the raster.
        IPoint origin = new PointClass();
        origin.PutCoords(15.0, 15.0);
        //Define the dimensions of the raster dataset.
        int width = 100; //This is the width of the raster dataset.
        int height = 100; //This is the height of the raster dataset.
        double xCell = 30; //This is the cell size in x direction.
        double yCell = 30; //This is the cell size in y direction.
        int NumBand = 1; // This is the number of bands the raster dataset contains.
        //Create a raster dataset in TIFF format.
        IRasterDataset rasterDataset = rasterWs.CreateRasterDataset(FileName, "TIFF",
            origin, width, height, xCell, yCell, NumBand, rstPixelType.PT_UCHAR, sr,
            true);

        //If you need to set NoData for some of the pixels, you need to set it on band 
        //to get the raster band.
        IRasterBandCollection rasterBands = (IRasterBandCollection)rasterDataset;
        IRasterBand rasterBand;
        IRasterProps rasterProps;
        rasterBand = rasterBands.Item(0);
        rasterProps = (IRasterProps)rasterBand;
        //Set NoData if necessary. For a multiband image, a NoData value needs to be set for each band.
        rasterProps.NoDataValue = 255;
        //Create a raster from the dataset.
        IRaster raster = rasterDataset.CreateFullRaster();

        //Create a pixel block using the weight and height of the raster dataset. 
        //If the raster dataset is large, a smaller pixel block should be used. 
        //Refer to the topic "How to access pixel data using a raster cursor".
        IPnt blocksize = new PntClass();
        blocksize.SetCoords(width, height);
        IPixelBlock3 pixelblock = raster.CreatePixelBlock(blocksize)as IPixelBlock3;

        //Populate some pixel values to the pixel block.
        System.Array pixels;
        pixels = (System.Array)pixelblock.get_PixelData(0);
        for (int i = 0; i < width; i++)
            for (int j = 0; j < height; j++)
                if (i == j)
                    pixels.SetValue(Convert.ToByte(255), i, j);
                else
                    pixels.SetValue(Convert.ToByte((i * j) / 255), i, j);

        pixelblock.set_PixelData(0, (System.Array)pixels);

        //Define the location that the upper left corner of the pixel block is to write.
        IPnt upperLeft = new PntClass();
        upperLeft.SetCoords(0, 0);

        //Write the pixel block.
        IRasterEdit rasterEdit = (IRasterEdit)raster;
        rasterEdit.Write(upperLeft, (IPixelBlock)pixelblock);

        //Release rasterEdit explicitly.
        System.Runtime.InteropServices.Marshal.ReleaseComObject(rasterEdit);

        return rasterDataset;
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
        return null;
    }
}

public static IRasterWorkspace2 OpenRasterWorkspace(string PathName)
{
    //This function opens a raster workspace.
    try
    {
        IWorkspaceFactory workspaceFact = new RasterWorkspaceFactoryClass();
        return workspaceFact.OpenFromFile(PathName, 0)as IRasterWorkspace2;
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
        return null;
    }
}
[VB.NET]
Public Function CreateRasterDataset(ByVal Path As String, ByVal FileName As String) As IRasterDataset
    Try
    Dim ws As IRasterWorkspace2
    ws = OpenRasterworkspace(Path)
    
    'Define the spatial reference of the raster dataset.
    Dim sr As ISpatialReference
    sr = New UnknownCoordinateSystem
    
    'Define the origin for the raster dataset, which is the lower left corner of the raster.
    Dim origin As IPoint
    origin = New Point
    origin.PutCoords(15.0, 15.0)
    
    'Define the dimensions of the raster dataset.
    Dim Width As Integer 'The width of the raster dataset.
    Dim height As Integer 'The height of the raster dataset.
    Dim xCell As Double 'The cell size in x direction.
    Dim yCell As Double 'The cell size in y direction.
    Dim NumBand As Integer 'The number of bands the raster dataset contains.
    Width = 100
    height = 100
    xCell = 30
    yCell = 30
    NumBand = 1
    
    'Create a raster dataset in grid format.
    Dim rasterDS As IRasterDataset
    rasterDS = ws.CreateRasterDataset(FileName, "GRID", origin, Width, height, xCell, yCell, NumBand, rstPixelType.PT_UCHAR, sr, True)
    
    'Get the raster band.
    Dim bands As IRasterBandCollection
    Dim band As IRasterBand
    Dim rasterProps As IRasterProps
    bands = rasterDS
    band = bands.Item(0)
    rasterProps = band
    
    'Set NoData if necessary. For a multiband image, a NoData value needs to be set for each band.
    rasterProps.NoDataValue = 255
    
    'Create a raster from the dataset.
    Dim raster As IRaster
    raster = rasterDS.CreateFullRaster
    
    'Create a pixel block using the weight and height of the raster dataset.
    'If the raster dataset is large, a smaller pixel block should be used.
    'Refer to the topic "How to access pixel data using a raster cursor".
    Dim pixelBlock As IPixelBlock3
    Dim blockSize As IPnt
    blockSize = New Pnt
    blockSize.SetCoords(Width, height)
    pixelBlock = raster.CreatePixelBlock(blockSize)
    
    'Populate some pixel values to the pixel block.
    Dim pixels As System.Array
    Dim i, j As Integer
    pixels = CType(pixelBlock.PixelData(0), System.Array)
    For i = 0 To Width - 1
        For j = 0 To height - 1
            If i = j Then
                pixels.SetValue(Convert.ToByte(255), i, j)
            Else
                pixels.SetValue(Convert.ToByte((i * j) / 255), i, j)
            End If
        Next j
    Next i
    pixelBlock.PixelData(0) = CType(pixels, System.Array)
    
    'Define the location that the upper left corner of the pixel block is to write.
    Dim upperLeft As IPnt
    upperLeft = New Pnt
    upperLeft.SetCoords(0, 0)
    
    'Write the pixel block.
    Dim rasterEdit As IRasterEdit
    rasterEdit = raster
    rasterEdit.Write(upperLeft, pixelBlock)
    
    'Release rasterEdit explicitly.
    System.Runtime.InteropServices.Marshal.ReleaseComObject(rasterEdit);
    
    Return rasterDS
    Catch ex As Exception
    System.Diagnostics.Trace.WriteLine(ex.Message)
    Return Nothing
    End Try
End Function

Public Function OpenRasterworkspace(ByVal Path As String) As IRasterWorkspace2
    Try
    Dim workspaceFact As IWorkspaceFactory
    Dim rasterWS As IRasterWorkspace2
    workspaceFact = New RasterWorkspaceFactory
    rasterWS = workspaceFact.OpenFromFile(Path, 0)
    
    Return rasterWS
    Catch ex As Exception
    System.Diagnostics.Trace.WriteLine(ex.Message)
    Return Nothing
    End Try
End Function

Creating a raster dataset in a geodatabase

To create a raster dataset in a geodatabase, perform the following steps:
  1. Create a file geodatabase workspace factory.
  2. Create a raster workspace and query IRasterWorkspaceEx.
  3. Define the storage and raster properties using the RasterStorageDef and RasterDef classes.
  4. Create the dataset using the CreateRasterDataset method.
See the following code example:
[C#]
IWorkspaceFactory wsf = new FileGDBWorkspaceFactoryClass();
IRasterWorkspaceEx ws = (IRasterWorkspaceEx)wsf.OpenFromFile(@"c:\temp\fgdb.gdb", 0);

//Define the raster storage.
IRasterStorageDef storage = new RasterStorageDefClass();
storage.Tiled = true;
storage.TileHeight = 128;
storage.TileWidth = 128;

//Define the spatial reference.
IRasterDef rasterDef = new RasterDefClass();
rasterDef.SpatialReference = new UnknownCoordinateSystemClass();

//Create data.
IRasterDataset rasterDs = ws.CreateRasterDataset("newraster", 3,
    rstPixelType.PT_SHORT, storage, "sde.DEFAULT", rasterDef, null);
[VB.NET]
Dim wsf As IWorkspaceFactory = New FileGDBWorkspaceFactoryClass()
Dim ws As IRasterWorkspaceEx = CType (wsf.OpenFromFile (@"c:\temp\fgdb.gdb", 0), IRasterWorkspaceEx)

'Define the raster storage.
Dim storage As IRasterStorageDef = New RasterStorageDefClass()
storage.Tiled = True
storage.TileHeight = 128
storage.TileWidth = 128

'Define the spatial reference.
Dim rasterDef As IRasterDef = New RasterDefClass()
rasterDef.SpatialReference = New UnknownCoordinateSystemClass()

'Create data.
Dim rasterDs As IRasterDataset
rasterDs = ws.CreateRasterDataset("newraster", 3, rstPixelType.PT_SHORT, storage, "sde.DEFAULT", rasterDef, null)


See Also:

How to access pixel data using a raster cursor
How to access pixel data using the RawBlocks object




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 ArcGIS for Desktop Basic
ArcGIS for Desktop Standard ArcGIS for Desktop Standard
ArcGIS for Desktop Advanced ArcGIS for Desktop Advanced
Engine Developer Kit Engine