从注记表达式的文本文件中程序里读取并动态地增加注记。label expression 可以为简单的或vb脚本等
/// <summary> /// 图层增加注记表达式 /// </summary> /// <param name="map">The map.</param> /// <param name="tcname">The tcname.</param> public static void AddAnno(ILayer plyr , string tcname) { if (!System.IO.File.Exists(注记文件存储路径)) return; IGeoFeatureLayer pGeoFeaLayer = (plyr as IFeatureLayer) as IGeoFeatureLayer; IAnnotateLayerPropertiesCollection pAnoLayPC = pGeoFeaLayer.AnnotationProperties; pAnoLayPC.Clear(); ILabelEngineLayerProperties pAnnoLayerProps = new LabelEngineLayerPropertiesClass(); (pAnnoLayerProps.BasicOverposterLayerProperties as IOverposterLayerProperties2).TagUnplaced = false; ////是否覆盖,对应Arcmap:layer properties-》labels-》placement properties-》conflict detection ::place overlapping labels pAnnoLayerProps.SymbolID = 0; IBasicOverposterLayerProperties4 blp = pAnnoLayerProps.BasicOverposterLayerProperties as IBasicOverposterLayerProperties4; //blp.PointPlacementMethod = esriOverposterPointPlacementMethod.esriAroundPoint; blp.NumLabelsOption = esriBasicNumLabelsOption.esriOneLabelPerShape; ////每个图形只标注一个 label properties--palcement properties--duplicate labels blp.PolygonPlacementMethod = esriOverposterPolygonPlacementMethod.esriAlwaysHorizontal; //// label properties--palcement properties--polygon settings // blp.PlaceOnlyInsidePolygon = true; ////保证在图形内部 label properties--palcement properties--only place label inside polygon string annoExpression = GetAnnoExpression(注记文件存储路径); if (annoExpression.ToUpper().IndexOf("FUNCTION") >= 0) pAnnoLayerProps.IsExpressionSimple = false; else pAnnoLayerProps.IsExpressionSimple = true; //对应aArcMap的advanced选项 pAnnoLayerProps.Expression = annoExpression; pAnnoLayerProps.Symbol = CreateTextSymbol(); pGeoFeaLayer.DisplayAnnotation = true; } /// <summary> /// 根据注记文件存储路径获取标注表达式 /// </summary> /// <param name="tcname">The tcname.</param> /// <returns></returns> public static string GetAnnoExpression(string注记文件存储路径) { StreamReader sr = new StreamReader(注记文件存储路径); string annoExpression = string.Empty; while (!sr.EndOfStream) { string text = sr.ReadLine(); if (annoExpression == string.Empty) annoExpression = text; else annoExpression = annoExpression + " " + text; } return annoExpression; }