/// <summary> /// 创建标注 /// </summary> /// <param name="feaName"></param> /// <param name="featureDataset"></param> /// <param name="feaworkspace"></param> /// <param name="fsEditAnno"></param> /// <param name="intScale"></param> public void createAnnoFeatureClass(string feaName, IFeatureDataset featureDataset, IFeatureWorkspace feaworkspace, IFieldsEdit fsEditAnno, int intScale) { //创建注记的特殊字段 try { //注记的workSpace IFeatureWorkspaceAnno pFWSAnno = feaworkspace as IFeatureWorkspaceAnno; //标注操作空间 IGraphicsLayerScale pGLS = new GraphicsLayerScaleClass(); //图形比例接口 pGLS.Units = esriUnits.esriMeters; //图形比例设定 pGLS.ReferenceScale = Convert.ToDouble(intScale); //创建注记必须要设置比例尺 IFormattedTextSymbol myTextSymbol = new TextSymbolClass(); //文本格式接口 ISymbol pSymbol = (ISymbol)myTextSymbol; //标记 //Anno要素类必须有的缺省符号 ISymbolCollection2 pSymbolColl = new SymbolCollectionClass(); ISymbolIdentifier2 pSymID = new SymbolIdentifierClass(); pSymbolColl.AddSymbol(pSymbol, "Default", out pSymID); //Anno要素类的必要属性 IAnnotateLayerProperties pAnnoProps = new LabelEngineLayerPropertiesClass(); pAnnoProps.CreateUnplacedElements = true; pAnnoProps.CreateUnplacedElements = true; pAnnoProps.DisplayAnnotation = true; pAnnoProps.UseOutput = true; ILabelEngineLayerProperties pLELayerProps = (ILabelEngineLayerProperties)pAnnoProps; pLELayerProps.Symbol = pSymbol as ITextSymbol; pLELayerProps.SymbolID = 0; pLELayerProps.IsExpressionSimple = true; pLELayerProps.Offset = 0; pLELayerProps.SymbolID = 0; IAnnotationExpressionEngine aAnnoVBScriptEngine = new AnnotationVBScriptEngineClass(); pLELayerProps.ExpressionParser = aAnnoVBScriptEngine; pLELayerProps.Expression = "[DESCRIPTION]"; IAnnotateLayerTransformationProperties pATP = (IAnnotateLayerTransformationProperties)pAnnoProps; pATP.ReferenceScale = pGLS.ReferenceScale; pATP.ScaleRatio = 1; IAnnotateLayerPropertiesCollection pAnnoPropsColl = new AnnotateLayerPropertiesCollectionClass(); pAnnoPropsColl.Add(pAnnoProps); IObjectClassDescription pOCDesc = new AnnotationFeatureClassDescription(); IFields fields = pOCDesc.RequiredFields; IFeatureClassDescription pFDesc = pOCDesc as IFeatureClassDescription; for (int j = 0; j < pOCDesc.RequiredFields.FieldCount; j++) { fsEditAnno.AddField(pOCDesc.RequiredFields.get_Field(j)); } fields = fsEditAnno as IFields; pFWSAnno.CreateAnnotationClass(feaName, fields, pOCDesc.InstanceCLSID, pOCDesc.ClassExtensionCLSID, pFDesc.ShapeFieldName, "", featureDataset, null, pAnnoPropsColl, pGLS, pSymbolColl, true); } catch { } }
private IFeatureClass CreateFeatureClass(IFeatureDataset featureDataset,TableStructureNode tableStructureNode, FeatureCodeNode featureCodeNode) { try { if (featureDataset != null) { IFeatureClassDescription fcDesc = new FeatureClassDescriptionClass(); IObjectClassDescription ocDesc = (IObjectClassDescription)fcDesc; ///创建数据表字段 IFieldChecker fieldChecker = new FieldCheckerClass(); IEnumFieldError enumFieldError = null; IFields validatedFields = CreateFileds(tableStructureNode, featureCodeNode); ///字段信息验证 IFields fixFields = null; fieldChecker.ValidateWorkspace = featureDataset.Workspace; fieldChecker.Validate(validatedFields, out enumFieldError, out fixFields); ////创建FeatureClass IFeatureClass featureClass = null; if (tableStructureNode.IsGeometryTable) { ////创建非注记FeatureClass if (featureCodeNode.GeometryType != "") { featureClass = featureDataset.CreateFeatureClass(featureCodeNode.TableName, fixFields, ocDesc.InstanceCLSID, ocDesc.ClassExtensionCLSID, esriFeatureType.esriFTSimple, fcDesc.ShapeFieldName, ""); } else { ///创建注记 IFormattedTextSymbol pTxtSymbo=new TextSymbolClass(); IFeatureWorkspaceAnno pFeatureWorkspaceAnno = this.m_pIDataset.Workspace as IFeatureWorkspaceAnno; IGraphicsLayerScale pGraphSacle = new GraphicsLayerScaleClass(); pGraphSacle.Units = ESRI.ArcGIS.esriSystem.esriUnits.esriFeet; //pGraphSacle.ReferenceScale=1000; ISymbolCollection pSymbolCollection = new SymbolCollectionClass(); IAnnotateLayerProperties pAnnoLayerProp = new LabelEngineLayerPropertiesClass(); pAnnoLayerProp.FeatureLinked = true; pAnnoLayerProp.CreateUnplacedElements = false; pAnnoLayerProp.DisplayAnnotation = true; pAnnoLayerProp.UseOutput = true; IAnnotationExpressionEngine pAnnoExpressionEngine =new AnnotationVBScriptEngineClass(); ILabelEngineLayerProperties pLabelEngineLayerProperties = pAnnoLayerProp as ILabelEngineLayerProperties; pLabelEngineLayerProperties.ExpressionParser = pAnnoExpressionEngine; pLabelEngineLayerProperties.Expression = "[DESCRIPTION]"; pLabelEngineLayerProperties.IsExpressionSimple = true; pLabelEngineLayerProperties.Offset = 0; pLabelEngineLayerProperties.SymbolID = 0; pLabelEngineLayerProperties.Symbol = pTxtSymbo; IAnnotateLayerTransformationProperties pAnnoLayerTransProp = pAnnoLayerProp as IAnnotateLayerTransformationProperties; pAnnoLayerTransProp.ReferenceScale=200; pAnnoLayerTransProp.Units= ESRI.ArcGIS.esriSystem.esriUnits.esriFeet; pAnnoLayerTransProp.ScaleRatio=1; IAnnotateLayerPropertiesCollection pAnnoLayerProptyCollection =new AnnotateLayerPropertiesCollectionClass(); pAnnoLayerProptyCollection.Add(pAnnoLayerProp); featureClass= pFeatureWorkspaceAnno.CreateAnnotationClass(featureCodeNode.TableName,fixFields,ocDesc.InstanceCLSID ,ocDesc.ClassExtensionCLSID,fcDesc.ShapeFieldName,"",featureDataset,null, pAnnoLayerProptyCollection, pGraphSacle, pSymbolCollection,true); } } else { ///创建非空间数据 } return featureClass; } return null; } catch(Exception ex) { Logger.WriteErrorLog(ex); return null; } }
/// <summary> /// 创建注记层 /// </summary> /// <param name="strFeaClsName">注记层名称</param> /// <param name="destDataset">待创建的注记层所在的featuredataset</param> /// <param name="ipInputFields">注记层字段</param> public static IFeatureClass CreateAnnotation(IFeatureClass pInputCls, IFeatureDataset destDataset, IFields ipInputFields) { try { //要素类标识信息 IObjectClassDescription ipObjectClassDesc = new AnnotationFeatureClassDescription(); IFeatureClassDescription ipFeatClassDesc = (IFeatureClassDescription)ipObjectClassDesc; IAnnoClass pAnnoClass = pInputCls.Extension as IAnnoClass; double scale = pAnnoClass.ReferenceScale; IUID ipCLSID = ipObjectClassDesc.InstanceCLSID; ipCLSID.Value = "esriCore.AnnotationFeature"; IUID ipExtCLSID = ipObjectClassDesc.ClassExtensionCLSID; ipExtCLSID.Value = "esriCore.AnnotationFeatureClassExtension"; //IField ipField; IFields ipFields = ipObjectClassDesc.RequiredFields; IFieldsEdit ipFieldsEdit = (IFieldsEdit)ipFields; int numFields = ipInputFields.FieldCount; esriFieldType type; for (int i = 0; i < numFields; i++) { IField ipField = ipInputFields.get_Field(i); type = ipField.Type; if (type != esriFieldType.esriFieldTypeOID && type != esriFieldType.esriFieldTypeGeometry) { string fldName = ipField.Name; int fldIndex = ipFields.FindField(fldName); if (fldIndex == -1) { ipFieldsEdit.AddField(ipField); } } } //工作空间 IWorkspace ipWorkspace = destDataset.Workspace; IFeatureWorkspaceAnno ipFeatureWorkspaceAnno = (IFeatureWorkspaceAnno)ipWorkspace; //显示比例 IGraphicsLayerScale ipGraphicsLayerScale = new GraphicsLayerScaleClass(); ipGraphicsLayerScale.ReferenceScale = scale; ipGraphicsLayerScale.Units = pAnnoClass.ReferenceScaleUnits; //符号信息 //' set up symbol collection ISymbolCollection pSymbolColl = new SymbolCollectionClass(); ITextSymbol myTxtSym = new TextSymbolClass(); //Set the font for myTxtSym stdole.IFontDisp myFont = new stdole.StdFontClass() as stdole.IFontDisp; IFont pFt = (IFont)myFont; pFt.Name = "Courier New"; myTxtSym.Font = myFont; // Set the Color for myTxtSym to be Dark Red IRgbColor myColor = new RgbColorClass(); myColor.Red = 150; myColor.Green = 0; myColor.Blue = 0; myTxtSym.Color = myColor; // Set other properties for myTxtSym myTxtSym.Angle = 0; myTxtSym.RightToLeft = false; myTxtSym.VerticalAlignment = esriTextVerticalAlignment.esriTVABaseline; myTxtSym.HorizontalAlignment = esriTextHorizontalAlignment.esriTHAFull; myTxtSym.Size = 9; ISymbol pSymbol = (ISymbol)myTxtSym; pSymbolColl.set_Symbol(0, pSymbol); //set up the annotation labeling properties including the expression IAnnotateLayerProperties pAnnoProps = new LabelEngineLayerPropertiesClass(); pAnnoProps.FeatureLinked = true; pAnnoProps.AddUnplacedToGraphicsContainer = false; pAnnoProps.CreateUnplacedElements = true; pAnnoProps.DisplayAnnotation = true; pAnnoProps.UseOutput = true; ILabelEngineLayerProperties pLELayerProps = (ILabelEngineLayerProperties)pAnnoProps; IAnnotationExpressionEngine aAnnoVBScriptEngine = new AnnotationVBScriptEngineClass(); pLELayerProps.ExpressionParser = aAnnoVBScriptEngine; pLELayerProps.Expression = "[DESCRIPTION]"; pLELayerProps.IsExpressionSimple = true; pLELayerProps.Offset = 0; pLELayerProps.SymbolID = 0; pLELayerProps.Symbol = myTxtSym; IAnnotateLayerTransformationProperties pATP = (IAnnotateLayerTransformationProperties)pAnnoProps; double dRefScale = ipGraphicsLayerScale.ReferenceScale; pATP.ReferenceScale = dRefScale; pATP.Units = esriUnits.esriMeters; pATP.ScaleRatio = 1; IAnnotateLayerPropertiesCollection pAnnoPropsColl = new AnnotateLayerPropertiesCollectionClass(); pAnnoPropsColl.Add(pAnnoProps); //' use the AnnotationFeatureClassDescription co - class to get the list of required fields and the default name of the shape field IObjectClassDescription pOCDesc = new AnnotationFeatureClassDescriptionClass(); IFeatureClassDescription pFDesc = (IFeatureClassDescription)pOCDesc; IFields pReqFields = pOCDesc.RequiredFields; IUID pInstCLSID = pOCDesc.InstanceCLSID; IUID pExtCLSID = pOCDesc.ClassExtensionCLSID; string bsShapeFieldName = pFDesc.ShapeFieldName; IDataset pDs = (IDataset)pInputCls; //创建 string bstName = ipFeatClassDesc.ShapeFieldName; IFeatureClass pOutFcls = ipFeatureWorkspaceAnno.CreateAnnotationClass(pDs.Name, ipFields, pOCDesc.InstanceCLSID, pOCDesc.ClassExtensionCLSID, pInputCls.ShapeFieldName, "", destDataset, null, pAnnoPropsColl, ipGraphicsLayerScale, pSymbolColl, true); return(pOutFcls); } catch (Exception exp) { Hy.Common.Utility.Log.OperationalLogManager.AppendMessage(exp.ToString()); return(null); } return(null); }
/// <summary> /// Adds the layer lable. /// </summary> /// <param name="pMap">The p map.</param> /// <param name="layer">The layer.</param> /// <param name="fieldName">Name of the field.</param> /// <param name="pTextSymbol">The p text symbol.</param> /// <param name="dRefScale">The d reference scale.</param> public static void AddLayerLable(IMap pMap, ILayer layer, string fieldName, ITextSymbol pTextSymbol, double dRefScale) { IGeoFeatureLayer geoFeatureLayer = layer as IGeoFeatureLayer; IAnnotateLayerPropertiesCollection annotationProperties = geoFeatureLayer.AnnotationProperties; annotationProperties.Clear(); ILineLabelPosition lineLabelPosition = new LineLabelPositionClass { Parallel = false, Perpendicular = false, InLine = true, OnTop = true, Above = false, Horizontal = true }; LineLabelPlacementPrioritiesClass lineLabelPlacementPrioritiesClass = new LineLabelPlacementPrioritiesClass(); lineLabelPlacementPrioritiesClass.AboveStart = 5; lineLabelPlacementPrioritiesClass.BelowAfter = 4; IBasicOverposterLayerProperties basicOverposterLayerProperties = new BasicOverposterLayerPropertiesClass { LineLabelPosition = lineLabelPosition }; ILabelEngineLayerProperties labelEngineLayerProperties; if (pMap.AnnotationEngine.Name.Equals("Esri Maplex Label Engine", System.StringComparison.CurrentCultureIgnoreCase)) { labelEngineLayerProperties = new MaplexLabelEngineLayerPropertiesClass(); IMaplexOverposterLayerProperties maplexOverposterLayerProperties = new MaplexOverposterLayerPropertiesClass(); IFeatureLayer featureLayer = layer as IFeatureLayer; switch (featureLayer.FeatureClass.ShapeType) { case esriGeometryType.esriGeometryPoint: maplexOverposterLayerProperties.FeatureType = esriBasicOverposterFeatureType.esriOverposterPoint; maplexOverposterLayerProperties.PointPlacementMethod = esriMaplexPointPlacementMethod.esriMaplexAroundPoint; break; case esriGeometryType.esriGeometryPolyline: maplexOverposterLayerProperties.FeatureType = esriBasicOverposterFeatureType.esriOverposterPolyline; maplexOverposterLayerProperties.LinePlacementMethod = esriMaplexLinePlacementMethod.esriMaplexCenteredStraightOnLine; break; case esriGeometryType.esriGeometryPolygon: maplexOverposterLayerProperties.FeatureType = esriBasicOverposterFeatureType.esriOverposterPolygon; maplexOverposterLayerProperties.PolygonPlacementMethod = esriMaplexPolygonPlacementMethod.esriMaplexHorizontalInPolygon; break; } maplexOverposterLayerProperties.CanRemoveOverlappingLabel = false; maplexOverposterLayerProperties.RepeatLabel = false; (labelEngineLayerProperties as ILabelEngineLayerProperties2).OverposterLayerProperties = (maplexOverposterLayerProperties as IOverposterLayerProperties); IMapOverposter mapOverposter = pMap as IMapOverposter; IOverposterProperties overposterProperties = mapOverposter.OverposterProperties; IMaplexOverposterProperties maplexOverposterProperties = overposterProperties as IMaplexOverposterProperties; maplexOverposterProperties.LabelLargestPolygon = false; } else { labelEngineLayerProperties = new LabelEngineLayerPropertiesClass(); labelEngineLayerProperties.BasicOverposterLayerProperties = basicOverposterLayerProperties; } labelEngineLayerProperties.Symbol = pTextSymbol; labelEngineLayerProperties.IsExpressionSimple = true; labelEngineLayerProperties.Expression = "[" + fieldName + "]"; IAnnotateLayerProperties item = labelEngineLayerProperties as IAnnotateLayerProperties; if (dRefScale != -1.0) { IAnnotateLayerTransformationProperties annotateLayerTransformationProperties = labelEngineLayerProperties as IAnnotateLayerTransformationProperties; annotateLayerTransformationProperties.ReferenceScale = dRefScale; } annotationProperties.Add(item); geoFeatureLayer.DisplayAnnotation = true; }
public void showAnnotationByScale() { IMap pMap = axMapControl.Map; IFeatureLayer pFeaturelayer = pMap.get_Layer(1) as IFeatureLayer; IGeoFeatureLayer pGeoFeatureLayer = pFeaturelayer as IGeoFeatureLayer; //创建标注集接口,可以对标注进行添加、删除、查询、排序等操作 IAnnotateLayerPropertiesCollection pAnnotateLayerPropertiesCollection = new AnnotateLayerPropertiesCollectionClass(); pAnnotateLayerPropertiesCollection = pGeoFeatureLayer.AnnotationProperties; pAnnotateLayerPropertiesCollection.Clear(); //创建标注的颜色 IRgbColor pRgbColor = new RgbColorClass(); pRgbColor.Red = 255; pRgbColor.Green = 0; pRgbColor.Blue = 0; //创建标注的字体样式 ITextSymbol pTextSymbol = new TextSymbolClass(); pTextSymbol.Color = pRgbColor; pTextSymbol.Size = 12; pTextSymbol.Font.Name = "宋体"; //定义 ILineLabelPosition接口,用来管理line features的标注属性,指定标注和线要素的位置关系 ILineLabelPosition pLineLabelPosition = new LineLabelPositionClass(); pLineLabelPosition.Parallel = false; pLineLabelPosition.Perpendicular = true; pLineLabelPosition.InLine = true; //定义 ILineLabelPlacementPriorities接口用来控制标注冲突 ILineLabelPlacementPriorities pLineLabelPlacementPriorities = new LineLabelPlacementPrioritiesClass(); pLineLabelPlacementPriorities.AboveStart = 5; pLineLabelPlacementPriorities.BelowAfter = 4; //定义 IBasicOverposterLayerProperties 接口实现 LineLabelPosition 和 LineLabelPlacementPriorities对象的控制 IBasicOverposterLayerProperties pBasicOverposterLayerProperties = new BasicOverposterLayerPropertiesClass(); pBasicOverposterLayerProperties.LineLabelPlacementPriorities = pLineLabelPlacementPriorities; pBasicOverposterLayerProperties.LineLabelPosition = pLineLabelPosition; pBasicOverposterLayerProperties.FeatureType = esriBasicOverposterFeatureType.esriOverposterPolygon; //创建标注对象 ILabelEngineLayerProperties pLabelEngineLayerProperties = new LabelEngineLayerPropertiesClass(); //设置标注符号 pLabelEngineLayerProperties.Symbol = pTextSymbol; pLabelEngineLayerProperties.BasicOverposterLayerProperties = pBasicOverposterLayerProperties; //声明标注的Expression是否为Simple pLabelEngineLayerProperties.IsExpressionSimple = true; //设置标注字段 pLabelEngineLayerProperties.Expression = "[DIQU]"; //定义IAnnotateLayerTransformationProperties 接口用来控制feature layer的display of dynamic labels IAnnotateLayerTransformationProperties pAnnotateLayerTransformationProperties = pLabelEngineLayerProperties as IAnnotateLayerTransformationProperties; //设置标注参考比例尺 pAnnotateLayerTransformationProperties.ReferenceScale = 500000; //定义IAnnotateLayerProperties接口,决定FeatureLayer动态标注信息 IAnnotateLayerProperties pAnnotateLayerProperties = pLabelEngineLayerProperties as IAnnotateLayerProperties; //设置显示标注最大比例尺 pAnnotateLayerProperties.AnnotationMaximumScale = 500000; //设置显示标注的最小比例 pAnnotateLayerProperties.AnnotationMinimumScale = 25000000; //决定要标注的要素 pAnnotateLayerProperties.WhereClause = "DIQU<>'宿州市'"; //将创建好的标注对象添加到标注集对象中 pAnnotateLayerPropertiesCollection.Add(pAnnotateLayerProperties); //声明标注是否显示 pGeoFeatureLayer.DisplayAnnotation = true; //刷新视图 this.axMapControl.Refresh(); }