ArcEngine实现要素属性的标注及取消标注(20190904)

本文介绍了一种在地图上对特定要素图层进行属性标注的方法,涵盖了如何控制标注的显示与隐藏、修改标注样式,以及如何取消不需要的图层标注。通过使用IGeoFeatureLayer、IAnnotateLayerPropertiesCollection、ILabelEngineLayerProperties和ITextSymbol接口,实现了对图层标注的精细化管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、需求

选择地图中的某一要素图层的属性,在地图中对其进行标注,同时,标注的颜色、字号、字体可以进行修改。另外,取消不需要的图层标注。

2、解决方案

1、控制图层标注的显示或隐藏通过IGeoFeatureLayer.DisplayAnnotation属性设置;
2、IAnnotateLayerPropertiesCollection接口操作要素类图层,包括清除图层标注等;
3、ILabelEngineLayerProperties接口实现对图层标注样式的定义;
4、ITextSymbol接口实现对字体颜色、字体、字号等的定义。

3、界面设计

总共有三个界面,分别是主界面、标记界面、取消标记界面
(1)主界面
主界面
(2)标注界面
标注界面
(3)取消标注界面
取消标注界面

4、代码实现

(1)封装方法

//标注图层
        public void FunLabelFeatureLayer(IFeatureLayer pFeaturelayer, string sLableField, IRgbColor pRGB, ITextSymbol textSymbol)
        {
            //判断图层是否为空
            if (pFeaturelayer == null)
                return;
            IGeoFeatureLayer pGeoFeaturelayer = (IGeoFeatureLayer)pFeaturelayer;
            IAnnotateLayerPropertiesCollection pAnnoLayerPropsCollection;
            pAnnoLayerPropsCollection = pGeoFeaturelayer.AnnotationProperties;
            pAnnoLayerPropsCollection.Clear();

            //未指定字体颜色则默认为黑色
            if (pRGB == null)
            {
                pRGB = new RgbColor();
                pRGB.Red = 0;
                pRGB.Green = 0;
                pRGB.Blue = 0;
            }

            IBasicOverposterLayerProperties pBasicOverposterlayerProps = new BasicOverposterLayerProperties();
            switch (pFeaturelayer.FeatureClass.ShapeType)//判断图层类型
            {
                case esriGeometryType.esriGeometryPolygon:
                    pBasicOverposterlayerProps.FeatureType = esriBasicOverposterFeatureType.esriOverposterPolygon;
                    break;
                case esriGeometryType.esriGeometryPoint:
                    pBasicOverposterlayerProps.FeatureType = esriBasicOverposterFeatureType.esriOverposterPoint;
                    break;
                case esriGeometryType.esriGeometryPolyline:
                    pBasicOverposterlayerProps.FeatureType = esriBasicOverposterFeatureType.esriOverposterPolyline;
                    break;
            }

            ILabelEngineLayerProperties pLabelEnginelayerProps = new LabelEngineLayerProperties() as ILabelEngineLayerProperties;
            pLabelEnginelayerProps.Expression = "[" + sLableField + "]";
            pLabelEnginelayerProps.Symbol = textSymbol;
            pLabelEnginelayerProps.BasicOverposterLayerProperties = pBasicOverposterlayerProps;

            pAnnoLayerPropsCollection.Add((IAnnotateLayerProperties)pLabelEnginelayerProps);
            pGeoFeaturelayer.DisplayAnnotation = true;
        }

        /// <summary>
        /// 获取待要素类的所有属性字段名
        /// </summary>
        /// <param name="pFeatureClass">待复制要素类</param>
        /// <returns>返回待复制要素类的所有属性字段名</returns>
        public static List<string> get_FieldsString(IFeatureClass pFeatureClass)
        {
            IFields pFields = pFeatureClass.Fields;
            IField pField;
            List<string> s = new List<string>();
            for (int i = 0; i < pFields.FieldCount; i++)
            {
                pField = pFields.Field[i];
                if (pField.Type != esriFieldType.esriFieldTypeGeometry)
                    s.Add(pField.Name);
            }
            return s;
        }

        /// <summary>
        /// Color转IColor
        /// </summary>
        /// <param name="color"></param>
        /// <returns></returns>
        public static IColor ColorToIColor(Color color)
        {
            IColor pColor = new RgbColorClass();
            pColor.RGB = color.B * 65536 + color.G * 256 + color.R;
            return pColor;
        }

(2)确定按钮事件(标注图层)

private void btnOK_Click(object sender, EventArgs e)
        {
            #region 输入条件判断
            if (cbxLayers.Text.Trim() == "")
            {
                MessageBox.Show("请选择标注要素!", "提示");
                return;
            }
            if (cbxFields.Text.Trim() == "")
            {
                MessageBox.Show("请选择标注字段!", "提示");
                return;
            }
            #endregion

            LabelField = cbxFields.Text;
            string layerName = cbxLayers.Text;
            IFeatureLayer pFeatureLayer=null;

            for (int i = 0; i < pMap.LayerCount; i++)
            {
                if ((pMap.Layer[i] is FeatureLayer) && (pMap.Layer[i].Name == cbxLayers.Text))
                {
                    pFeatureLayer = pMap.Layer[i] as IFeatureLayer;
                    break;
                }
            }

            //产生文本符号
            ITextSymbol pTextSymbol = new TextSymbolClass();
            pTextSymbol.Font = pFontDisp;
            pTextSymbol.Color = ColorToIColor(pColor);

            FunLabelFeatureLayer(pFeatureLayer, LabelField, MyColor, pTextSymbol);

            IActiveView pActiveView = pMap as IActiveView;
            pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
            pFeatureLayer.ShowTips = true;
      }

(3)字体及文字颜色设置按钮事件

/设置字体
        private void btnStyle_Click(object sender, EventArgs e)
        {
            System.Drawing.Font font = null;
            FontDialog fontDialog = new FontDialog();
            if (fontDialog.ShowDialog() == DialogResult.OK)
            {
                font = fontDialog.Font;
                pFontDisp.Name = font.Name;
                pFontDisp.Size = (decimal)font.Size;
                pFontDisp.Italic = font.Italic;
                pFontDisp.Bold = font.Bold;
                pFontDisp.Underline = font.Underline;
            }
            else
            {
                return;
            }

            richTextBox1.Font = font;
        }
//设置文字颜色
        private void simpleButton1_Click(object sender, EventArgs e)
        {
            ColorDialog colorDialog = new ColorDialog();
            if (colorDialog.ShowDialog() == DialogResult.OK)
            {
                pColor = colorDialog.Color;
                richTextBox1.ForeColor = pColor;
            }
            else
            {
                return;
            }
        }

5、代码下载

github: ArcEngine要素属性标注及取消标注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值