从注记表达式的文本文件中程序里读取并动态地增加注记。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 + "\r\n" + text;
}
return annoExpression;
}