|
阅读:1373回复:0
ArcEngine 渲染的使用
1.Feature的基本渲染方法<BR> Feature的常用的绘制方法包括:<BR> 1.简单绘制<BR> 2.唯一值绘制/多字段唯一值绘制<BR> 3.点密度/多字段点密度绘制<BR> 4.数据分级绘制<BR> 5.质量图(饼图/直方图)<BR> 6.按比例尺渲染<BR> 7.比例符号渲染<BR> <BR> 1.简单渲染 <BR> 简单渲染是ArcEngine的默认渲染,我们打开一个FeatureClass,建立一个FeatureLayer的时候,<BR>如果没有给FeatureLayer设置Renderer那么使用的就是简单渲染。简单渲染对整个图层中的所有Feature<BR>使用同一种方式显示。<BR>简单渲染在ArcEngine中用ISimpleRenderer来表示。<BR> ISimpleRenderer的使用方式如下: <BR> //假设layer是一个IFeatureLayer,获取IGeoFeatureLayer<BR> IGeoFeatureLayer geoLayer=layer as IGeoFeatureLayer;<BR> //构造SimpleRenderer<BR> ISimpleRenderer renderer=new SimpleRendererClass();<BR> renderer.deion="简单的渲染一下";<BR> renderer.Label="符号的标签";<BR> //假设sym是一个和该图层中Geometry类型对应的符号;<BR> renderer.Symbol=sym;<BR> //为图层设置渲染,注意需要刷新该图层。<BR> geoLayer.Renderer=renderer;<BR> 2.独立值/多字段独立值渲染<BR> 独立值/多字段独立值渲染,根据Feature的某一个字段的数据或某几个字段的组合结果来确定符号。<BR> 具有相同值或相同组合值的Feature,使用一样的符号。在使用多个字段的使用,每个字段的取值之间<BR> 使用分割符来连接。字段的取值顺序和在Renderer中设置的一样。<BR> 基本使用方式如下:<BR> //假设layer是一个IFeatureLayer,获取IGeoFeatureLayer<BR> IGeoFeatureLayer geoLayer=layer as IGeoFeatureLayer;<BR> //构造一个UniqueValueRenderer <BR> IUniqueValueRenderer renderer=new UniqueValueRendererClass();<BR> //假设使用两个字段来渲染<BR> renderer.FieldCount=2;<BR> //假设YSLX字段表示要素类型<BR> //假设YSYT字段表示要数用途<BR> renderer.set_Field(0,"YSLX");<BR> renderer.set_Field(1,"YSYT");<BR> //字段之间使用 | 来连接(默认取值)<BR> renderer.FieldDelimiter="|";<BR> //设置默认符号<BR> renderer.DefaultSymbol=defaultSymbol;<BR> renderer.DefaultLabel="默认Label";<BR> //添加值<BR> renderer.addValue("房屋|民居","民居房屋",MJSymbol);<BR> renderer.addValue("房屋|商业用地","商业用地",SYSymbol);<BR> ...<BR> //还可以通过set_Symbol,set_Heading、set_Value来修改上述设置。<BR> geoLayer.Renderer=renderer.<BR> 3.点密度/多字段点密度<BR> 点密度图通过在Feature的图形上打点来表示数据的数多,点越密集表示数据量越大。<BR> 还可以使用多字段的点密度图。这个使用同一个Feature上就可以显示几种不同的点。<BR> 注意点密度图有一个特殊的地方:<BR> 点密度图使用的符号是面状符号。而其中有需要包括点状符号。<BR> 接口使用如下:<BR> IDotDensityRenderer renderer=new DotDensityRendererClass ();<BR> IRendererFields flds=(IRendererFields)renderer;<BR> flds.AddField("MJ ","面积");<BR> flds.AddField("RK","人口");<BR> IDotDensityFillSymbol ddSym=new DotDensityFillSymbolClass();<BR> ISymbolArray symArray=(ISymbolArray)ddSym;<BR> symArray.AddSymbol(mjSymbol);<BR> symArray.AddSymbol(rkSymbol);<BR> ddSym.Outline =(ILineSymbol)outlineSymbol ; <BR> ddSym.DotSize =10 ;<BR> ddSym.FixedPlacement=true; <BR> <BR> renderer.DotDensitySymbol =ddSym;<BR> renderer.DotValue=20 ;<BR> renderer.MaintainSize=this.m_dotdensityParam .MaintainSize ;<BR> IGeoFeatureLayer geoLayer=(IGeoFeatureLayer)layer ;<BR> geoLayer.Renderer =(IFeatureRenderer)renderer;<BR> 4.数据分级绘制(使用IClassBreaksRenderer)<BR> 5.饼图/直方图(使用IChartRenderer)<BR> 6.按比例尺渲染(使IScaleDependentRenderer)<BR> 7.比例符号渲染(使用 IProportionalSymbolRenderer )<BR>2.图例的使用<BR> 图例的使用通过ILegendInfo接口。每个Renderer都实现了该接口,但是有时候该实现不好用,<BR> 所以也可以自己实现该接口。实现过程是比较简单的。<BR>3.渲染层次<BR> 使用ILevelRender 接口。该接口可以指定一 当前的Level(-1)表示绘制全部。<BR> 然后 提供一个符号数组 ,注意每个符号要指定Level .如果不指定就默认为0。<BR><BR>4.透明度控制<BR> 透明度控制使用 ITransparencyRenderer 接口。该接口允许指定一个字段,字段取值用来表示透明度<BR> 注意 透明度的取值在0--100之间。<BR>5.数据正规化<BR> 数据正规化用 IDataNormalization 接口来表示。该接口提供了几种正规化表示方法。<BR>6.部分渲染<BR> 部分渲染通过使用IDataExclusion 来实现。该接口允许提供过滤语句来过滤掉不需要渲染的Feature。<BR> 同时也可以给他们制定特殊的符号。同时控制是否显示<BR>7.旋转控制<BR> 旋转控制通过使用IRotationRenderer 接口来表示。该接口要求提供旋转角度的字段。同时要求提供旋转的<BR> 方法。<BR>8.数据样本<BR> IDataSampling 没有使用过。<BR>9.外表关联<BR> ITable dispTable=((IDisplayTable)feaLayer).DisplayTable ;//图层<BR> ITable attTable;//外表<BR> IMemoryRelationshipClassFactory fac=new MemoryRelationshipClassFactoryClass ();<BR> IRelationshipClass relClass=fac.Open("JZMJ",(IObjectClass)dispTable,"ZDDJH",<BR> IObjectClass)attTable,"G03",<BR> "Forward","Backward",<BR> esriRelCardinality.esriRelCardinalityOneToOne);<BR> IDisplayRelationshipClass dispRelClass=feaLayer as IDisplayRelationshipClass ;<BR> dispRelClass.DisplayRelationshipClass(relClass,esriJoinType.esriLeftInnerJoin);<BR>10.统计分析<BR> ITableHistogram tableHistogram=new BasicTableHistogramClass ();<BR> tableHistogram.Table =((IDisplayTable)layer).DisplayTable ;<BR> tableHistogram.Field =fieldName ;<BR> object valueArray=null, freq=null;<BR> IBasicHistogram basicHistogram=(IBasicHistogram)tableHistogram;<BR> basicHistogram.GetHistogram(out valueArray,out freq);<BR> IClassify classify=null;<BR> int breakNum=6;<BR> //分类方法<BR> switch(ClassifyMethod )<BR> {<BR> case ClassifyMethodName.lsClassifyMethodEqualInterval:<BR> {<BR> <BR> EqualIntervalClass eq=new EqualIntervalClass ();<BR> eq.Classify (valueArray,freq,ref breakNum);<BR> classify=(IClassify)eq;<BR> <BR> break;<BR> }<BR> case ClassifyMethodName.lsClassifyMethodStandardDeviation:<BR> {<BR> <BR> StandardDeviationClass sd=new StandardDeviationClass ();<BR> IStatisticsResults stat= histogram as IStatisticsResults ;<BR> classify=sd as IClassify;<BR> classify.SetHistogramData (valueArray,freq);<BR> IDeviationInterval di=sd as IDeviationInterval ;<BR> di.DeviationInterval=1;<BR> di.Mean=stat.Mean;<BR> di.StandardDev=stat.StandardDeviation;<BR> classify.Classify (ref breakNum);<BR> <BR> break;<BR> }<BR> case ClassifyMethodName.lsClassifyMethodQuantile:<BR> {<BR> <BR> Quantile qc=new QuantileClass ();<BR> qc.Classify (valueArray,freq,ref breakNum);<BR> classify=qc as IClassify ;<BR> <BR> break;<BR> }<BR> case ClassifyMethodName.lsClassifyMethodNaturalBreaks:<BR> {<BR> <BR> NaturalBreaksClass nb=new NaturalBreaksClass ();<BR> nb.Classify (valueArray,freq,ref breakNum);<BR> classify=nb as IClassify ;<BR> <BR> break;<BR> }<BR> case ClassifyMethodName.lsClassifyMethodDefinedInterval:<BR> {<BR> DefinedIntervalClass di=new DefinedIntervalClass ();<BR> di.IntervalRange =this.m_classBreaksParam .Interval ;<BR> di.Classify (valueArray,freq,ref breakNum);<BR> classify=di as IClassify ;<BR> break;<BR> }<BR> default:<BR> {<BR> <BR> EqualIntervalClass eq=new EqualIntervalClass ();<BR> eq.Classify (valueArray,freq,ref breakNum);<BR> classify=(IClassify)eq;<BR> break;<BR> <BR> }<BR> } <BR> object o=classify.ClassBreaks ;<BR> System.Array breakArray= o as System.Array;<BR> 现在breakArray中就是统计后的数据了。<BR><BR>
|
|
|