• 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;
    }
  • 相关阅读:
    3、Linux知识点/dos基础命令
    2、进制转换
    1、软件测试基础####################################################
    50.React跳转路由传参3种方法和区别
    49.react中使用less
    48.vue-awesome-swipe使用
    47、安装node-sass后运行报错
    46、VUE + JS 面试宝典
    45、导航钩子函数中使用next()和next('指定路径')的区别:
    44、css实现水波纹效果
  • 原文地址:https://www.cnblogs.com/arxive/p/6262974.html
Copyright © 2020-2023  润新知