FAQ
ArcObjects における数値分類 レンダラーでの表示

ナレッジ番号:2683 | 登録日:2023/05/29 | 更新日:2024/11/21

概要

このサンプル コードでは、数値分類 レンダラーを作成しフィーチャ レイヤーに割り当てる方法を紹介します。

ImageImage

数値分類を行う時の注意点

ClassBreaksRenderer を使用するには、まずクラス数をいくつにするのか定める必要があります。これは任意に決定することもできますが、使用するデータと選択した分類方法から、与えたクラス数をもとに、実際に適用されるクラス数が定まる場合もあります。

クラスを区切る数値は BreakCount を使用して指定します。一度 BreakCount が設定されると、Break、Description、 Label シンボル配列のプロパティが最少のインデックス 0、最大インデックス BreakCount -1 で初期化されます。

次のステップは、クラスの区切り値として参照される、Break の値を設定することです。この値はクラスを定義します。

例えば、気温データを 10度ごとの 10クラスに分類するというように任意に区切り値を指定したり、使用するデータに特定のクラス分類アルゴリズム(例えば自然分類、等量分類、等間隔等)を適用し、アルゴリズムによって生成された区切りを使用することもあります。例としては、TableHistogram のようなヒストグラム オブジェクトを使用して自然分類を行う場合です。

さらに詳しい情報については IClassifyGEN をご覧ください。区切りを決定したら、区切り値の入った配列を使用してレンダリングに割り当てます。

データの中の、シンボル化する最小値に MinimumBreak を設定し、 Break(i) でクラスの中の最大値を表現します。Break(i) と同じか小さいが Break(i-1) より大きい値は Symbol(i) で描かれます。さらに詳しい情報については Break と Symbol の項を参照してください。

サンプル コード

数値分類のレンダラーを作成

現在アクティブになっているマップの一番上のレイヤーに対し、数値分類のレンダラーを適用するサンプルです。この例では、レンダリングの対象となるフィールドは、"T05"、分類のクラス数は 5 にしています。

    IFeatureLayer pFeatureLayer = ArcMap.Document.FocusMap.get_Layer(0) as IFeatureLayer;
    IFeatureRenderer pFeatureRenderer;
    pFeatureRenderer = MakeClassbraksRenderer(pFeatureLayer, "T05", 5) as IFeatureRenderer;
    //"T05" はレンダリングするフィールド名(エイリアスではない)
    // 5 はクラス数
    IGeoFeatureLayer pGeoFeatureLayer = pFeatureLayer as IGeoFeatureLayer;
    pGeoFeatureLayer.Renderer = pFeatureRenderer;
    ArcMap.Document.ActiveView.Refresh();
    ArcMap.Document.UpdateContents();

public IClassBreaksRenderer MakeClassbraksRenderer(IFeatureLayer pFLayer, string aname,  int aclass) {

    IClassBreaksRenderer pRender  = new ClassBreaksRendererClass();
    ITable pTable;
    IGeoFeatureLayer pGeoLayer;
    IClassifyGEN pClassifyGEN;
    ITableHistogram pTableHistogram;
    bool ok;

    IHistogram pHistogram;
    object frqs;
    object xVals;
    //double[] cb;
    object cb;

    IAlgorithmicColorRamp pColorRamp;
    IEnumColors pEnumColors;
    IRgbColor pColor1;
    IRgbColor pColor2;
     //int i;
    IClassBreaksUIProperties pUIProperties;
    ISimpleFillSymbol pSimpleFillSym;
 
    pTable = pFLayer.FeatureClass as ITable;
    pGeoLayer = pFLayer as IGeoFeatureLayer;
    pClassifyGEN = new NaturalBreaksClass();
    pTableHistogram = new TableHistogramClass();
    pHistogram = pTableHistogram as IHistogram;

    pTableHistogram.Field = aname;      //レンダリングするフィールド
    pTableHistogram.Table = pTable;
    pHistogram.GetHistogram(out xVals, out frqs);
    pClassifyGEN.Classify (xVals, frqs, aclass );
      
    //aclass に設定されたクラス数で分類する
    //pRender = New ClassBreaksRenderer
    cb = pClassifyGEN.ClassBreaks;

    pRender.Field = aname;
    pRender.BreakCount = aclass;
    pRender.MinimumBreak = ((double[])cb)[0];
    // minimum break は最小の閾値ではなく、データセットにおける実際の最小の値、最小値

    // カラーランプの作成
    pColorRamp = new AlgorithmicColorRampClass();
    pColorRamp.Algorithm = esriColorRampAlgorithm.esriCIELabAlgorithm;
            
    pColor1 = new RgbColorClass();
    pColor2 = new RgbColorClass();

    pColor1.Red = 0;
    pColor1.Green = 0;
    pColor1.Blue = 0;
    pColor2.Red = 225;
    pColor2.Green = 0;
    pColor2.Blue = 0;

    pColorRamp.FromColor = pColor1;
    pColorRamp.ToColor = pColor2;
    pColorRamp.Size = aclass;
    pColorRamp.CreateRamp(out ok);
    pEnumColors = pColorRamp.Colors;
    pEnumColors.Reset();

    pUIProperties = pRender as IClassBreaksUIProperties;
    pUIProperties.ColorRamp = "Custom";
    pSimpleFillSym = new SimpleFillSymbolClass();
  
    for (int j = 0; j <= aclass -1; j++) {
         pRender.set_Break(j,((double[])cb)[j + 1]);
         pRender.set_Label(j, ((double[])cb)[j] + " - " + ((double[])cb)[j + 1]);
         pUIProperties.set_LowBreak(j, ((double[])cb)[j]);
         pSimpleFillSym.Color = pEnumColors.Next();
         pRender.set_Symbol(j,(ISymbol)pSimpleFillSym);
   }
   return pRender;
}
    Dim pFeatureLayer As IFeatureLayer
    pFeatureLayer = My.ArcMap.Document.FocusMap.Layer(0)
    Dim pFeatureRenderer As IFeatureRenderer
    pFeatureRenderer = MakeClassbraksRenderer(pFeatureLayer, "T05", 5)
    '"T05" はレンダリングするフィールド名(エイリアスではない)
    '5 はクラス数
    Dim pGeoFeatureLayer As IGeoFeatureLayer = CType(pFeatureLayer, IGeoFeatureLayer)
    pGeoFeatureLayer.Renderer = pFeatureRenderer
    My.ArcMap.Document.ActiveView.Refresh()
    My.ArcMap.Document.UpdateContents()

Public Function MakeClassbraksRenderer(pFLayer As IFeatureLayer, aname As String, aclass As Long) As IClassBreaksRenderer
    Dim pRender As IClassBreaksRenderer = New ClassBreaksRendererClass()
    Dim pTable As ITable
    Dim pGeoLayer As IGeoFeatureLayer
    Dim pClassifyGEN As IClassifyGEN
    Dim pTableHistogram As ITableHistogram
    Dim pHistogram As IHistogram
    Dim frqs As Object, xVals As Object
    Dim cb As Object
    Dim pColorRamp As IAlgorithmicColorRamp, pEnumColors As IEnumColors
    Dim pColor1 As IRgbColor
    Dim pColor2 As IRgbColor
    Dim i As Integer
    Dim pUIProperties As IClassBreaksUIProperties
    Dim pSimpleFillSym As ISimpleFillSymbol

    pTable = pFLayer.FeatureClass
    pGeoLayer = pFLayer
    pClassifyGEN = New NaturalBreaks

    pTableHistogram = New TableHistogram
    pHistogram = pTableHistogram

    pTableHistogram.Field = aname      'レンダリングするフィールド
    pTableHistogram.Table = pTable

    pHistogram.GetHistogram(xVals, frqs)
    pClassifyGEN.Classify(xVals, frqs, aclass)      'aclass に設定されたクラス数で分類する

    'pRender = New ClassBreaksRenderer
    cb = pClassifyGEN.ClassBreaks

    pRender.Field = aname
    pRender.BreakCount = aclass
    pRender.MinimumBreak = cb(0)
    'minimum break は最初の区切りではなく、データセットにおける実際の最小の値、最小値です。

    'カラーランプの作成
    pColorRamp = New AlgorithmicColorRamp
    pColorRamp.Algorithm = esriColorRampAlgorithm.esriCIELabAlgorithm
    pColor1 = New RgbColor
    pColor2 = New RgbColor
    pColor1.Red = 0
    pColor1.Green = 0
    pColor1.Blue = 0

    pColor2.Red = 225
    pColor2.Green = 0
    pColor2.Blue = 0
    pColorRamp.FromColor = pColor1
    pColorRamp.ToColor = pColor2
    pColorRamp.size = aclass
    pColorRamp.CreateRamp(True)
    pEnumColors = pColorRamp.Colors
    pEnumColors.Reset()

     pUIProperties = pRender
     pUIProperties.ColorRamp = "Custom"

     For i = 0 To aclass - 1
         pRender.Break(i) = cb(i + 1)
         pRender.Label(i) = cb(i) & " - " & cb(i + 1)
         pUIProperties.LowBreak(i) = cb(i)
         pSimpleFillSym = New SimpleFillSymbol
         pSimpleFillSym.Color = pEnumColors.Next
         pRender.Symbol(i) = pSimpleFillSym
    Next i
    MakeClassbraksRenderer = pRender
End Function

数値分類のレンダラーを作成 (ArcGIS Engine の場合)

private void setClassBreakToolStripMenuItem_Click(object sender, EventArgs e)
{
    axMapControl1.AddShapeFile(@"C:\gis_work\out", "shape.shp");
    IFeatureLayer pFeatureLayer = axMapControl1.get_Layer(0) as IFeatureLayer;
    IFeatureRenderer pFeatureRenderer;
    pFeatureRenderer = MakeClassbreaksRenderer(pFeatureLayer, "P_NUM", 10) as IFeatureRenderer;
    IGeoFeatureLayer pGeoFeatureLayer = pFeatureLayer as IGeoFeatureLayer;
    pGeoFeatureLayer.Renderer = pFeatureRenderer;
    axMapControl1.ActiveView.Refresh();
    axTOCControl1.Update();
}

public IClassBreaksRenderer MakeClassbreaksRenderer(IFeatureLayer pFLayer, string aname, int aclass)
{
    IClassBreaksRenderer pRender = new ClassBreaksRendererClass();
    ITable pTable;
    IGeoFeatureLayer pGeoLayer;
    IClassifyGEN pClassifyGEN;
    bool ok;

    IBasicHistogram pHistogram;
    object frqs;
    object xVals;
    object cb;

    IAlgorithmicColorRamp pColorRamp;
    IEnumColors pEnumColors;
    IRgbColor pColor1;
    IRgbColor pColor2;
    IClassBreaksUIProperties pUIProperties;
    ISimpleFillSymbol pSimpleFillSym;

    pTable = pFLayer.FeatureClass as ITable;
    pGeoLayer = pFLayer as IGeoFeatureLayer;
    pClassifyGEN = new NaturalBreaksClass();
    pHistogram = new BasicTableHistogramClass();
    ITableHistogram pTableHistogram = (ITableHistogram)pHistogram;

    pTableHistogram.Field = aname;      //レンダリングするフィールド
    pTableHistogram.Table = pTable;
    pHistogram.GetHistogram(out xVals, out frqs);
    pClassifyGEN.Classify(xVals, frqs, aclass);

    //aclass に設定されたクラス数で分類する
    //pRender = New ClassBreaksRenderer
    cb = pClassifyGEN.ClassBreaks;

    pRender.Field = aname;
    pRender.BreakCount = aclass;
    pRender.MinimumBreak = ((double[])cb)[0];
    // minimum break は最小の閾値ではなく、データセットにおける実際の最小の値、最小値

    // カラーランプの作成
    pColorRamp = new AlgorithmicColorRampClass();
    pColorRamp.Algorithm = esriColorRampAlgorithm.esriCIELabAlgorithm;

    pColor1 = new RgbColorClass();
    pColor2 = new RgbColorClass();

    pColor1.Red = 0;
    pColor1.Green = 0;
    pColor1.Blue = 0;
    pColor2.Red = 225;
    pColor2.Green = 0;
    pColor2.Blue = 0;

    pColorRamp.FromColor = pColor1;
    pColorRamp.ToColor = pColor2;
    pColorRamp.Size = aclass;
    pColorRamp.CreateRamp(out ok);
    pEnumColors = pColorRamp.Colors;
    pEnumColors.Reset();

    pUIProperties = pRender as IClassBreaksUIProperties;
    pUIProperties.ColorRamp = "Custom";
    pSimpleFillSym = new SimpleFillSymbolClass();

    for (int j = 0; j <= aclass - 1; j++)
    {
        pRender.set_Break(j, ((double[])cb)[j + 1]);
        pRender.set_Label(j, ((double[])cb)[j] + " - " + ((double[])cb)[j + 1]);
        pUIProperties.set_LowBreak(j, ((double[])cb)[j]);
        pSimpleFillSym.Color = pEnumColors.Next();
        pRender.set_Symbol(j, (ISymbol)pSimpleFillSym);
    }
    return pRender;
}

参考情報

IClassBreaksRenderer Interface

メタデータ

機能

種類

製品