FAQ
ArcObjects での個別値レンダラーでの表示

ナレッジ番号:5269 | 登録日:2023/07/26 | 更新日:2023/12/28

概要

個別値レンダラーは、指定フィールドの個々の値ごとにシンボルを割り当てて表示するためのものです。このサンプル コードでは、個別値分類のレンダラーを作成する方法を紹介します。

ImageImage

サンプル コード

個別値分類のレンダラーで描画

以下のコードは、引数で与えたフィールドの値をもとに個別値分類を設定する方法を説明したものです。個別値を表示するために、塗りつぶしシンボルで利用するカラー ランプを定義しています。このサンプル コードではポリゴン  フィーチャクラスを塗りつぶしシンボルで描画するために書かれていますが、ポイント用のマーカー シンボルやポリライン用のライン シンボルを生成するように変更することができます。

static void DefineUniqueValueRenderer(IGeoFeatureLayer pGeoFeatureLayer, string fieldName)
{
    IRandomColorRamp pRandomColorRamp = new RandomColorRampClass();
    //レンダラーのシンボルのためのカラー ランプを作成する。
    pRandomColorRamp.MinSaturation = 20;
    pRandomColorRamp.MaxSaturation = 40;
    pRandomColorRamp.MinValue = 85;
    pRandomColorRamp.MaxValue = 100;
    pRandomColorRamp.StartHue = 76;
    pRandomColorRamp.EndHue = 188;
    pRandomColorRamp.UseSeed = true;
    pRandomColorRamp.Seed = 43;

    //レンダラーを作成する。
    IUniqueValueRenderer pUniqueValueRenderer = new UniqueValueRendererClass();

    ISimpleFillSymbol pSimpleFillSymbol = new SimpleFillSymbolClass();
    pSimpleFillSymbol.Style = esriSimpleFillStyle.esriSFSSolid;
    pSimpleFillSymbol.Outline.Width = 0.4;

    //これらのプロパティは値を追加する前に設定される。
    pUniqueValueRenderer.FieldCount = 1;
    pUniqueValueRenderer.set_Field(0, fieldName);
    pUniqueValueRenderer.DefaultSymbol = pSimpleFillSymbol as ISymbol;
    pUniqueValueRenderer.UseDefaultSymbol = true;

    IDisplayTable pDisplayTable = pGeoFeatureLayer as IDisplayTable;
    IFeatureCursor pFeatureCursor = pDisplayTable.SearchDisplayTable(null, false) as
    IFeatureCursor;
    IFeature pFeature = pFeatureCursor.NextFeature();

    bool pValFound;
    int pFieldIndex;

    IFields pFields = pFeatureCursor.Fields;
    pFieldIndex = pFields.FindField(fieldName);
    while (pFeature != null)
    {
        ISimpleFillSymbol pClassSymbol = new SimpleFillSymbolClass();
        pClassSymbol.Style = esriSimpleFillStyle.esriSFSSolid;
        pClassSymbol.Outline.Width = 0.4;

        string pClassValue;
        pClassValue = pFeature.get_Value(pFieldIndex).ToString();

        //この値がレンダラーに追加されているかどうか検査する。もし追加されていないなら、追加する。
        pValFound = false;
        for (int i = 0; i <= pUniqueValueRenderer.ValueCount - 1; i++)
        {
            if (pUniqueValueRenderer.get_Value(i) == pClassValue)
            {
                pValFound = true;
                break; //値が見つからなければループを抜ける   }
            }
            //もしその値が見つからなければ、新規の値なので追加する。
            if (pValFound == false)
            {
                pUniqueValueRenderer.AddValue(pClassValue, fieldName, pClassSymbol as ISymbol);
                pUniqueValueRenderer.set_Label(pClassValue, pClassValue);
                pUniqueValueRenderer.set_Symbol(pClassValue, pClassSymbol as ISymbol);
            }
            pFeature = pFeatureCursor.NextFeature();
        }
        //個別値の個数をもとに、カラー ランプのサイズを決定し、カラーを割り当てる。
        pRandomColorRamp.Size = pUniqueValueRenderer.ValueCount;
        bool bOK;
        pRandomColorRamp.CreateRamp(out bOK);

        IEnumColors pEnumColors = pRandomColorRamp.Colors;
        pEnumColors.Reset();
        for (int j = 0; j <= pUniqueValueRenderer.ValueCount - 1; j++)
        {
            string xv;
            xv = pUniqueValueRenderer.get_Value(j);
            if (xv != "")
            {
                ISimpleFillSymbol pSimpleFillColor = pUniqueValueRenderer.get_Symbol(xv) as ISimpleFillSymbol;
                pSimpleFillColor.Color = pEnumColors.Next();
                pUniqueValueRenderer.set_Symbol(xv, pSimpleFillColor as ISymbol);

            }
        }

        //** もしスタイルとして定義済みカラー ランプを使用しないならば、ここでは "Custom" を使用する。
        //** そうでない場合、選択したカラー ランプ名を使用する。
        pUniqueValueRenderer.ColorScheme = "Custom";
        ITable pTable = pDisplayTable as ITable;
        bool isString = pTable.Fields.get_Field(pFieldIndex).Type ==
        esriFieldType.esriFieldTypeString;
        pUniqueValueRenderer.set_FieldType(0, isString);
        pGeoFeatureLayer.Renderer = pUniqueValueRenderer as IFeatureRenderer;

        IMxDocument pmxdoc = ArcMap.Application.Document as IMxDocument;
        pmxdoc.UpdateContents();

        IActiveView av = pmxdoc.FocusMap as IActiveView;
        av.Refresh();
    }
}
Shared Sub DefineUniqueValueRenderer(ByVal pGeoFeatureLayer As IGeoFeatureLayer, ByVal fieldName As String)
    Dim pRandomColorRamp As IRandomColorRamp = New RandomColorRampClass()
    'レンダラーのシンボルのためのカラー ランプを作成する。
    pRandomColorRamp.MinSaturation = 20
    pRandomColorRamp.MaxSaturation = 40
    pRandomColorRamp.MinValue = 85
    pRandomColorRamp.MaxValue = 100
    pRandomColorRamp.StartHue = 76
    pRandomColorRamp.EndHue = 188
    pRandomColorRamp.UseSeed = True
    pRandomColorRamp.Seed = 43

    'レンダラーを作成する。
    Dim pUniqueValueRenderer As IUniqueValueRenderer = New UniqueValueRendererClass()

    Dim pSimpleFillSymbol As ISimpleFillSymbol = New SimpleFillSymbolClass()
    pSimpleFillSymbol.Style = esriSimpleFillStyle.esriSFSSolid
    pSimpleFillSymbol.Outline.Width = 0.4

    'これらのプロパティは値を追加する前に設定される。
    pUniqueValueRenderer.FieldCount = 1
    pUniqueValueRenderer.Field(0) = fieldName
    pUniqueValueRenderer.DefaultSymbol = pSimpleFillSymbol
    pUniqueValueRenderer.UseDefaultSymbol = True

    Dim pDisplayTable As IDisplayTable = pGeoFeatureLayer
    Dim pFeatureCursor As IFeatureCursor = pDisplayTable.SearchDisplayTable(Nothing, False)
    Dim pFeature As IFeature = pFeatureCursor.NextFeature()
    Dim pValFound As Boolean
    Dim pFieldIndex As Integer

    Dim pFields As IFields = pFeatureCursor.Fields
    pFieldIndex = pFields.FindField(fieldName)
    Dim pClassValue As String

    While Not pFeature Is Nothing
        Dim pClassSymbol As ISimpleFillSymbol = New SimpleFillSymbolClass()
        pClassSymbol.Style = esriSimpleFillStyle.esriSFSSolid
        pClassSymbol.Outline.Width = 0.4

        pClassValue = pFeature.Value(pFieldIndex)

        'この値がレンダラーに追加されているかどうか検査する。もし追加されていないなら、追加する。
        pValFound = False
        Dim i As Integer
        For i = 0 To pUniqueValueRenderer.ValueCount - 1 Step i + 1
            If pUniqueValueRenderer.Value(i) = pClassValue Then
                pValFound = True
                Exit For 'Exit the loop if the value is found.
            End If
        Next
        'もしその値が見つからなければ、新規の値なので追加する。
        If pValFound = False Then
            pUniqueValueRenderer.AddValue(pClassValue, fieldName, pClassSymbol)
            pUniqueValueRenderer.Label(pClassValue) = pClassValue
            pUniqueValueRenderer.Symbol(pClassValue) = pClassSymbol
        End If
        pFeature = pFeatureCursor.NextFeature()
    End While

    '個別値の個数がわかっているので、カラー ランプの大きさを決めてカラーを割り当てる。

    pRandomColorRamp.Size = pUniqueValueRenderer.ValueCount
    Dim bOK As Boolean
    pRandomColorRamp.CreateRamp(bOK)

    Dim pEnumColors As IEnumColors = pRandomColorRamp.Colors
    pEnumColors.Reset()

    Dim j As Integer
    Dim xv As String
    For j = 0 To pUniqueValueRenderer.ValueCount - 1 Step j + 1
        xv = pUniqueValueRenderer.Value(j)
        If xv <> "" Then
            Dim pSimpleFillColor As ISimpleFillSymbol = pUniqueValueRenderer.Symbol(xv)
            pSimpleFillColor.Color = pEnumColors.Next()
            pUniqueValueRenderer.Symbol(xv) = pSimpleFillColor
        End If
    Next

    '** もしスタイルとして定義済みカラー ランプを使用しないならば、ここでは "Custom" を使用する。
    '** そうでない場合、選択したカラー ランプ名を使用する。

    pUniqueValueRenderer.ColorScheme = "Custom"
    Dim pTable As ITable = pDisplayTable
    Dim isString As Boolean = pTable.Fields.Field(pFieldIndex).Type = esriFieldType.esriFieldTypeString
    pUniqueValueRenderer.FieldType(0) = isString
    pGeoFeatureLayer.Renderer = pUniqueValueRenderer

    CType(My.ArcMap.Document, IMxDocument).UpdateContents()
    CType(My.ArcMap.Document.FocusMap, IActiveView).Refresh()
End Sub

メタデータ

種類

製品