如题,如果给定一个地图模板,里面包含设置好的渲染方式,现在要做的是用新的数据替换旧的模板中对应的数据,并让新数据根据模板中的渲染方式渲染,
经测试,只是把旧数据替换为新数据是不能实现此需求的,举个例子:模板中的数据最大为100,最小为0,分五级的话最大一级为80-100,但是新的数据最大为200,最小为0 ,如果分五级的话最大一级应该是160-200,但是现在存在的问题是图层替换成新的数据了,但是地图上的分级没有更新,没有根据新数据的最大最小分级,所以单纯替换数据是不行的,在此想出的办法是,得到模板中数据的渲染方式比如:颜色、分级级数、分级字段,然后用新的数据重新分级,具体代码如下:
/// <summary>
/// 图层渲染
/// </summary>
/// <param name="oldLayerList">地图模板中的图层(在此规定模板中第一个图层就是分级设色的图层)</param>
private void LayerRender(List<ILayer> oldLayerList)
{
try
{
if (oldLayerList.Count > 0)
{
//得到旧图层的渲染方式
IFeatureLayer pFeatureLayer = oldLayerList[0] as IFeatureLayer;
IGeoFeatureLayer pGeoFeatureLayer = pFeatureLayer as IGeoFeatureLayer;
IClassBreaksRenderer classRender = pGeoFeatureLayer.Renderer as IClassBreaksRenderer;
//设置新的渲染方式的分级为旧渲染方式的级数
int desiredClasses = classRender.BreakCount;
//设置新的渲染方式的字段为旧渲染方式的字段
string fieldName = classRender.Field;
int classesCount;
double[] classes;
object dataFrequency;
object dataValues;
ITable pTable;
EqualIntervalClass pClassify;
ITableHistogram pTableHistogram = new BasicTableHistogramClass() as ITableHistogram;
IBasicHistogram pHistogram;
IClassBreaksRenderer pClassBreaksRenderer;
pTable = (ITable)pGeoFeatureLayer;
pHistogram = (IBasicHistogram)pTableHistogram;
//渲染字段的名称
pTableHistogram.Field = fieldName;
pTableHistogram.Table = pTable;
pHistogram.GetHistogram(out dataValues, out dataFrequency);
pClassify = new EqualIntervalClass();
pClassify.SetHistogramData(dataValues, dataFrequency);
//渲染字段的级数
pClassify.Classify(dataValues, dataFrequency, ref desiredClasses);
classes = (double[])pClassify.ClassBreaks;
classesCount = classes.Length;
//创建新渲染方式,设置字段和级数为旧渲染的字段和级数
pClassBreaksRenderer = new ClassBreaksRendererClass();
pClassBreaksRenderer.Field = fieldName;
pClassBreaksRenderer.BreakCount = desiredClasses;
//不能改为true,否则颜色会是反的
pClassBreaksRenderer.SortClassesAscending = false;
string strOutput = String.Empty;
double LeftLable = 0;
double RightLable = 0;
for (int index = 0; index < classesCount - 1; index++)
{
//设置新渲染的符号(颜色)为旧渲染的符号(颜色)
pClassBreaksRenderer.set_Symbol(index, classRender.get_Symbol(index));
//设置分级
pClassBreaksRenderer.set_Break(index, classes[index + 1]);
//设置分级lable
LeftLable = classes[classesCount - 2 - index];
RightLable = classes[classesCount - 1 - index];
strOutput = String.Format("{0}-{1}", LeftLable.ToString("0"), RightLable.ToString("0"));
//代码位置不能提前,否则lable显示这句不起作用
pClassBreaksRenderer.set_Label(index, strOutput);
}
pGeoFeatureLayer.Renderer = (IFeatureRenderer)pClassBreaksRenderer;
pActiveView.ContentsChanged();
pActiveView.Refresh();
}
}
catch (Exception)
{
return;
}
}
此文参考了http://blog.csdn.net/sophiasy/article/details/6067949博文,在此感谢!