1. 程式人生 > >arcgis engine開發中圖層標註設定

arcgis engine開發中圖層標註設定

做了一個圖層標註顯示並非圖層要素對應欄位值,而作一個翻譯,網上也未找到比較詳細的說明,因此費了較長時間,這裡作一個記錄;

下面對整個設定過程作一個詳細的標註:

 IFeatureLayer feaLy = curLayer as IFeatureLayer;//把需要標註的圖層轉化為featurelayer


            IGeoFeatureLayer geoFeaLy = feaLy as IGeoFeatureLayer;//轉化為幾何圖層,只有幾何圖層才可以設定標註
            if (geoFeaLy == null)
                return;
            geoFeaLy.DisplayAnnotation = true; //是否顯示標註
            ILabelEngineLayerProperties labelEngine = new LabelEngineLayerPropertiesClass();//標註屬性類
            IAnnotateLayerProperties labelPro = labelEngine as IAnnotateLayerProperties;//圖層標註屬性類
            IAnnotateLayerPropertiesCollection annoLyProCol = geoFeaLy.AnnotationProperties;//圖層標註屬性集合類-
            annoLyProCol.Clear();//清空當前圖層的標註設定
          

            if (字典表資料)//表示不顯示圖層要素對應的欄位值,而是把欄位值翻譯成對應的別的說明文字
            {
                IAnnotationExpressionEngine javaSrc = new AnnotationJScriptEngineClass();
                labelEngine.ExpressionParser = javaSrc;//設定成javascript語言去定義

                labelEngine.IsExpressionSimple = false;//表示高階定義,而非普通

//下面一段程式碼將根據值來寫javascript語句,這裡是根據一個表資料來定義的,根據當前值是否與ELEMCODE值相等,若相等則顯示ELEMVALUE 的值;

                List<Model.TCMODELCODE> coleList = MapContent.AoMapContent.MapInfo.GetModelCodeListByModelCodeGroupID(col.MODELCODEGROUPID);
                //拼接判斷語句
                StringBuilder sb = new StringBuilder();
                foreach (Model.TCMODELCODE cc in coleList)
                {
                    if (string.IsNullOrEmpty(sb.ToString()))
                        sb.Append(" if( s.toLowerCase() ==\"" + cc.ELEMCODE.ToLower() + "\")  newS=\" " + cc.ELEMVALUE + "\" ;");
                    else
                        sb.Append(" else if( s.toLowerCase() ==\"" + cc.ELEMCODE.ToLower() + "\")   newS=\" " + cc.ELEMVALUE + "\"; ");
                }
                sb.Append(" return newS ");

//上面寫的是判斷語句,這裡作一個整體的javascript類的包裝,並放在標註描述定義裡
                labelEngine.Expression = " function FindLabel ( [" +欄位名稱
                    + "] ){  s = [" + 欄位名稱
                    + "];  newS =[" + 欄位名稱
                    + "];  " + sb.ToString() + " }";
            }
            else

            {

//這裡是普通的標註定義,只要把標註欄位名用[]包,放在描述定義裡即可

                labelEngine.IsExpressionSimple = true;
                labelEngine.Expression = string.Format("[{0}]", 欄位名稱);
            }
            ITextSymbol txtSymbol = new TextSymbolClass();//設定文字顯示符號
            System.Drawing.Font dotNetFont = new System.Drawing.Font("宋體", mcLayerInfo.layerEffectInfo.FontSize, mcLayerInfo.layerEffectInfo.fontStyle);
            txtSymbol.Font = ESRI.ArcGIS.ADF.COMSupport.OLE.GetIFontDispFromFont(dotNetFont) as stdole.IFontDisp;
            IRgbColor rgbCol = new RgbColorClass();
            rgbCol.Red = mcLayerInfo.layerEffectInfo.FontColor.R;
            rgbCol.Green = mcLayerInfo.layerEffectInfo.FontColor.G;
            rgbCol.Blue = mcLayerInfo.layerEffectInfo.FontColor.B;
            txtSymbol.Color = rgbCol as IColor;
            labelEngine.Symbol = txtSymbol; //把文字元號設定成標註樣式
            labelPro.DisplayAnnotation = true; //是否顯示文字標註
            ILineLabelPosition labelPositon = new LineLabelPositionClass();     //標註顯示在要素幾何圖層的位置設定
            labelPositon.Above = true;
            labelPositon.Horizontal = false;
            labelPositon.InLine = true;
            labelPositon.OnTop = true;
            labelPositon.Parallel = true;
            labelPositon.ProduceCurvedLabels = true;
            labelPro.LabelWhichFeatures = esriLabelWhichFeatures.esriAllFeatures;//顯示要素過濾,這裡是顯示所有要素
            IBasicOverposterLayerProperties basicOverpostLp = labelEngine.BasicOverposterLayerProperties;
            basicOverpostLp.NumLabelsOption = esriBasicNumLabelsOption.esriOneLabelPerName;
            basicOverpostLp.LineLabelPosition = labelPositon;
            labelPro.FeatureLayer = feaLy;//這步不可缺少,把featurelayer設定到標註屬性裡
   
            annoLyProCol.Add(labelPro);//最後一步,把標註屬性放到幾何圖層標註屬性設定裡