arcgis engine开发中图层标注设置

来源:互联网 发布:淘宝一妹子买了古着店 编辑:程序博客网 时间:2024/05/17 08:31

做了一个图层标注显示并非图层要素对应字段值,而作一个翻译,网上也未找到比较详细的说明,因此费了较长时间,这里作一个记录;

下面对整个设置过程作一个详细的标注:


 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); //最后一步,把标注属性放到几何图层标注属性设置里