zoukankan      html  css  js  c++  java
  • ArcEngine标注和注记

    转自原文 ArcEngine标注和注记

    标注和注记是ArcEngine中提供的两种使用文字信息标注地图要素的方式.其中标注是作为图层的属性存在的,可以动态创建,注记作为地理要素被存储.需要注意的是Shp文件不支持注记.  绘制标注的方式有两种.让我们先看第一种:

      1.使用TextElment绘制标注.

    这种方法的原理就是把属性表中的某个属性创建TextElment对象,然后使用IGraphicsContainer 的AddElement方法添加标注.实例代码:

            //使用TextElment绘制标注, fieldName为要绘制的属性
            public static void AddLable(AxMapControl axMapControl, ILayer layer, string fieldName)
            {
                IRgbColor pColor = new RgbColorClass()
                {
                    Red = 255,
                    Blue = 0,
                    Green = 0
                };
                IFontDisp pFont = new StdFont()
                {
                    Name = "宋体",
                    Size = 5
                } as IFontDisp;
                
    
                ITextSymbol pTextSymbol = new TextSymbolClass()
                {
                    Color = pColor,
                    Font = pFont,
                    Size = 11
                };
    
                IGraphicsContainer pGraContainer = axMapControl.Map as IGraphicsContainer;
    
                //遍历要标注的要素
                IFeatureLayer pFeaLayer = layer as IFeatureLayer;
                IFeatureClass pFeaClass = pFeaLayer.FeatureClass;
                IFeatureCursor pFeatCur = pFeaClass.Search(null, false);
                IFeature pFeature = pFeatCur.NextFeature();
                int index = pFeature.Fields.FindField(fieldName);//要标注的字段的索引
                IEnvelope pEnv = null;
                ITextElement pTextElment = null;
                IElement pEle = null;
                while (pFeature != null)
                {
                    //使用地理对象的中心作为标注的位置
                    pEnv = pFeature.Extent;
                    IPoint pPoint = new PointClass();
                    pPoint.PutCoords(pEnv.XMin + pEnv.Width * 0.5, pEnv.YMin + pEnv.Height * 0.5);
    
                    pTextElment = new TextElementClass()
                    {
                        Symbol = pTextSymbol,
                        ScaleText = true,
                        Text = pFeature.get_Value(index).ToString()
                    };
                    pEle = pTextElment as IElement;
                    pEle.Geometry = pPoint;
                    //添加标注
                    pGraContainer.AddElement(pEle, 0);
                    pFeature = pFeatCur.NextFeature();
                }
                (axMapControl.Map as IActiveView).PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, axMapControl.Extent);
            }

    2.使用ArcEngine中的标注对象口.LabelEngineLayerProperties来标注要素

    IGeoFeatureLayer中的AnnotationProperties是一个包含LabelEngineLayerProperties对象的标注集合.而 LabelEngineLayerProperties实现了:

         IAnnotateProperties,  //
    IAnnotateLayerProperties, //可以控制标注的显示比例尺,过滤条件等
    ILabelEngineLayerProperties,
    IAnnotateLayerTransformationProperties //控制标注的参考比例尺,单位,标注边界和缩放比率等

    等几个主要的接口.LabelEngineLayerProperties可以操作标注要素的多个属性和行为,如设置文本的标注位置,标注尺寸,设置脚本,文字符号等.该类实现了大量操作标注的属性和方法,对于复杂的标注非常有用,而TextElment适合简单的标注. ILabelEngineLayerProperties2是LabelEngineLayerPropertiesClass 的主接口.他的Expression和IsExpressionSimple用法如下:

            IsExpressionSimple=true,Expression为简单表达式,其形式为: "["+属性字段名+"]"+其他,

            IsExpressionSimple=true=false,Expression为复杂表达式,其内容也为一个字符串,但是一个完整的VBScript or JScript 函数或者表达式.

     ExpressionParser属性是一个Expression解析器,它支持更复杂的JS和Vbs代码.

     //添加标注,比TextElment功能更强大
            public static void AddAnnotate(ILayer layer,string fieldName)
            {
                IGeoFeatureLayer pGeoLayer = layer as IGeoFeatureLayer;
                IAnnotateLayerPropertiesCollection IPALPColl = pGeoLayer.AnnotationProperties;
                IPALPColl.Clear();
    
                IRgbColor pColor = GetColor(255, 0, 0, 255);
                IFontDisp pFont = new StdFont()
                {
                    Name = "宋体",
                    Bold = true
                } as IFontDisp;
    
                ITextSymbol pTextSymbol = new TextSymbolClass()
                {
                    Color = pColor,
                    Font = pFont,
                    Size = 12
                };
    
                //用来控制标注和要素的相对位置关系
                ILineLabelPosition pLineLpos = new LineLabelPositionClass()
                {
                    Parallel = false,  //修改标注的属性
                    Perpendicular = true,
                    InLine = true
                };
                //用来控制标注冲突
                ILineLabelPlacementPriorities pLinePlace = new LineLabelPlacementPrioritiesClass()
                {
                    AboveStart = 5, //让above 和start的优先级为5
                    BelowAfter = 4
                };
                //用来实现对ILineLabelPosition 和 ILineLabelPlacementPriorities以及更高级属性的控制
                IBasicOverposterLayerProperties pBOLP = new BasicOverposterLayerPropertiesClass()
                {
                    FeatureType = esriBasicOverposterFeatureType.esriOverposterPolygon,
                    LineLabelPlacementPriorities = pLinePlace,
                    LineLabelPosition = pLineLpos
                };
    
                //创建标注对象
                ILabelEngineLayerProperties pLableEngine = new LabelEngineLayerPropertiesClass()
                {
                    Symbol = pTextSymbol,
                    BasicOverposterLayerProperties = pBOLP,
                    IsExpressionSimple = true,
                    Expression = "["+fieldName+"]"
                };
    
                //设置标注的参考比例尺
                IAnnotateLayerTransformationProperties pAnnoLyrPros = pLableEngine as IAnnotateLayerTransformationProperties;
                pAnnoLyrPros.ReferenceScale = 2500000;
    
                //设置标注可见的最大最小比例尺
                IAnnotateLayerProperties pAnnoPros = pLableEngine as IAnnotateLayerProperties;
                pAnnoPros.AnnotationMaximumScale = 2500000;
                pAnnoPros.AnnotationMinimumScale = 25000000;
                //pAnnoPros.WhereClause属性  设置过滤条件
    
                IPALPColl.Add(pAnnoPros);
                pGeoLayer.DisplayAnnotation = true;
            }
  • 相关阅读:
    JavaScript的object和Array引用类型
    JavaScript中JSON的序列化与解析
    JavaScript获取url后面的参数
    JavaScript事件处理程序
    JavaScript手机端页面滑动到底部加载信息(移动端ajax分页)
    666
    jquery的键盘事件
    如何判断是不是微信登录浏览器
    写的挺好 placeholder 的模拟用法
    下雪了还是下冰雹了
  • 原文地址:https://www.cnblogs.com/arxive/p/6820641.html
Copyright © 2011-2022 走看看