AE指定字段转成注记
08-06-13 08:33:33 作者:xbt746 出处:xbt746.cnblogs.com

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 , falsefalsefalsetrue, 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);
        }