• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
bobird的学习笔记
博客园    首页    新随笔    联系   管理    订阅  订阅

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;
         }
posted on 2013-07-03 16:12  bobird  阅读(478)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3