AE指定字段转成注记

转自原文 ae指定字段转成注记

ArcMap中有一个功能是Label Features,就是可以将图层内指定字段值显示以Label形式显示在主窗口上,在Label Features后,用右键点击图层,发现可以出现一个原来灰色的功能名,ConvertLabelsToAnnotation。这个功能在AE中提供,可是自己找不到设定字段值的位置,无可奈何,只有另辟蹊径。

就是先创建一个注记层,然后按照图层里指定字段的值来生成注记。就是一个一个Feature点转换。可能会比AE提供的接口效率低,没有办法,自己不会用那个接口,也就只能这样勉强的用着了。这个方面最难点就是创建一个新的注记图层,有很多属性需要设置,比较麻烦,下面是代码

private void ConvertToAnnotationLayer(IMap pMap, ILayer pLayer, string fieldname, esriGeometryType type)
{
    IFeatureLayer pFeatLayer = pLayer as IFeatureLayer;

    int i = pFeatLayer.FeatureClass.FindField("SHAPE");
    IField pShapeField = pFeatLayer.FeatureClass.Fields.get_Field(i);
    IDataset pDataSet = pFeatLayer.FeatureClass as IDataset;
    IWorkspace pWS = pDataSet.Workspace;
    IFeatureWorkspace pFeatWS = pWS as IFeatureWorkspace;

    IGeoFeatureLayer pGeoFeatLayer = pFeatLayer as IGeoFeatureLayer;
    IFields pFields = pGeoFeatLayer.FeatureClass.Fields;

    IAnnotationLayerFactory pAnnoLayerFact = new FDOGraphicsLayerFactoryClass();
    IGraphicsLayerScale pGraphyScale = new GraphicsLayerScaleClass();
    pGraphyScale.ReferenceScale = 200000;
    pGraphyScale.Units = esriUnits.esriMeters;
    IAnnotationLayer pAnnoLayer = null;

    ISymbolCollection2 pSymColl = new SymbolCollectionClass();
    IFormattedTextSymbol pTextSymbol = new TextSymbolClass();
    IRgbColor pRGB = new RgbColorClass();
    pRGB.Red = 0;
    pRGB.Blue = 0;
    pRGB.Green = 0;
    pTextSymbol.Color = pRGB;

      /*      pTextSymbol.Font=*/

    m_FontDisp.Size=8;
    pTextSymbol.Font =m_FontDisp ;
    pTextSymbol.HorizontalAlignment = esriTextHorizontalAlignment.esriTHACenter;
    pTextSymbol.VerticalAlignment = esriTextVerticalAlignment.esriTVABaseline;
    pTextSymbol.CharacterSpacing = 100;
    pTextSymbol.CharacterWidth = 50;
    pTextSymbol.WordSpacing = 100;

   //         IBoundsProperties pBoundProp = pTextSymbol as IBoundsProperties;
   /* pBoundProp.FixedSize = false;*/
  //          pBoundProp.FixedAspectRatio = true;
    ISymbol pSymbol = pTextSymbol as ISymbol;
    ISymbolIdentifier2 pSymident2;
    pSymColl.AddSymbol(pSymbol, fieldname, out pSymident2);
    ISymbolCollection pSymColl1= pSymColl as ISymbolCollection;

    IOverposterProperties pOverpost = new BasicOverposterPropertiesClass();

    IAnnotateLayerPropertiesCollection pAnnoPropColl = new AnnotateLayerPropertiesCollectionClass();
    IAnnotateLayerProperties pAnnoProp;
    ILabelEngineLayerProperties2 pLabelEngine=new LabelEngineLayerPropertiesClass();
    pLabelEngine.AnnotationClassID = 0;
    pLabelEngine.Symbol = pTextSymbol;
    pLabelEngine.SymbolID = pSymident2.ID;
    pAnnoProp = pLabelEngine as IAnnotateLayerProperties;
    pAnnoProp.Class = pLayer.Name + fieldname;
    pAnnoProp.LabelWhichFeatures = esriLabelWhichFeatures.esriAllFeatures;
    pAnnoProp.Priority = 0;
    IActiveView pActView=pMap as  IActiveView;
    pAnnoProp.GraphicsContainer = pActView.GraphicsContainer;
    pAnnoProp.FeatureLayer = pFeatLayer;
    pAnnoProp.FeatureLinked = true;
    pAnnoProp.AnnotationMaximumScale = 10000000000000000000;
    pAnnoProp.AnnotationMinimumScale = 0.00000000001;
    pAnnoPropColl.Add(pAnnoProp);
    try
    {
       pAnnoLayer=pAnnoLayerFact.CreateAnnotationLayer(pFeatWS, pFeatLayer.FeatureClass.FeatureDataset, pLayer.Name + "_A_" + fieldname, pShapeField.GeometryDef,
         null, pAnnoPropColl,pGraphyScale,pSymColl1 , false, false, false, true, pOverpost, "");

    }
    catch (Exception s)
    {
        string mes = s.Message;
    }
    if (pAnnoLayer == null)
        return;
    int num=pFields.FindField(fieldname);
    ConvertToAnnotateByFeature(pLayer, num, ref pAnnoLayer);
    pMap.AddLayer(pAnnoLayer as ILayer);
}
   private bool ConvertToAnnotateByFeature(ILayer pLayer,int fieldnum,ref IAnnotationLayer pAnnoLayer)
{
    IFeatureLayer pFeatlayer = pLayer as IFeatureLayer;
    if (pFeatlayer == null)
        return false;
    IFeatureClass pFeatClass = pFeatlayer.FeatureClass;
    IFeatureCursor pFeatCursor = pFeatClass.Search(null, false);
    IFeature pFeat = pFeatCursor.NextFeature();

    IFeatureLayer pAnnoFeatLayer=pAnnoLayer as IFeatureLayer;
    IAnnotationClassExtension pAnnotateExten = pAnnoFeatLayer.FeatureClass.Extension as IAnnotationClassExtension;
    ISymbol pSymbol = pAnnotateExten.SymbolCollection.get_Symbol(0);
    IGeometry pGeo;
    double angle = 0;
    IRgbColor pRGB=new RgbColorClass();
    pRGB.Blue=255;
    pRGB.Green=255;
    pRGB.Red=0;
    /////判断是不是公路层的Width,特殊处理/////
    string temp_layername = pLayer.Name.ToUpper();
    bool bwidth=false;
    if(pFeatClass.Fields.get_Field(fieldnum).Name.ToUpper()=="WIDTH")
    {
        if (pLayer.Name.ToUpper().Contains("LRDL"))
            bwidth = true;
    }
    IElementCollection pElementColl = new ElementCollectionClass();
    pAnnoLayer.BeginAddElements();
    while(pFeat!=null)
    {
        pGeo = pFeat.Shape;
        IPoint pLabelPoint = null;
        if(pGeo is IPolyline)
        {
            IPolyline pline=pGeo as IPolyline;
            pLabelPoint = GetLabelPoint(pline);
        }
        if(pGeo is IPoint)
        {
            pLabelPoint = pGeo as IPoint;
        }
        if(pGeo is IPolygon)
        {
            IPolygon pPolygon = pGeo as IPolygon;
            IArea pArea = pPolygon as IArea;
            pLabelPoint = pArea.LabelPoint;
        }
        object val=pFeat.get_Value(fieldnum);
        string s=val.ToString();
        if (s == null || s.Length == 0)
        {
            pFeat = pFeatCursor.NextFeature();
            continue;
        }
        ///对公路的宽度进行特殊处理
        if(bwidth)
        {

            double width = double.Parse(s);
            int rtegnum = pFeatClass.FindField("RTEG");
            string rteg = pFeat.get_Value(rtegnum).ToString();
            if(rteg=="高速"&&width>55.0)
            {
                IElement pElement = MakeTextElement(pGeo, angle, s, pRGB, pSymbol);
                pElementColl.Add(pElement, pFeat.OID);
            }
            else if(width>40.0)
            {
                IElement pElement = MakeTextElement(pGeo, angle, s, pRGB, pSymbol);
                pElementColl.Add(pElement, pFeat.OID);
            }
        }
        else if (/*pLabelPoint != null&&*/s.Length>0)
        {
            IElement pElement = MakeTextElement(pGeo, angle, s, pRGB,pSymbol);
            pElementColl.Add(pElement, pFeat.OID);
        }
        pFeat = pFeatCursor.NextFeature();
    }
    pAnnoLayer.EndAddElements();
    pAnnoLayer.BeginAddElements();
    if(pElementColl.Count<1)
    {
        pAnnoLayer.EndAddElements();
        return true;
    }
    pAnnoLayer.DoAddElements(pElementColl, 0);
 /*   pAnnoLayer.SetupAttributeConversion()*/
    pAnnoLayer.EndAddElements();
    return true;
}
时间: 2024-10-08 10:09:38

AE指定字段转成注记的相关文章

Arcgis属性转CAD注记,添加CAD字段实现快速分层

我们有时候很头疼,在利用ArcGIS与CAD交互的时候,属性之间的转换就是非常的麻烦.这一篇文章内,我们给大家介绍下如何应用ArcGIS将其属性值转换成CAD的注记,以及如何实现通过利用arcgis的添加cad字段(Layer字段)来实现转成成CAD时的快速分成.下面利用演示视频为大家介绍. http://v.youku.com/v_show/id_XMTMyMTgyNDc0MA==.html?from=y1.7-1.1 可点击左上角我头像下方的学习我的系统课程!!!

Sql Server将一列字段拼接成字符串方法

最近在项目中遇到个问题,需要将表中某列字段合并成字符串输出,如果直接通过代码全部读取出来,再遍历进行拼接显然不是最好的方法,所以想着能否在数据读取的时候直接拼接好返回,网上搜了可通过for xml来实现. 首先,准备好需要的数据,脚本如下: if exists (select * from sysObjects where id=object_id('Student')) drop table Student go create table Student ( Id int, Name varc

WebGIS中自定义互联网地图局部注记的一种方案

1.    前言 实际项目中我们经常会遇到这样一种场景:地图底图可能是互联网地图(百度.高德.天地图)等等,同时我们自己又有某个区域单独的一套POI数据,我们需要将互联网地图中这个区域的原有POI数据进行遮罩然后只显示我们自己的POI数据. 针对这样的需求,我们首先想到的是能否我们只使用不包含注记的底图瓦片,然后再叠加上我们的POI数据.事实上,实际需求中还需要考虑一点,我们只有部分区域的POI数据,却没有其他区域的POI数据. 所以这个需求真正的核心是:除这个不规则多边形的指定区域外,地图均是

Oracle生成查询包含指定字段名对应的所有数据表记录语句

应用场合:已知字段名字,查询数据库中所有数据表中包含该字段名的所有数据表 操作办法:指定字段名,数据库表用户,执行下面查询语句即可 --Oracle生成查询包含指定字段名对应的所有数据表记录语句 declare mycolumnname VARCHAR(255):='userid';--定义要查询的字段名变量,运行前修改成您要查询的字段名myownername VARCHAR(255):='system';--定义要查询的数据库用户名变量,运行前修改成您要查询的数据库用户名mystring NV

Hibernate高效查询,只查询部分/指定字段

公司使用 [java] view plain copy print? DetachedCriteria detachedCriteria = DetachedCriteria.forClass(PeBulletin.class); detachedCriteria.createAlias("enumConstByFlagIsvalid", "enumConstByFlagIsvalid"); detachedCriteria.createCriteria("

Yii使用find findAll查找出指定字段的实现方法

Yii使用find findAll查找出指定字段的实现方法,非常实用的技巧,需要的朋友可以参考下. 用过Yii的朋友都知道,采用如下方法: 查看代码 打印 1 modelName::model()->find() //找出的是一个对象 2 modelName::model()->findALL() //找出的是一个对象集合的数组 可以找出对象与对象集合的数组,那么如何找出我所需要的字段的数据,而不是全部字段的数据呢?之前我是这么做的: 查看代码 打印 1 $criteria=new CDbCr

ArcEngine标注和注记

转自原文 ArcEngine标注和注记 标注和注记是ArcEngine中提供的两种使用文字信息标注地图要素的方式.其中标注是作为图层的属性存在的,可以动态创建,注记作为地理要素被存储.需要注意的是Shp文件不支持注记.  绘制标注的方式有两种.让我们先看第一种: 1.使用TextElment绘制标注. 这种方法的原理就是把属性表中的某个属性创建TextElment对象,然后使用IGraphicsContainer 的AddElement方法添加标注.实例代码: //使用TextElment绘制标

批量替换 MySQL 指定字段中的字符串

MySQL指定字段的特定字符串批量替换的具体语法是: UPDATE 表名 SET 字段名 = replace(字段名, 'http://www.jptcgyy.com', ''); 就是讲 该字段所有的 http://www.jptcgyy.com网址替换为空! 另外,针对ID也可以作个筛选替换,比如我们想把content_type__theme表中ID小于300的field_down_value字段中"86"替换成"80",那么语法就是: UPDATE conte

Oracle中使用游标转换数据表中指定字段内容格式(拼音转数字)

应用场景:将数据表TB_USER中字段NNDP的内容中为[sannanyinv]转换为[3男1女] 主要脚本:一个游标脚本+分割字符串函数+拼音转数字脚本 操作步骤如下: 1.创建类型 create or replace type splitTable is table of varchar2(100); 2.创建函数fn_splitString(功能是将字符串分割成多条记录)--测试语句select * from table(fn_splitString('ernanyinv','nan'))