• 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;
    }
    复制代码

      

  • 相关阅读:
    luogu 3388 【模板】割点(割顶)
    bzoj 3624 免费道路
    bzoj 1179 Atm
    bzoj 2428 均分数据
    luogu 4429 染色
    luogu 4427 求和
    luogu 1121 环状最大两段子段和
    hdu 4777 Queue
    hdu 5492 Find a path
    hdu 5441 Travel
  • 原文地址:https://www.cnblogs.com/arxive/p/6704450.html
Copyright © 2020-2023  润新知