地图标注:是表示制图对象的名称或数量及质量特征的文字和数字等文字语言。来说明制图对象的名称、种类、性质、和数量等具体特征。
ArcEngine中注记分为两种:标注(Label)、注记(Annotation)。Annotation以更复杂的方法和属性对要素图层进行标注,这个过程可以是自动的,不需用户干预,而且注记内容可以保存到地图数据库中。
AnnotationLayerPropertiesCollection对象是一个要素图层的属性,是一个标注集对象的集合。标注集是与某个要素图层相关联的,用于描述要素图层如何被标注,可以通过IGeoFeaturelayer中的AnnotationProperties属性获取。IAnnotationLayerPropertiesCollection接口提供了对保存在集合中的IAnnocationLayerProperties(LabelEngineLayerProperties、MaplexLabelEngineProperties)对象进行操作,通过该接口,开发者可以对集合中的组件进行添加、删除、排序和查询等操作。L abelEngineLayerProperties对象维持着一个要素图层的注记实例。
IAnnocationLayerProperties的WhereClause属性用于设置一个SQL语句,确定哪些要素可以被标注。
AnnotationMaximunScale和AnnotationMinMunScale用于设置文字标注的最大和最小范围。
LabelEngineLayerProperties对象也实现ILabelEngineLayerProperties接口,提供用于制作过程中的主要属性,设置文字符号、标注文字排放等,其中BasicOverposterLayerProperties用于设置标注文本如何被放置,以及处理文字之间的冲突。IBasicOverposterLayerProperties接口中的LineLabelPlacementPriorities用于设置标注文本的摆放路径的权重,LineLabelPosition用于设置标注文本的排放位置,PointPlacementPriorities用于设置一个与点相关的标注路径的权重等。
class MapMarker
{
private AxMapControl axMapControl;
public MapMarker(AxMapControl _axMapControl)
{
axMapControl = _axMapControl;
}
///
/// 使用注记
///
///
要注记的图层
///
注记内容
public
void Annotation(IGeoFeatureLayer pGeoFeatureLyr,
string
AnnoField) { IGeoFeatureLayer pGeoFeatureLayer;
//
用 GeoFeatureLayer才能操作标注 pGeoFeatureLayer =
pGeoFeatureLyr; IAnnotateLayerPropertiesCollection pAnnoProps;
//
定义标注集对象的集合 pAnnoProps =
pGeoFeatureLyr.AnnotationProperties; pAnnoProps.Clear();
//
清除里面的集合,不知道是不是必须的
IAnnotateLayerProperties pAnnoLayerPros; ILineLabelPosition pPosition;
//
控制Label相对位置 ILineLabelPlacementPriorities pPlacement;
//
control placement position priorities for line labels IBasicOverposterLayerProperties pBasic;
//
Provides access to members that control the placement of labels relative to features using conflict detection ILabelEngineLayerProperties pLabelEngine;
//
可以控制标注的过程中的主要属性,设置文字符号,标注文字排放等
ITextSymbol pTextSymbol; pTextSymbol =
new
TextSymbolClass(); stdole.StdFont pFont;
//
定义字体吧,不知道 pFont =
new
stdole.StdFontClass(); pFont.Name =
"
Verdana
"
; pFont.Size =
10
; pTextSymbol.Font = pFont
as
stdole.IFontDisp ; pTextSymbol.Color = HsvColor(
250,
160,
200
); pPosition =
new
LineLabelPositionClass(); pPosition.Parallel =
false;
//
Label和线平行 pPosition.Perpendicular =
true;
//
Label和线垂直 pPlacement =
new
LineLabelPlacementPrioritiesClass(); pBasic =
new
BasicOverposterLayerPropertiesClass(); pBasic.FeatureType =
esriBasicOverposterFeatureType.esriOverposterPolyline; pBasic.LineLabelPlacementPriorities =
pPlacement; pBasic.LineLabelPosition =
pPosition; pLabelEngine =
new
LabelEngineLayerPropertiesClass(); pLabelEngine.Symbol =
pTextSymbol; pLabelEngine.BasicOverposterLayerProperties =
pBasic; pLabelEngine.Expression = AnnoField;
//
注记的内容 pAnnoLayerPros = pLabelEngine
as
IAnnotateLayerProperties; pAnnoProps.Add(pAnnoLayerPros); pGeoFeatureLayer.DisplayAnnotation =
true
; axMapControl .Refresh (esriViewDrawPhase .esriViewBackground ,
null ,
null
); }
private HsvColor HsvColor(
int hue,
int saturation,
int
val) { HsvColor hsvColor; hsvColor =
new
HsvColorClass(); hsvColor.Hue =
hue; hsvColor.Saturation =
saturation; hsvColor.Value =
val;
return
hsvColor; } }
示例代码
示例1
Maplex类型标注是AE标注的其中一种方式,现提供一简单使用例子 . 转自:LINK
///
/// MaplexEngine标注
///
///
标注图层
///
地球人都知
///
标记字段
public
void Annotation(IGeoFeatureLayer pGeoFeatLyr, IMap pMap,
string
annoField) {
//
如果Map没有用Maplex引擎,要先设置Map使用这个引擎
//
IAnnotateMap pAnnotateMap;
//
pAnnotateMap = new MaplexAnnotateMapClass();
//
pMap.AnnotationEngine = pAnnotateMap;
IAnnotateMap pAnnoMap; pAnnoMap =
new
MaplexAnnotateMapClass(); pMap.AnnotationEngine =
pAnnoMap; IGeoFeatureLayer pGeoFeatLayer; pGeoFeatLayer =
pGeoFeatLyr; IAnnotateLayerPropertiesCollection pAnnoProps; pAnnoProps =
pGeoFeatLyr.AnnotationProperties; pAnnoProps.Clear(); ILabelEngineLayerProperties2 pLabelEngine2 =
new
MaplexLabelEngineLayerPropertiesClass(); pLabelEngine2.Expression =
"
[
" + annoField +
"
]
"
; IMaplexOverposterLayerProperties pMaplexPro =
new
MaplexOverposterLayerPropertiesClass(); pMaplexPro.FeatureType =
esriBasicOverposterFeatureType.esriOverposterPolygon; pMaplexPro.PolygonPlacementMethod =
esriMaplexPolygonPlacementMethod.esriMaplexHorizontalInPolygon; pMaplexPro.CanPlaceLabelOutsidePolygon =
false
; pMaplexPro.CanRemoveOverlappingLabel =
false
; pMaplexPro.RepeatLabel =
false
; pLabelEngine2.OverposterLayerProperties = pMaplexPro
as
IOverposterLayerProperties; IMapOverposter pMapPos = axMapControl1.Map
as
IMapOverposter; IOverposterProperties pOP =
pMapPos.OverposterProperties; IMaplexOverposterProperties pMaplexOP = pOP
as
IMaplexOverposterProperties; pMaplexOP.LabelLargestPolygon =
false
; pAnnoProps.Add(pLabelEngine2
as
IAnnotateLayerProperties); pGeoFeatLyr.DisplayAnnotation =
true
; }
LINK
public void EnableFeatureLayerLabel(IFeatureLayer pFeaturelayer, string sLableField, IRgbColor pRGB, int size, string angleField)
{
//判断图层是否为空
if (pFeaturelayer == null)
return;
IGeoFeatureLayer pGeoFeaturelayer = (IGeoFeatureLayer)pFeaturelayer;
IAnnotateLayerPropertiesCollection pAnnoLayerPropsCollection;
pAnnoLayerPropsCollection = pGeoFeaturelayer.AnnotationProperties;
pAnnoLayerPropsCollection.Clear();
//stdole.IFontDisp pFont; //字体
ITextSymbol pTextSymbol;
//pFont.Name = "新宋体";
//pFont.Size = 9;
//未指定字体颜色则默认为黑色
if (pRGB == null)
{
pRGB = new RgbColorClass();
pRGB.Red = 0;
pRGB.Green = 0;
pRGB.Blue = 0;
}
pTextSymbol = new TextSymbolClass();
pTextSymbol.Color = (IColor)pRGB;
pTextSymbol.Size = size; //标注大小
IBasicOverposterLayerProperties4 pBasicOverposterlayerProps4 = new BasicOverposterLayerPropertiesClass();
switch (pFeaturelayer.FeatureClass.ShapeType)//判断图层类型
{
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon:
pBasicOverposterlayerProps4.FeatureType = esriBasicOverposterFeatureType.esriOverposterPolygon;
break;
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint:
pBasicOverposterlayerProps4.FeatureType = esriBasicOverposterFeatureType.esriOverposterPoint;
break;
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline:
pBasicOverposterlayerProps4.FeatureType = esriBasicOverposterFeatureType.esriOverposterPolyline;
break;
}
pBasicOverposterlayerProps4.PointPlacementMethod = esriOverposterPointPlacementMethod.esriRotationField;
pBasicOverposterlayerProps4.RotationField = angleField;
ILabelEngineLayerProperties pLabelEnginelayerProps = new LabelEngineLayerPropertiesClass();
pLabelEnginelayerProps.Expression = "[" + sLableField + "]";
pLabelEnginelayerProps.Symbol = pTextSymbol;
pLabelEnginelayerProps.BasicOverposterLayerProperties = pBasicOverposterlayerProps4 as IBasicOverposterLayerProperties;
pAnnoLayerPropsCollection.Add((IAnnotateLayerProperties)pLabelEnginelayerProps);
pGeoFeaturelayer.DisplayAnnotation = true;//很重要,必须设置
//axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground, null, null); }
}
参考文章
ArcGIS Engine标注(Label)
没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。
本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/5903623.html
,如需转载请自行联系原作者