1.Feature的基本渲染方法
?Feature的常用的繪制方法包括:
? 1.簡單繪制
? 2.唯一值繪制/多字段唯一值繪制
? 3.點(diǎn)密度/多字段點(diǎn)密度繪制
? 4.數(shù)據(jù)分級繪制
? 5.質(zhì)量圖(餅圖/直方圖)
? 6.按比例尺渲染
? 7.比例符號渲染
?
? 1.簡單渲染
? 簡單渲染是ArcEngine的默認(rèn)渲染,我們打開一個(gè)FeatureClass,建立一個(gè)FeatureLayer的時(shí)候,
如果沒有給FeatureLayer設(shè)置Renderer那么使用的就是簡單渲染。簡單渲染對整個(gè)圖層中的所有Feature
使用同一種方式顯示。
簡單渲染在ArcEngine中用ISimpleRenderer來表示。
?ISimpleRenderer的使用方式如下:
?//假設(shè)layer是一個(gè)IFeatureLayer,獲取IGeoFeatureLayer
? IGeoFeatureLayer geoLayer=layer as IGeoFeatureLayer;
? //構(gòu)造SimpleRenderer
? ISimpleRenderer renderer=new SimpleRendererClass();
? renderer.description="簡單的渲染一下";
? renderer.Label="符號的標(biāo)簽";
? //假設(shè)sym是一個(gè)和該圖層中Geometry類型對應(yīng)的符號;
? renderer.Symbol=sym;
? //為圖層設(shè)置渲染,注意需要刷新該圖層。
? geoLayer.Renderer=renderer;
? 2.獨(dú)立值/多字段獨(dú)立值渲染
? 獨(dú)立值/多字段獨(dú)立值渲染,根據(jù)Feature的某一個(gè)字段的數(shù)據(jù)或某幾個(gè)字段的組合結(jié)果來確定符號。
? 具有相同值或相同組合值的Feature,使用一樣的符號。在使用多個(gè)字段的使用,每個(gè)字段的取值之間
? 使用分割符來連接。字段的取值順序和在Renderer中設(shè)置的一樣。
? 基本使用方式如下:
? //假設(shè)layer是一個(gè)IFeatureLayer,獲取IGeoFeatureLayer
? IGeoFeatureLayer geoLayer=layer as IGeoFeatureLayer;
? //構(gòu)造一個(gè)UniqueValueRenderer
? IUniqueValueRenderer renderer=new UniqueValueRendererClass();
? //假設(shè)使用兩個(gè)字段來渲染
? renderer.FieldCount=2;
? //假設(shè)YSLX字段表示要素類型
? //假設(shè)YSYT字段表示要數(shù)用途
? renderer.set_Field(0,"YSLX");
? renderer.set_Field(1,"YSYT");
? //字段之間使用 | 來連接(默認(rèn)取值)
? renderer.FieldDelimiter="|";
? //設(shè)置默認(rèn)符號
? renderer.DefaultSymbol=defaultSymbol;
? renderer.DefaultLabel="默認(rèn)Label";
? //添加值
? renderer.addValue("房屋|民居","民居房屋",MJSymbol);
? renderer.addValue("房屋|商業(yè)用地","商業(yè)用地",SYSymbol);
? ...
? //還可以通過set_Symbol,set_Heading、set_Value來修改上述設(shè)置。
? geoLayer.Renderer=renderer.
? 3.點(diǎn)密度/多字段點(diǎn)密度
? 點(diǎn)密度圖通過在Feature的圖形上打點(diǎn)來表示數(shù)據(jù)的數(shù)多,點(diǎn)越密集表示數(shù)據(jù)量越大。
? 還可以使用多字段的點(diǎn)密度圖。這個(gè)使用同一個(gè)Feature上就可以顯示幾種不同的點(diǎn)。
? 注意點(diǎn)密度圖有一個(gè)特殊的地方:
??? 點(diǎn)密度圖使用的符號是面狀符號。而其中有需要包括點(diǎn)狀符號。
??? 接口使用如下:
??? ?IDotDensityRenderer renderer=new DotDensityRendererClass ();
???IRendererFields flds=(IRendererFields)renderer;
???flds.AddField("MJ ","面積");
???flds.AddField("RK","人口");
???IDotDensityFillSymbol ddSym=new DotDensityFillSymbolClass();
???ISymbolArray symArray=(ISymbolArray)ddSym;
???symArray.AddSymbol(mjSymbol);
???symArray.AddSymbol(rkSymbol);
???ddSym.Outline =(ILineSymbol)outlineSymbol ;???
???ddSym.DotSize =10 ;
???ddSym.FixedPlacement=true;???
???
???renderer.DotDensitySymbol =ddSym;
???renderer.DotValue=20 ;
???renderer.MaintainSize=this.m_dotdensityParam .MaintainSize ;
???IGeoFeatureLayer geoLayer=(IGeoFeatureLayer)layer ;
???geoLayer.Renderer =(IFeatureRenderer)renderer;
?4.數(shù)據(jù)分級繪制(使用IClassBreaksRenderer)
?5.餅圖/直方圖(使用IChartRenderer)
?6.按比例尺渲染(使IScaleDependentRenderer)
?7.比例符號渲染(使用 IProportionalSymbolRenderer )
2.圖例的使用
? 圖例的使用通過ILegendInfo接口。每個(gè)Renderer都實(shí)現(xiàn)了該接口,但是有時(shí)候該實(shí)現(xiàn)不好用,
? 所以也可以自己實(shí)現(xiàn)該接口。實(shí)現(xiàn)過程是比較簡單的。
3.渲染層次
? 使用ILevelRender 接口。該接口可以指定一 當(dāng)前的Level(-1)表示繪制全部。
? 然后 提供一個(gè)符號數(shù)組 ,注意每個(gè)符號要指定Level .如果不指定就默認(rèn)為0。
4.透明度控制
? 透明度控制使用 ITransparencyRenderer 接口。該接口允許指定一個(gè)字段,字段取值用來表示透明度
? 注意 透明度的取值在0--100之間。
5.數(shù)據(jù)正規(guī)化
? 數(shù)據(jù)正規(guī)化用 IDataNormalization 接口來表示。該接口提供了幾種正規(guī)化表示方法。
6.部分渲染
? 部分渲染通過使用IDataExclusion? 來實(shí)現(xiàn)。該接口允許提供過濾語句來過濾掉不需要渲染的Feature。
? 同時(shí)也可以給他們制定特殊的符號。同時(shí)控制是否顯示
7.旋轉(zhuǎn)控制
? 旋轉(zhuǎn)控制通過使用IRotationRenderer 接口來表示。該接口要求提供旋轉(zhuǎn)角度的字段。同時(shí)要求提供旋轉(zhuǎn)的
? 方法。
8.數(shù)據(jù)樣本
?IDataSampling? 沒有使用過。
9.外表關(guān)聯(lián)
?ITable dispTable=((IDisplayTable)feaLayer).DisplayTable ;//圖層
?ITable attTable;//外表
?IMemoryRelationshipClassFactory fac=new MemoryRelationshipClassFactoryClass ();
?IRelationshipClass relClass=fac.Open("JZMJ",(IObjectClass)dispTable,"ZDDJH",
???IObjectClass)attTable,"G03",
???"Forward","Backward",
???esriRelCardinality.esriRelCardinalityOneToOne);
?IDisplayRelationshipClass dispRelClass=feaLayer as IDisplayRelationshipClass ;
?dispRelClass.DisplayRelationshipClass(relClass,esriJoinType.esriLeftInnerJoin);
10.統(tǒng)計(jì)分析
?? ITableHistogram? tableHistogram=new BasicTableHistogramClass ();
? tableHistogram.Table =((IDisplayTable)layer).DisplayTable? ;
? tableHistogram.Field =fieldName ;
? object valueArray=null, freq=null;
? IBasicHistogram basicHistogram=(IBasicHistogram)tableHistogram;
? basicHistogram.GetHistogram(out valueArray,out freq);
? IClassify classify=null;
???int breakNum=6;
???//分類方法
???switch(ClassifyMethod )
???{
????case ClassifyMethodName.lsClassifyMethodEqualInterval:
????{
?????
??????EqualIntervalClass? eq=new EqualIntervalClass ();
??????eq.Classify (valueArray,freq,ref breakNum);
??????classify=(IClassify)eq;
?????
?????break;
????}
????case ClassifyMethodName.lsClassifyMethodStandardDeviation:
????{
?????
??????StandardDeviationClass sd=new StandardDeviationClass ();
??????IStatisticsResults stat= histogram as IStatisticsResults ;
??????classify=sd as IClassify;
??????classify.SetHistogramData (valueArray,freq);
??????IDeviationInterval di=sd as IDeviationInterval ;
??????di.DeviationInterval=1;
??????di.Mean=stat.Mean;
??????di.StandardDev=stat.StandardDeviation;
??????classify.Classify (ref breakNum);
?????
?????break;
????}
????case ClassifyMethodName.lsClassifyMethodQuantile:
????{
?????
??????Quantile qc=new QuantileClass ();
??????qc.Classify (valueArray,freq,ref breakNum);
??????classify=qc as IClassify ;
?????
?????break;
????}
????case ClassifyMethodName.lsClassifyMethodNaturalBreaks:
????{
?????
??????NaturalBreaksClass nb=new NaturalBreaksClass ();
??????nb.Classify (valueArray,freq,ref breakNum);
??????classify=nb as IClassify ;
?????
?????break;
????}
????case ClassifyMethodName.lsClassifyMethodDefinedInterval:
????{
?????DefinedIntervalClass di=new DefinedIntervalClass ();
?????di.IntervalRange =this.m_classBreaksParam .Interval ;
?????di.Classify (valueArray,freq,ref breakNum);
?????classify=di as IClassify ;
?????break;
????}
????default:
????{
????
?????EqualIntervalClass? eq=new EqualIntervalClass ();
?????eq.Classify (valueArray,freq,ref breakNum);
?????classify=(IClassify)eq;
?????break;
????
????}
???}???
???object o=classify.ClassBreaks ;
???System.Array breakArray= o as System.Array;
???現(xiàn)在breakArray中就是統(tǒng)計(jì)后的數(shù)據(jù)了。