在宗地出图的时候遇到此功能要求,看代码
※创建注记类
public void createBlackAnno(IMap pMap) { //创建mdb数据库文件 IWorkspaceFactory pWorkspaceFactory = new AccessWorkspaceFactoryClass(); IWorkspaceName pWorkspaceName = pWorkspaceFactory.Create("c:/Users/Administrator/Desktop/testfolder/","NewGDB.mdb",null,0); IName pName = pWorkspaceName as IName; IWorkspace pWorkspace = pName.Open() as IWorkspace; //创建数据集 IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace; ISpatialReferenceFactory pSpatialReferenceF = new SpatialReferenceEnvironmentClass(); ISpatialReference pSpatialReference = pSpatialReferenceF.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_Beijing1954); pFeatureWorkspace.CreateFeatureDataset("abc",pSpatialReference); //创建注记要素类 IFeatureDataset pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset("abc"); IFeatureWorkspaceAnno pWorkspaceAnno = pFeatureDataset.Workspace as IFeatureWorkspaceAnno; /*------------------------------------------------*/ string Name = "AnnoFeatureClass"; IObjectClassDescription pObjectClassDes = new AnnotationFeatureClassDescriptionClass(); IFeatureClassDescription pFCDescription = pObjectClassDes as IFeatureClassDescription; IFields pFields = pObjectClassDes.RequiredFields; IAnnotateLayerProperties pALProperties = new LabelEngineLayerPropertiesClass(); pALProperties.FeatureLinked = false; pALProperties.AddUnplacedToGraphicsContainer = false; pALProperties.CreateUnplacedElements = true; pALProperties.DisplayAnnotation = true; pALProperties.UseOutput = true; ILabelEngineLayerProperties pLayerEngineLayerProps = pALProperties as ILabelEngineLayerProperties; IAnnotateLayerProperties pAlp = pLayerEngineLayerProps as IAnnotateLayerProperties; pAlp.Class = "Annotation Class 1"; IAnnotateLayerPropertiesCollection pAnnoPropscollection = new AnnotateLayerPropertiesCollection(); pAnnoPropscollection.Add(pAlp); IGraphicsLayerScale pGraphicsLayerScale = new GraphicsLayerScaleClass(); pGraphicsLayerScale.Units = esriUnits.esriMeters; pGraphicsLayerScale.ReferenceScale = 2000; /****************/ IFormattedTextSymbol myTextSymbol = new TextSymbolClass(); //peizhi 类里边是三个基础函数分辨是IRgbColor IFontDisp ITextSymbol 对应的,方法基础,此处无代码 Anno.peizhi pAnno = new Anno.peizhi(); IFontDisp pFont = pAnno.getFont("宋体", 12, false); IColor pColor = pAnno.getColor(34,56,78); myTextSymbol.Color = pColor; myTextSymbol.Font = pFont; myTextSymbol.Angle = 0; myTextSymbol.RightToLeft = false; myTextSymbol.VerticalAlignment = esriTextVerticalAlignment.esriTVABaseline; myTextSymbol.HorizontalAlignment = esriTextHorizontalAlignment.esriTHAFull; myTextSymbol.CharacterSpacing = 200; myTextSymbol.Case = esriTextCase.esriTCNormal; ISymbolCollection pSymbolCollection = new SymbolCollectionClass(); pSymbolCollection.set_Symbol(0, myTextSymbol as ISymbol); IFeatureClass pAnnoFeatureClass = pWorkspaceAnno.CreateAnnotationClass( Name, pFields, pObjectClassDes.InstanceCLSID, pObjectClassDes.ClassExtensionCLSID, pFCDescription.ShapeFieldName, "", pFeatureDataset, null, pAnnoPropscollection, pGraphicsLayerScale, pSymbolCollection, true); }
※生成注记要素
public void createAnnoFeature() { //pPoint 用于确定生成注记的位置 IPoint pPoint = new PointClass() { X = -10, Y = -6 }; peizhi p = new peizhi();//同上 ITextElement pTextElement = new TextElementClass() { Symbol = p.getTextSymbol(p.getColor(0, 255, 0), p.getFont("宋体", 12, true), 12), ScaleText = true, Text = "testet" }; IElement pElement = pTextElement as IElement; pElement.Geometry = pPoint; //以下两行只是为了将生成的注记添加到调试界面,数据量大的时候可以删除,以加快速度 IGraphicsContainer pGContainer = axMapControl1.Map as IGraphicsContainer; pGContainer.AddElement(pElement, 0); //将要素转为注记 (axMapControl1.Map as IActiveView).PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, axMapControl1.Extent); IFeatureClass pFeatureClass = (this.axMapControl1.Map.get_Layer(0) as IFeatureLayer).FeatureClass; IDataset pDataset = pFeatureClass as IDataset; ITransactions pTransaction = pDataset.Workspace as ITransactions; pTransaction.StartTransaction(); IFDOGraphicsLayerFactory pFDOGLFactory = new FDOGraphicsLayerFactoryClass(); ILayer tempLayer = pFDOGLFactory.OpenGraphicsLayer(pDataset.Workspace as IFeatureWorkspace,pFeatureClass.FeatureDataset,pDataset.Name); IFDOGraphicsLayer pFDOGLayer = tempLayer as IFDOGraphicsLayer; IElementCollection pElementColl = new ElementCollectionClass(); pFDOGLayer.BeginAddElements(); pElementColl.Add(pElement, 0); pFDOGLayer.DoAddElements(pElementColl, 0); pFDOGLayer.EndAddElements(); pElementColl.Clear(); pTransaction.CommitTransaction(); }
※ps: 在生成注记的时候,考虑到注记类以及注记要素本身就属于要素类要素,于是采用平常生成点线面要素的方法生成注记要素,使用CreateFeatureBuffer方法,由于Override字段不可赋值,与手动插入的注记要素仅有此字段不同,结果要素可以添加进注记的要素类中,但是不能显示,用IDentity工具 也可以查看,确实有值,纠结好长时间,采用这个,有这方面的大哥希望一起讨论一下。
QQ:1154048399