Posted on 2007-03-08 16:46
帥子 閱讀(3413)
評論(1) 編輯 收藏 所屬分類:
j2se技術專區
ArcEngine 渲染的使用
1.Feature的基本渲染方法
?Feature的常用的繪制方法包括:
? 1.簡單繪制
? 2.唯一值繪制/多字段唯一值繪制
? 3.點密度/多字段點密度繪制
? 4.數據分級繪制
? 5.質量圖(餅圖/直方圖)
? 6.按比例尺渲染
? 7.比例符號渲染
?
? 1.簡單渲染
? 簡單渲染是ArcEngine的默認渲染,我們打開一個FeatureClass,建立一個FeatureLayer的時候,
如果沒有給FeatureLayer設置Renderer那么使用的就是簡單渲染。簡單渲染對整個圖層中的所有Feature
使用同一種方式顯示。
簡單渲染在ArcEngine中用ISimpleRenderer來表示。
?ISimpleRenderer的使用方式如下:
?//假設layer是一個IFeatureLayer,獲取IGeoFeatureLayer
? IGeoFeatureLayer geoLayer=layer as IGeoFeatureLayer;
? //構造SimpleRenderer
? ISimpleRenderer renderer=new SimpleRendererClass();
? renderer.description="簡單的渲染一下";
? renderer.Label="符號的標簽";
? //假設sym是一個和該圖層中Geometry類型對應的符號;
? renderer.Symbol=sym;
? //為圖層設置渲染,注意需要刷新該圖層。
? geoLayer.Renderer=renderer;
? 2.獨立值/多字段獨立值渲染
? 獨立值/多字段獨立值渲染,根據Feature的某一個字段的數據或某幾個字段的組合結果來確定符號。
? 具有相同值或相同組合值的Feature,使用一樣的符號。在使用多個字段的使用,每個字段的取值之間
? 使用分割符來連接。字段的取值順序和在Renderer中設置的一樣。
? 基本使用方式如下:
? //假設layer是一個IFeatureLayer,獲取IGeoFeatureLayer
? IGeoFeatureLayer geoLayer=layer as IGeoFeatureLayer;
? //構造一個UniqueValueRenderer
? IUniqueValueRenderer renderer=new UniqueValueRendererClass();
? //假設使用兩個字段來渲染
? renderer.FieldCount=2;
? //假設YSLX字段表示要素類型
? //假設YSYT字段表示要數用途
? renderer.set_Field(0,"YSLX");
? renderer.set_Field(1,"YSYT");
? //字段之間使用 | 來連接(默認取值)
? renderer.FieldDelimiter="|";
? //設置默認符號
? renderer.DefaultSymbol=defaultSymbol;
? renderer.DefaultLabel="默認Label";
? //添加值
? renderer.addValue("房屋|民居","民居房屋",MJSymbol);
? renderer.addValue("房屋|商業用地","商業用地",SYSymbol);
? ...
? //還可以通過set_Symbol,set_Heading、set_Value來修改上述設置。
? geoLayer.Renderer=renderer.
? 3.點密度/多字段點密度
? 點密度圖通過在Feature的圖形上打點來表示數據的數多,點越密集表示數據量越大。
? 還可以使用多字段的點密度圖。這個使用同一個Feature上就可以顯示幾種不同的點。
? 注意點密度圖有一個特殊的地方:
??? 點密度圖使用的符號是面狀符號。而其中有需要包括點狀符號。
??? 接口使用如下:
??? ?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.數據分級繪制(使用IClassBreaksRenderer)
?5.餅圖/直方圖(使用IChartRenderer)
?6.按比例尺渲染(使IScaleDependentRenderer)
?7.比例符號渲染(使用 IProportionalSymbolRenderer )
2.圖例的使用
? 圖例的使用通過ILegendInfo接口。每個Renderer都實現了該接口,但是有時候該實現不好用,
? 所以也可以自己實現該接口。實現過程是比較簡單的。
3.渲染層次
? 使用ILevelRender 接口。該接口可以指定一 當前的Level(-1)表示繪制全部。
? 然后 提供一個符號數組 ,注意每個符號要指定Level .如果不指定就默認為0。
4.透明度控制
? 透明度控制使用 ITransparencyRenderer 接口。該接口允許指定一個字段,字段取值用來表示透明度
? 注意 透明度的取值在0--100之間。
5.數據正規化
? 數據正規化用 IDataNormalization 接口來表示。該接口提供了幾種正規化表示方法。
6.部分渲染
? 部分渲染通過使用IDataExclusion? 來實現。該接口允許提供過濾語句來過濾掉不需要渲染的Feature。
? 同時也可以給他們制定特殊的符號。同時控制是否顯示
7.旋轉控制
? 旋轉控制通過使用IRotationRenderer 接口來表示。該接口要求提供旋轉角度的字段。同時要求提供旋轉的
? 方法。
8.數據樣本
?IDataSampling? 沒有使用過。
9.外表關聯
?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.統計分析
?? 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;
???現在breakArray中就是統計后的數據了。