FAQ
ArcObjects でのラスター レンダラーの作成と適用

ナレッジ番号:5533 | 登録日:2023/07/27 | 更新日:2024/11/21

概要

ラスター データセットは、さまざまな方法でマップにレンダリングすることができます。 レンダリングとは、データをレイヤーとして表示するプロセスのことです。ラスター データセットがどのようにレンダリングされるかは、中に含まれているデータのタイプと表示するデータによって異なります。このドキュメントでは ArcObjects でラスター レンダラーを設定する方法を紹介します。

サンプル コード

ラスター レンダラーの作成: ストレッチ

ストレッチ レンダリングでは、連続データのラスターのセル値をカラー ランプのグラデーションを使用して表示します。ストレッチ レンダラーは、連続データの単一のバンドの描画に使用します。ストレッチ レンダラーは、画像、航空写真、標高モデルなど、値の範囲が大きなデータを表示する場合に使用されます。
Image Image
public IRasterRenderer StretchRenderer(ESRI.ArcGIS.Geodatabase.IRasterDataset rasterDataset)
{
    try
    {
        //カラー ランプの始めと終わりの色を定義する。
        IRgbColor fromColor = new RgbColorClass();
        fromColor.Red = 255;
        fromColor.Green = 0;
        fromColor.Blue = 0;
        IRgbColor toColor = new RgbColorClass();
        toColor.Red = 0;
        toColor.Green = 255;
        toColor.Blue = 0;
        //カラー ランプを作成する。
        IAlgorithmicColorRamp pColorRamp = new AlgorithmicColorRampClass();
        pColorRamp.Size = 255;
        pColorRamp.FromColor = fromColor;  // 赤から
        pColorRamp.ToColor = toColor;      // 緑へ
        bool createColorRamp;
        pColorRamp.CreateRamp(out createColorRamp);
        //ストレッチレンダラーを作成する。
        IRasterStretchColorRampRenderer pStretchRenderer = new
            RasterStretchColorRampRendererClass();
        IRasterRenderer pRasterRenderer = (IRasterRenderer)pStretchRenderer;
        //レンダラーのプロパティを設定する。
        IRaster raster = rasterDataset.CreateDefaultRaster();
        pRasterRenderer.Raster = raster;
        pRasterRenderer.Update();
        pStretchRenderer.BandIndex = 0;
        pStretchRenderer.ColorRamp = pColorRamp;
        //ストレッチ タイプを設定する。
        IRasterStretch stretchType = (IRasterStretch)pRasterRenderer;
        stretchType.StretchType =
            esriRasterStretchTypesEnum.esriRasterStretch_StandardDeviations;
        stretchType.StandardDeviationsParam = 2;
        return pRasterRenderer;
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
        return null;
    }
}
Public Function StretchRenderer(ByVal rasterDataset As IRasterDataset) As IRasterRenderer
    Try
        'カラーランプの始めと終わりの色を定義する。
        Dim fromColor As IRgbColor = New RgbColorClass()
        fromColor.Red = 255
        fromColor.Green = 0
        fromColor.Blue = 0
        Dim toColor As IColor = New RgbColorClass()
        toColor.Red = 0
        toColor.Green = 255
        toColor.Blue = 0

        'カラーランプを作成する。
        Dim pColorRamp As IAlgorithmicColorRamp = New AlgorithmicColorRampClass()
        pColorRamp.Size = 255
        pColorRamp.FromColor = fromColor '赤から
        pColorRamp.ToColor = toColor      '緑へ
        Dim createColorRamp As Boolean
        pColorRamp.CreateRamp(createColorRamp)

        'ストレッチレンダラーを作成する。
        Dim pStretchRenderer2 As IRasterStretchColorRampRenderer = New RasterStretchColorRampRendererClass()
        Dim pRasterRenderer As IRasterRenderer = CType(pStretchRenderer2, IRasterRenderer)

        'レンダラーのプロパティを設定する。
        Dim raster As IRaster = rasterDataset.CreateDefaultRaster()
        pRasterRenderer.Raster = raster
        pRasterRenderer.Update()
        pStretchRenderer2.BandIndex = 0
        pStretchRenderer2.ColorRamp = pColorRamp

        'ストレッチ タイプを設定する。
        Dim stretchType As IRasterStretch = CType(pRasterRenderer, IRasterStretch)
        stretchType.StretchType = esriRasterStretchTypesEnum.esriRasterStretch_StandardDeviations
        stretchType.StandardDeviationsParam = 2

        Return pRasterRenderer
    Catch ex As Exception
        System.Diagnostics.Debug.WriteLine(ex.Message)
        Return Nothing
    End Try
End Function

ラスター レンダラーの作成: RGB カラー合成

RGB カラー合成レンダラーはストレッチ レンダラーと同じ方法を使用しますが、赤、緑、青のコンポジットとしてバンドを結合することができます。
public IRasterRenderer RGBRenderer(ESRI.ArcGIS.Geodatabase.IRasterDataset rasterDataset)
{
    try
    {
        IRasterRGBRenderer pRGBRenderer = new RasterRGBRendererClass();
        IRasterRenderer pRasterRenderer = (IRasterRenderer) pRGBRenderer;
        return pRasterRenderer;
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
        return null;
    }
}
Public Function pRGBRenderer(ByVal rasterDataset As IRasterDataset) As IRasterRenderer
    Try
        Dim pRGBRen As IRasterRGBRenderer = New RasterRGBRendererClass()
        Dim pRasterRenderer As IRasterRenderer = CType(pRGBRen, IRasterRenderer)
        Return pRasterRenderer
    Catch ex As Exception
        System.Diagnostics.Debug.WriteLine(ex.Message)
        Return Nothing
    End Try
End Function

ラスター レンダラーの作成: 個別値

個別値レンダラーは、ラスター レイヤーのセル値ごとに色を設定するために使用します。以下の例では、あらかじめ属性テーブルが作成されているラスターに対して個別値レンダラーを作成します。
ラスターの属性テーブルについては、★関連ナレッジがみつかりませんでした★こちらのFAQ でご確認ください。

Image Image

public IRasterRenderer UniqueValueRenderer(ESRI.ArcGIS.Geodatabase.IRasterDataset
    rasterDataset)
{
    try
    {
        //ラスターの属性テーブルを取得して、そのテーブルのサイズを得る。
        IRaster2 raster = (IRaster2)rasterDataset.CreateDefaultRaster();
        ITable rasterTable = raster.AttributeTable;
        if (rasterTable == null)
        {
            return null;
        }
        int tableRows = rasterTable.RowCount(null);
        //個々の値に対するカラーを作成する。
        IRandomColorRamp colorRamp = new RandomColorRampClass();
        colorRamp.Size = tableRows;
        colorRamp.Seed = 100;
        bool createColorRamp;
        colorRamp.CreateRamp(out createColorRamp);
        if (createColorRamp == false)
        {
            return null;
        }
        //個別値レンダラーを作成する。
        IRasterUniqueValueRenderer uvRenderer = new RasterUniqueValueRendererClass();
        IRasterRenderer rasterRenderer = (IRasterRenderer)uvRenderer;
        rasterRenderer.Raster = rasterDataset.CreateDefaultRaster();
        rasterRenderer.Update();
        //レンダラープロパティを設定する。
        uvRenderer.HeadingCount = 1;
        uvRenderer.set_Heading(0, "All Data Value");
        uvRenderer.set_ClassCount(0, tableRows);
        uvRenderer.Field = "Value"; //Or any other field in the table.
        IRow row;
        ISimpleFillSymbol fillSymbol;
        for (int i = 0; i < tableRows; i++)
        {
            row = rasterTable.GetRow(i);
            uvRenderer.AddValue(0, i, Convert.ToByte(row.get_Value(1)));
            // ラスターは8bit とする。
            uvRenderer.set_Label(0, i, Convert.ToString(row.get_Value(1)));
            fillSymbol = new SimpleFillSymbolClass();
            fillSymbol.Color = colorRamp.get_Color(i);
            uvRenderer.set_Symbol(0, i, (ISymbol)fillSymbol);
        }
        return rasterRenderer;
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
        return null;
    }
}
Public Function UnqueValueRenderer(ByVal rasterDataset As IRasterDataset) As IRasterRenderer
Try
    'ラスターの属性テーブルを取得して、そのテーブルのサイズを得る。
    Dim raster As IRaster2 = CType(rasterDataset.CreateDefaultRaster(), IRaster2)
    Dim rasterTable As ITable = raster.AttributeTable
    If rasterTable Is Nothing Then
        Return Nothing
    End If
    Dim tableRows As Integer = rasterTable.RowCount(Nothing)

    '個々の値に対するカラーを作成する。
    Dim colorRamp As IRandomColorRamp = New RandomColorRampClass()
    colorRamp.Size = tableRows
    colorRamp.Seed = 100
    Dim createColorRamp As Boolean
    colorRamp.CreateRamp(createColorRamp)
    If createColorRamp = False Then
        Return Nothing
    End If

    '個別値レンダラーを作成する。
    Dim uvRenderer As IRasterUniqueValueRenderer = New RasterUniqueValueRendererClass()
    Dim rasterRenderer As IRasterRenderer = CType(uvRenderer, IRasterRenderer)
    rasterRenderer.Raster = rasterDataset.CreateDefaultRaster()
    rasterRenderer.Update()

    'レンダラー プロパティを設定する。
    uvRenderer.HeadingCount = 1
    uvRenderer.Heading(0) = "All Data Value"
    uvRenderer.ClassCount(0) = tableRows
    uvRenderer.Field = "Value" 'Or any other field in the table.

    Dim row As IRow
    Dim fillSymbol As ISimpleFillSymbol
    Dim i As Integer
    For i = 0 To tableRows - 1 Step i + 1
        row = rasterTable.GetRow(i)
        'ラスターは8bit とする。
        uvRenderer.AddValue(0, i, Convert.ToByte(row.Value(1)))
        uvRenderer.Label(0, i) = Convert.ToString(row.Value(1))
        fillSymbol = New SimpleFillSymbolClass()
        fillSymbol.Color = colorRamp.Color(i)
        uvRenderer.Symbol(0, i) = CType(fillSymbol, ISymbol)
    Next
    Return rasterRenderer
Catch ex As Exception
    System.Diagnostics.Debug.WriteLine(ex.Message)
    Return Nothing
End Try
End Function

ラスター レンダラーの作成: 分類

分類レンダラーは、シングルバンド ラスター レイヤーで使用します。分類では、セル値をグループ化することでクラスを作成し、クラスに対して色を割り当てます。

Image Image

public IRasterRenderer ClassifyRenderer(ESRI.ArcGIS.Geodatabase.IRasterDataset
    rasterDataset)
{
    try
    {
        //分類のレンダラーを作成する。
        IRasterClassifyColorRampRenderer classifyRenderer = new
            RasterClassifyColorRampRendererClass();
        IRasterRenderer rasterRenderer = (IRasterRenderer)classifyRenderer;

        //レンダラープロパティを設定する。
        IRaster raster = rasterDataset.CreateDefaultRaster();
        rasterRenderer.Raster = raster;
        classifyRenderer.ClassCount = 3;
        rasterRenderer.Update();

        //シンボルのカラーランプを設定する。
        IAlgorithmicColorRamp colorRamp = new AlgorithmicColorRampClass();
        colorRamp.Size = 3;
        bool createColorRamp;
        colorRamp.CreateRamp(out createColorRamp);

        //クラスのシンボルを作成する。
        IFillSymbol fillSymbol = new SimpleFillSymbolClass();
        for (int i = 0; i < classifyRenderer.ClassCount; i++)
        {
            fillSymbol.Color = colorRamp.get_Color(i);
            classifyRenderer.set_Symbol(i, (ISymbol)fillSymbol);
            classifyRenderer.set_Label(i, Convert.ToString(i));
        }
        return rasterRenderer;
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
        return null;
    }
}
Public Function ClassifyRenderer(ByVal rasterDataset As ESRI.ArcGIS.Geodatabase.IRasterDataset) As IRasterRenderer
    Try
        '分類のレンダラーを作成する。
        Dim classifyRenderer2 As IRasterClassifyColorRampRenderer = New RasterClassifyColorRampRendererClass()
        Dim rasterRenderer As IRasterRenderer = CType(classifyRenderer2, IRasterRenderer)

        'レンダラープロパティを設定する。
        Dim raster As IRaster = rasterDataset.CreateDefaultRaster()
        rasterRenderer.Raster = raster
        classifyRenderer2.ClassCount = 3
        rasterRenderer.Update()

        'シンボルのカラーランプを設定する。
        Dim colorRamp As IAlgorithmicColorRamp = New AlgorithmicColorRampClass()
        colorRamp.Size = 3
        Dim createColorRamp As Boolean
        colorRamp.CreateRamp(createColorRamp)

        'クラスのシンボルを作成する。
        Dim fillSymbol As IFillSymbol = New SimpleFillSymbolClass()
        Dim i As Integer
        For i = 0 To classifyRenderer2.ClassCount - 1 Step i + 1
            fillSymbol.Color = colorRamp.Color(i)
            classifyRenderer2.Symbol(i) = CType(fillSymbol, ISymbol)
            classifyRenderer2.Label(i) = Convert.ToString(i)
        Next
        Return rasterRenderer
    Catch ex As Exception
        System.Diagnostics.Debug.WriteLine(ex.Message)
        Return Nothing
    End Try
End Function

ラスター レイヤーにレンダラーを適用

ArcMap.Application.CurrentTool = null;
IRasterLayer Rasterlay;
Rasterlay = ArcMap.Document.FocusMap.get_Layer(0) as IRasterLayer;
IRasterDataset RDataset =  ((IRasterAnalysisProps)Rasterlay.Raster).RasterDataset ;
IRasterRenderer RasterRen = StretchRenderer(RDataset); //ストレッチの場合
IRasterRenderer RasterRen = RGBRenderer(RDataset); //RGBの場合
IRasterRenderer RasterRen = UnqueValueRenderer(RDataset); //個別値の場合
IRasterRenderer RasterRen = ClassifyRenderer(RDataset); //分類の場合
Rasterlay.Renderer = RasterRen;
ArcMap.Document.ActiveView.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGeography, Rasterlay, null);
ArcMap.Document.UpdateContents();
Dim Rasterlay As IRasterLayer
Rasterlay = My.ArcMap.Document.FocusMap.Layer(0)
Dim RDataset As IRasterDataset = CType(Rasterlay.Raster, IRasterAnalysisProps).RasterDataset
Dim RasterRen As IRasterRenderer = StretchRenderer(RDataset) 'ストレッチの場合
Dim RasterRen As IRasterRenderer = RGBRenderer(RDataset)    'RGBの場合
'Dim RasterRen As IRasterRenderer = UnqueValueRenderer(RDataset)'個別値の場合
'Dim RasterRen As IRasterRenderer = ClassifyRenderer(RDataset) '分類の場合
Rasterlay.Renderer = RasterRen
My.ArcMap.Document.ActiveView.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGeography, Rasterlay, Nothing)
My.ArcMap.Document.UpdateContents()

メタデータ

機能

種類

製品