About the Get and set key properties on a mosaic dataset Sample
[C#]
GetSetKeyProperty.cs
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ESRI.ArcGIS;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.DataSourcesRaster;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
/*
This sample opens a Mosaic Dataset and goes through each row in the attribute table.
It checks whether the dataset in the row has any band information (band properties)
associated with it.
If the item has no band information, it inserts band properties for the first 3 bands
in the item (if the item has 3 or more bands).
Finally the mosaic dataset product definition is changed to Natural Color RGB so that
ArcGIS can use the band names of the mosaic dataset.
The sample also shows how to set a key property on the mosaic dataset.
The sample has functions to get/set any key property for a dataset.
The sample has functions to get/set any band property for a dataset.
The sample has functions to get all the properties and all the band properties
for a dataset.
Key Properties:
Key Properties of type 'double':
CloudCover
SunElevation
SunAzimuth
SensorElevation
SensorAzimuth
OffNadir
VerticalAccuracy
HorizontalAccuracy
LowCellSize
HighCellSize
MinCellSize
MaxCellSize
Key Properties of type 'date':
AcquisitionDate
Key Properties of type 'string':
SensorName
ParentRasterType
DataType
ProductName
DatasetTag
*/
namespace RasterSamples
{
class GetSetKeyProperty
{
[STAThread]
static void Main(string[] args)
{
#region Initialize
ESRI.ArcGIS.esriSystem.AoInitialize aoInit = null;
try
{
Console.WriteLine("Obtaining license");
ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop);
aoInit = new AoInitializeClass();
esriLicenseStatus licStatus = aoInit.Initialize(esriLicenseProductCode.esriLicenseProductCodeAdvanced);
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);
}
#endregion
try
{
// Input database and Mosaic Dataset
string MDWorkspaceFolder = @"e:\md\Samples\GetSetKP\RasterSamples.gdb";
string MDName = @"LAC";
// Command line setting of above input if provided.
string[] commandLineArgs = Environment.GetCommandLineArgs();
if (commandLineArgs.GetLength(0) > 1)
{
MDWorkspaceFolder = commandLineArgs[1];
MDName = commandLineArgs[2];
}
// Open MD
Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory");
IWorkspaceFactory mdWorkspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
IWorkspace mdWorkspace = mdWorkspaceFactory.OpenFromFile(MDWorkspaceFolder, 0);
IRasterWorkspaceEx workspaceEx = (IRasterWorkspaceEx)(mdWorkspace);
IMosaicDataset mosaicDataset = (IMosaicDataset)workspaceEx.OpenRasterDataset(MDName);
// Set Mosaic Dataset item information.
SetMosaicDatasetItemInformation(mosaicDataset);
// Set Key Property 'DataType' on the Mosaic Dataset to value 'Processed'
// The change will be reflected on the 'General' page of the mosaic dataset
// properties under the 'Source Type' property.
SetKeyProperty((IDataset)mosaicDataset, "DataType", "Processed");
// Set the Product Definition on the Mosaic Dataset to 'NATURAL_COLOR_RGB'
// First set the 'BandDefinitionKeyword' key property to natural color RGB.
SetKeyProperty((IDataset)mosaicDataset, "BandDefinitionKeyword", "NATURAL_COLOR_RGB");
// Then set band names and wavelengths on the mosaic dataset.
SetBandProperties((IDataset)mosaicDataset);
// Last and most important, refresh the mosaic dataset so the changes are saved.
((IRasterDataset3)mosaicDataset).Refresh();
#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
}
}
/// <summary>
/// Sets band information on items in a mosaic dataset
/// </summary>
/// <param name="md">The mosaic dataset with the items</param>
private static void SetMosaicDatasetItemInformation(IMosaicDataset md)
{
// Get the Attribute table from the Mosaic Dataset.
IFeatureClass featureClass = md.Catalog;
ISchemaLock schemaLock = (ISchemaLock)featureClass;
IRasterDataset3 rasDs = null;
try
{
// A try block is necessary, as an exclusive lock might not be available.
schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
// Get an update cursor going through all the rows in the Moasic Dataset.
IFeatureCursor fcCursor = featureClass.Update(null, false);
// Alternatively, a read cursor can be used if the item does not need to be changed.
// featureClass.Search(null, false);
// For each row,
IRasterCatalogItem rasCatItem = (IRasterCatalogItem)fcCursor.NextFeature();
while (rasCatItem != null)
{
// get the functionrasterdataset from the Raster field.
IFunctionRasterDataset funcDs = (IFunctionRasterDataset)rasCatItem.RasterDataset;
if (funcDs != null)
{
// Check if the 'BandName' property exists in the dataset.
bool propertyExists = false;
for (int bandID = 0; bandID < funcDs.RasterInfo.BandCount; ++bandID)
{
object bandNameProperty = null;
bandNameProperty = GetBandProperty((IDataset)funcDs, "BandName", bandID);
if (bandNameProperty != null)
propertyExists = true;
}
if (propertyExists == false && funcDs.RasterInfo.BandCount > 2)
{
// If the property does not exist and the dataset has atleast 3 bands,
// set Band Definition Properties for first 3 bands of the dataset.
SetBandProperties((IDataset)funcDs);
funcDs.AlterDefinition();
rasDs = (IRasterDataset3)funcDs;
// Refresh the dataset.
rasDs.Refresh();
}
}
fcCursor.UpdateFeature((IFeature)rasCatItem);
rasDs = null;
rasCatItem = (IRasterCatalogItem)fcCursor.NextFeature();
}
rasCatItem = null;
fcCursor = null;
featureClass = null;
}
catch (Exception exc) { Console.WriteLine("Exception Caught in SetMosaicDatasetItemInformation: " + exc.Message); }
finally
{
// Set the lock to shared, whether or not an error occurred.
schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
}
}
/// <summary>
/// Sets band properties on a given dataset
/// </summary>
/// <param name="ds">The target dataset</param>
private static void SetBandProperties(IDataset dataset)
{
try
{
// Set properties for Band 1.
SetBandProperty(dataset, "BandName", 0, "Red");
SetBandProperty(dataset, "WavelengthMin", 0, 630);
SetBandProperty(dataset, "WavelengthMax", 0, 690);
// Set properties for Band 2.
SetBandProperty(dataset, "BandName", 1, "Green");
SetBandProperty(dataset, "WavelengthMin", 1, 530);
SetBandProperty(dataset, "WavelengthMax", 1, 570);
// Set properties for Band 3.
SetBandProperty(dataset, "BandName", 2, "Blue");
SetBandProperty(dataset, "WavelengthMin", 2, 440);
SetBandProperty(dataset, "WavelengthMax", 2, 480);
}
catch (Exception) { }
}
/// <summary>
/// Get all the properties associated with the dataset.
/// </summary>
/// <param name="dataset">Dataset to get the property from.</param>
/// <param name="allKeys">String Array passed in by reference to fill with all keys.</param>
/// <param name="allProperties">Object array passed in by reference to fill with all properties.</param>
static void GetAllProperties(IDataset dataset, ref IStringArray allKeys, ref IVariantArray allProperties)
{
IRasterKeyProperties rasterKeyProps = (IRasterKeyProperties)dataset;
rasterKeyProps.GetAllProperties(out allKeys, out allProperties);
}
/// <summary>
/// Get all the properties associated with a particular band of the dataset.
/// </summary>
/// <param name="dataset">Dataset to get the property from.</param>
/// <param name="bandIndex">band for which to get all properties.</param>
/// <param name="bandKeys">String Array passed in by reference to fill with all keys.</param>
/// <param name="bandProperties">Object array passed in by reference to fill with all properties.</param>
static void GetAllBandProperties(IDataset dataset, int bandIndex, ref IStringArray bandKeys, ref IVariantArray bandProperties)
{
IRasterKeyProperties rasterKeyProps = (IRasterKeyProperties)dataset;
rasterKeyProps.GetAllBandProperties(bandIndex, out bandKeys, out bandProperties);
}
/// <summary>
/// Get the Key Property corresponding to the key 'key' from the dataset.
/// </summary>
/// <param name="dataset">Dataset to get the property from.</param>
/// <param name="key">The key for which to get the value.</param>
/// <returns>Property corresponding to the key or null if it doesnt exist.</returns>
static object GetKeyProperty(IDataset dataset, string key)
{
IRasterKeyProperties rasterKeyProps = (IRasterKeyProperties)dataset;
object value = null;
try { value = rasterKeyProps.GetProperty(key); }
catch (Exception) { }
return value;
}
/// <summary>
/// Set the Key Property 'value' corresponding to the key 'key' on the dataset.
/// </summary>
/// <param name="dataset">Dataset to set the property on.</param>
/// <param name="key">The key on which to set the property.</param>
/// <param name="value">The value to set.</param>
static void SetKeyProperty(IDataset dataset, string key, object value)
{
IRasterKeyProperties rasterKeyProps = (IRasterKeyProperties)dataset;
rasterKeyProps.SetProperty(key, value);
}
/// <summary>
/// Get the KeyProperty corresponding to the bandIndex and 'key' from the dataset.
/// </summary>
/// <param name="dataset">Dataset to get the property from.</param>
/// <param name="key">The key for which to get the value.</param>
/// <param name="bandIndex">Band for which to get the property.</param>
/// <returns>Property corresponding to the key or null if none found.</returns>
static object GetBandProperty(IDataset dataset, string key, int bandIndex)
{
IRasterKeyProperties rasterKeyProps = (IRasterKeyProperties)dataset;
object value = null;
try { value = rasterKeyProps.GetBandProperty(key, bandIndex); }
catch (Exception) { }
return value;
}
/// <summary>
/// Set the KeyProperty corresponding to the bandIndex and 'key' from the dataset.
/// </summary>
/// <param name="dataset">Dataset to set the property on.</param>
/// <param name="key">The key on which to set the property.</param>
/// <param name="bandIndex">Band from which to get the property.</param>
/// <param name="value">The value to set.</param>
static void SetBandProperty(IDataset dataset, string key, int bandIndex, object value)
{
IRasterKeyProperties rasterKeyProps = (IRasterKeyProperties)dataset;
rasterKeyProps.SetBandProperty(key, bandIndex, value);
}
}
}
[Visual Basic .NET]
GetSetKeyProperty.vb
Imports System.IO
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports ESRI.ArcGIS
Imports ESRI.ArcGIS.DataSourcesGDB
Imports ESRI.ArcGIS.DataSourcesRaster
Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.Geodatabase
Imports ESRI.ArcGIS.Geometry
'
' This sample opens a Mosaic Dataset and goes through each row in the attribute table.
' It checks whether the dataset in the row has any band information (band properties)
' associated with it.
' If the item has no band information, it inserts band properties for the first 3 bands
' in the item (if the item has 3 or more bands).
' Finally the mosaic dataset product definition is changed to Natural Color RGB so that
' ArcGIS can use the band names of the mosaic dataset.
' The sample also shows how to set a key property on the mosaic dataset.
'
' The sample has functions to get/set any key property for a dataset.
' The sample has functions to get/set any band property for a dataset.
' The sample has functions to get all the properties and all the band properties
' for a dataset.
'
' Key Properties:
'
' Key Properties of type 'double':
' CloudCover
' SunElevation
' SunAzimuth
' SensorElevation
' SensorAzimuth
' OffNadir
' VerticalAccuracy
' HorizontalAccuracy
' LowCellSize
' HighCellSize
' MinCellSize
' MaxCellSize
'
' Key Properties of type 'date':
' AcquisitionDate
'
' Key Properties of type 'string':
' SensorName
' ParentRasterType
' DataType
' ProductName
' DatasetTag
'
Namespace RasterSamples
Class GetSetKeyProperty
<STAThread> _
Friend Shared Sub Main(args As String())
'#Region "Initialize"
Dim aoInit As ESRI.ArcGIS.esriSystem.AoInitialize = Nothing
Try
Console.WriteLine("Obtaining license")
ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop)
aoInit = New AoInitializeClass()
Dim licStatus As esriLicenseStatus = aoInit.Initialize(esriLicenseProductCode.esriLicenseProductCodeAdvanced)
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)
End Try
'#End Region
Try
' Input database and Mosaic Dataset
Dim MDWorkspaceFolder As String = "e:\md\Samples\GetSetKP\RasterSamples.gdb"
Dim MDName As String = "LAC"
' Command line setting of above input if provided.
Dim commandLineArgs As String() = Environment.GetCommandLineArgs()
If commandLineArgs.GetLength(0) > 1 Then
MDWorkspaceFolder = commandLineArgs(1)
MDName = commandLineArgs(2)
End If
' Open MD
Dim factoryType As Type = Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory")
Dim mdWorkspaceFactory As IWorkspaceFactory = DirectCast(Activator.CreateInstance(factoryType), IWorkspaceFactory)
Dim mdWorkspace As IWorkspace = mdWorkspaceFactory.OpenFromFile(MDWorkspaceFolder, 0)
Dim workspaceEx As IRasterWorkspaceEx = DirectCast(mdWorkspace, IRasterWorkspaceEx)
Dim mosaicDataset As IMosaicDataset = DirectCast(workspaceEx.OpenRasterDataset(MDName), IMosaicDataset)
' Set Mosaic Dataset item information.
SetMosaicDatasetItemInformation(mosaicDataset)
' Set Key Property 'DataType' on the Mosaic Dataset to value 'Processed'
' The change will be reflected on the 'General' page of the mosaic dataset
' properties under the 'Source Type' property.
SetKeyProperty(DirectCast(mosaicDataset, IDataset), "DataType", "Processed")
' Set the Product Definition on the Mosaic Dataset to 'NATURAL_COLOR_RGB'
' First set the 'BandDefinitionKeyword' key property to natural color RGB.
SetKeyProperty(DirectCast(mosaicDataset, IDataset), "BandDefinitionKeyword", "NATURAL_COLOR_RGB")
' Then set band names and wavelengths on the mosaic dataset.
SetBandProperties(DirectCast(mosaicDataset, IDataset))
' Last and most important, refresh the mosaic dataset so the changes are saved.
DirectCast(mosaicDataset, IRasterDataset3).Refresh()
'#Region "Shutdown"
Console.WriteLine("Success.")
Console.WriteLine("Press any key...")
Console.ReadKey()
' Shutdown License
'#End Region
aoInit.Shutdown()
Catch exc As Exception
'#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
'#End Region
aoInit.Shutdown()
End Try
End Sub
''' <summary>
''' Sets band information on items in a mosaic dataset
''' </summary>
''' <param name="md">The mosaic dataset with the items</param>
Private Shared Sub SetMosaicDatasetItemInformation(md As IMosaicDataset)
' Get the Attribute table from the Mosaic Dataset.
Dim featureClass As IFeatureClass = md.Catalog
Dim schemaLock As ISchemaLock = DirectCast(featureClass, ISchemaLock)
Dim rasDs As IRasterDataset3 = Nothing
Try
' A try block is necessary, as an exclusive lock might not be available.
schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock)
' Get an update cursor going through all the rows in the Moasic Dataset.
Dim fcCursor As IFeatureCursor = featureClass.Update(Nothing, False)
' Alternatively, a read cursor can be used if the item does not need to be changed.
' featureClass.Search(null, false);
' For each row,
Dim rasCatItem As IRasterCatalogItem = DirectCast(fcCursor.NextFeature(), IRasterCatalogItem)
While rasCatItem IsNot Nothing
' get the functionrasterdataset from the Raster field.
Dim funcDs As IFunctionRasterDataset = DirectCast(rasCatItem.RasterDataset, IFunctionRasterDataset)
If funcDs IsNot Nothing Then
' Check if the 'BandName' property exists in the dataset.
Dim propertyExists As Boolean = False
For bandID As Integer = 0 To funcDs.RasterInfo.BandCount - 1
Dim bandNameProperty As Object = Nothing
bandNameProperty = GetBandProperty(DirectCast(funcDs, IDataset), "BandName", bandID)
If bandNameProperty IsNot Nothing Then
propertyExists = True
End If
Next
If propertyExists = False AndAlso funcDs.RasterInfo.BandCount > 2 Then
' If the property does not exist and the dataset has atleast 3 bands,
' set Band Definition Properties for first 3 bands of the dataset.
SetBandProperties(DirectCast(funcDs, IDataset))
funcDs.AlterDefinition()
rasDs = DirectCast(funcDs, IRasterDataset3)
' Refresh the dataset.
rasDs.Refresh()
End If
End If
fcCursor.UpdateFeature(DirectCast(rasCatItem, IFeature))
rasDs = Nothing
rasCatItem = DirectCast(fcCursor.NextFeature(), IRasterCatalogItem)
End While
rasCatItem = Nothing
fcCursor = Nothing
featureClass = Nothing
Catch exc As Exception
Console.WriteLine("Exception Caught in SetMosaicDatasetItemInformation: " & exc.Message)
Finally
' Set the lock to shared, whether or not an error occurred.
schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock)
End Try
End Sub
''' <summary>
''' Sets band properties on a given dataset
''' </summary>
''' <param name="ds">The target dataset</param>
Private Shared Sub SetBandProperties(dataset As IDataset)
Try
' Set properties for Band 1.
SetBandProperty(dataset, "BandName", 0, "Red")
SetBandProperty(dataset, "WavelengthMin", 0, 630)
SetBandProperty(dataset, "WavelengthMax", 0, 690)
' Set properties for Band 2.
SetBandProperty(dataset, "BandName", 1, "Green")
SetBandProperty(dataset, "WavelengthMin", 1, 530)
SetBandProperty(dataset, "WavelengthMax", 1, 570)
' Set properties for Band 3.
SetBandProperty(dataset, "BandName", 2, "Blue")
SetBandProperty(dataset, "WavelengthMin", 2, 440)
SetBandProperty(dataset, "WavelengthMax", 2, 480)
Catch generatedExceptionName As Exception
End Try
End Sub
''' <summary>
''' Get all the properties associated with the dataset.
''' </summary>
''' <param name="dataset">Dataset to get the property from.</param>
''' <param name="allKeys">String Array passed in by reference to fill with all keys.</param>
''' <param name="allProperties">Object array passed in by reference to fill with all properties.</param>
Private Shared Sub GetAllProperties(dataset As IDataset, ByRef allKeys As IStringArray, ByRef allProperties As IVariantArray)
Dim rasterKeyProps As IRasterKeyProperties = DirectCast(dataset, IRasterKeyProperties)
rasterKeyProps.GetAllProperties(allKeys, allProperties)
End Sub
''' <summary>
''' Get all the properties associated with a particular band of the dataset.
''' </summary>
''' <param name="dataset">Dataset to get the property from.</param>
''' <param name="bandIndex">band for which to get all properties.</param>
''' <param name="bandKeys">String Array passed in by reference to fill with all keys.</param>
''' <param name="bandProperties">Object array passed in by reference to fill with all properties.</param>
Private Shared Sub GetAllBandProperties(dataset As IDataset, bandIndex As Integer, ByRef bandKeys As IStringArray, ByRef bandProperties As IVariantArray)
Dim rasterKeyProps As IRasterKeyProperties = DirectCast(dataset, IRasterKeyProperties)
rasterKeyProps.GetAllBandProperties(bandIndex, bandKeys, bandProperties)
End Sub
''' <summary>
''' Get the Key Property corresponding to the key 'key' from the dataset.
''' </summary>
''' <param name="dataset">Dataset to get the property from.</param>
''' <param name="key">The key for which to get the value.</param>
''' <returns>Property corresponding to the key or null if it doesnt exist.</returns>
Private Shared Function GetKeyProperty(dataset As IDataset, key As String) As Object
Dim rasterKeyProps As IRasterKeyProperties = DirectCast(dataset, IRasterKeyProperties)
Dim value As Object = Nothing
Try
value = rasterKeyProps.GetProperty(key)
Catch generatedExceptionName As Exception
End Try
Return value
End Function
''' <summary>
''' Set the Key Property 'value' corresponding to the key 'key' on the dataset.
''' </summary>
''' <param name="dataset">Dataset to set the property on.</param>
''' <param name="key">The key on which to set the property.</param>
''' <param name="value">The value to set.</param>
Private Shared Sub SetKeyProperty(dataset As IDataset, key As String, value As Object)
Dim rasterKeyProps As IRasterKeyProperties = DirectCast(dataset, IRasterKeyProperties)
rasterKeyProps.SetProperty(key, value)
End Sub
''' <summary>
''' Get the KeyProperty corresponding to the bandIndex and 'key' from the dataset.
''' </summary>
''' <param name="dataset">Dataset to get the property from.</param>
''' <param name="key">The key for which to get the value.</param>
''' <param name="bandIndex">Band for which to get the property.</param>
''' <returns>Property corresponding to the key or null if none found.</returns>
Private Shared Function GetBandProperty(dataset As IDataset, key As String, bandIndex As Integer) As Object
Dim rasterKeyProps As IRasterKeyProperties = DirectCast(dataset, IRasterKeyProperties)
Dim value As Object = Nothing
Try
value = rasterKeyProps.GetBandProperty(key, bandIndex)
Catch generatedExceptionName As Exception
End Try
Return value
End Function
''' <summary>
''' Set the KeyProperty corresponding to the bandIndex and 'key' from the dataset.
''' </summary>
''' <param name="dataset">Dataset to set the property on.</param>
''' <param name="key">The key on which to set the property.</param>
''' <param name="bandIndex">Band from which to get the property.</param>
''' <param name="value">The value to set.</param>
Private Shared Sub SetBandProperty(dataset As IDataset, key As String, bandIndex As Integer, value As Object)
Dim rasterKeyProps As IRasterKeyProperties = DirectCast(dataset, IRasterKeyProperties)
rasterKeyProps.SetBandProperty(key, bandIndex, value)
End Sub
End Class
End Namespace