FAQ
ArcObjects における数値分類 レンダラーでの表示
ナレッジ番号:2683 | 登録日:2023/05/29 | 更新日:2024/12/02
概要
このサンプル コードでは、数値分類 レンダラーを作成しフィーチャ レイヤーに割り当てる方法を紹介します。
数値分類を行う時の注意点
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 にしています。
C# 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687IFeatureLayer 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;
}
Visual Basic 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980Dim
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 の場合)
C# 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687private
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;
}
参考情報
メタデータ
種類
機能
製品