arcengine 的几种统计图绘制
http://blog.csdn.net/tianxinzhe032/article/details/6660028
//获取颜色对象
static public IRgbColor getRGB(int r, int g, int b)
{
IRgbColor pColor;
pColor = new RgbColorClass();
pColor.Red = r;
pColor.Green = g;
pColor.Blue = b;
return pColor;
}
static public IGeoFeatureLayer GetLevelMap(IGeoFeatureLayer geoFeatureLayer, string field, int classCount)
{
ITableHistogram tableHistogram;
IBasicHistogram basicHistogram;
ITable table;
ILayer layer = geoFeatureLayer as ILayer;
table = layer as ITable;
tableHistogram = new BasicTableHistogramClass();
//按照 数值字段分级
tableHistogram.Table = table;
tableHistogram.Field = field;
basicHistogram = tableHistogram as IBasicHistogram;
object values;
object frequencys;
//先统计每个值和各个值出现的次数
basicHistogram.GetHistogram(out values, out frequencys);
//创建平均分级对象
IClassifyGEN classifyGEN = new QuantileClass();
//用统计结果进行分级 ,级别数目为classCount
classifyGEN.Classify(values, frequencys, ref classCount);
//获得分级结果,是个 双精度类型数组
double[] classes;
classes = classifyGEN.ClassBreaks as double[];
IEnumColors enumColors = CreateAlgorithmicColorRamp(classes.Length).Colors;
IColor color;
IClassBreaksRenderer classBreaksRenderer = new ClassBreaksRendererClass();
classBreaksRenderer.Field = field;
classBreaksRenderer.BreakCount = classCount;
classBreaksRenderer.SortClassesAscending = true;
ISimpleFillSymbol simpleFillSymbol;
for (int i = 0; i < classes.Length - 1; i++)
{
color = enumColors.Next();
simpleFillSymbol = new SimpleFillSymbolClass();
simpleFillSymbol.Color = color;
simpleFillSymbol.Style = esriSimpleFillStyle.esriSFSSolid;
classBreaksRenderer.set_Symbol(i, simpleFillSymbol as ISymbol);
classBreaksRenderer.set_Break(i, classes[i + 1]);
//构造显示的文字
classBreaksRenderer.set_Label(i, classes[i].ToString() + "——" + classes[i + 1].ToString());
classBreaksRenderer.set_Description(i, "sfhskdfks");
//着色对象的断点
}
if (geoFeatureLayer != null)
{
geoFeatureLayer.Renderer = classBreaksRenderer as IFeatureRenderer;
}
return geoFeatureLayer;
}
static public IGeoFeatureLayer GetChartMap(IGeoFeatureLayer geofeatureLayer, List<string> fields, List<string> alias)
{
// IGeoFeatureLayer geofeatureLayer = Lib.Layer.getShpLayer(path, layerName) as IGeoFeatureLayer;
ITable table = geofeatureLayer as ITable;
geofeatureLayer.ScaleSymbols = true;
IChartRenderer chartRenderer = new ChartRendererClass();
IRendererFields rendererFields = chartRenderer as IRendererFields;
for (int i = 0; i < fields.Count; i++)
{
rendererFields.AddField(fields[i], alias[i]);
}
double maxValue = 0;
ICursor cursor = table.Search(null, true);
IRowBuffer rowBuffer = cursor.NextRow();
while (rowBuffer != null)
{
for (int i = 0; i < fields.Count; i++)
{
double fieldValue;
try
{
fieldValue = double.Parse(rowBuffer.get_Value(table.FindField(fields[i])).ToString());
}
catch (Exception ex)
{
fieldValue = 0;
}
maxValue = Math.Max(maxValue, fieldValue);
}
rowBuffer = cursor.NextRow();
}
IBarChartSymbol barChartSymbol = new BarChartSymbolClass();
barChartSymbol.Width = 5;
IMarkerSymbol markerSymbol = barChartSymbol as IMarkerSymbol;
markerSymbol.Size = 50;
IChartSymbol chartSymbol = barChartSymbol as IChartSymbol;
chartSymbol.MaxValue = maxValue;
//添加渲染符号
ISymbolArray symbolArray = barChartSymbol as ISymbolArray;
IFillSymbol fillSymbol;
IColorRamp colors = CreateRandomColorRamp(fields.Count);
for (int i = 0; i < fields.Count; i++)
{
fillSymbol = new SimpleFillSymbolClass();
fillSymbol.Color = colors.get_Color(i);
symbolArray.AddSymbol(fillSymbol as ISymbol);
}
//设置柱状图符号
chartRenderer.ChartSymbol = barChartSymbol as IChartSymbol;
fillSymbol = new SimpleFillSymbolClass();
fillSymbol.Color = getRGB(0, 255, 255);
fillSymbol.Color.Transparency = 2;
chartRenderer.BaseSymbol = fillSymbol as ISymbol;
chartRenderer.UseOverposter = false;
//创建图例
chartRenderer.CreateLegend();
geofeatureLayer.Renderer = chartRenderer as IFeatureRenderer;
return geofeatureLayer;
}
////生成颜色带
static public IColorRamp CreateAlgorithmicColorRamp(int count)
{
//IUniqueValueRenderer pUniqueValueR;
IEnumColors pEnumRamp;
AlgorithmicColorRamp pColorRamp;
//pUniqueValueR = new UniqueValueRendererClass();
//pUniqueValueR.FieldCount = 1;
//pUniqueValueR.set_Field(0, FielName);
pColorRamp = new AlgorithmicColorRampClass();
pColorRamp.FromColor = getRGB(255, 255, 255);
pColorRamp.ToColor = getRGB(32, 200, 150);
pColorRamp.Size = count;
bool ok = true;
pColorRamp.CreateRamp(out ok);
pEnumRamp = pColorRamp.Colors;
return pColorRamp;
}
//生成颜色带
static public IColorRamp CreateRandomColorRamp(int count)
{
//IUniqueValueRenderer pUniqueValueR;
IEnumColors pEnumRamp;
IRandomColorRamp pColorRamp;
//pUniqueValueR = new UniqueValueRendererClass();
//pUniqueValueR.FieldCount = 1;
//pUniqueValueR.set_Field(0, FielName);
pColorRamp = new RandomColorRampClass();
pColorRamp.StartHue = 0;
pColorRamp.MinValue = 99;
pColorRamp.MinSaturation = 15;
pColorRamp.EndHue = 360;
pColorRamp.MaxValue = 100;
pColorRamp.MaxSaturation = 30;
pColorRamp.Size = count * 2;
bool ok = true;
pColorRamp.CreateRamp(out ok);
pEnumRamp = pColorRamp.Colors;
return pColorRamp;
}
static public IGeoFeatureLayer GetSimpleSymbolLayer(IGeoFeatureLayer geoFeatureLayer, string field)
{
// getGeoLayer("sichuan_county_landuse");
IUniqueValueRenderer uniqueValueRenderer = new UniqueValueRendererClass();
uniqueValueRenderer.FieldCount = 1;
uniqueValueRenderer.set_Field(0, field);
//简单填充符号
ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass();
simpleFillSymbol.Style = esriSimpleFillStyle.esriSFSSolid;
int areaNum = geoFeatureLayer.FeatureClass.FeatureCount(null);
IFeatureCursor featureCursor = geoFeatureLayer.FeatureClass.Search(null, false);
IFeature feature;
if (featureCursor != null)
{
IEnumColors enumColors = CreateRandomColorRamp(areaNum).Colors;
int fieldIndex = geoFeatureLayer.FeatureClass.Fields.FindField(field);
feature = featureCursor.NextFeature();
while (feature != null)
{
string nameValue = feature.get_Value(fieldIndex).ToString();
simpleFillSymbol = new SimpleFillSymbolClass();
simpleFillSymbol.Color = enumColors.Next();
uniqueValueRenderer.AddValue(nameValue, field, simpleFillSymbol as ISymbol);
feature = featureCursor.NextFeature();
}
}
geoFeatureLayer.Renderer = uniqueValueRenderer as IFeatureRenderer;
return geoFeatureLayer;
}