首页 > 代码库 > AE指定字段转成注记
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; }
AE指定字段转成注记
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。