1、需求
选择地图中的某一要素图层的属性,在地图中对其进行标注,同时,标注的颜色、字号、字体可以进行修改。另外,取消不需要的图层标注。
2、解决方案
1、控制图层标注的显示或隐藏通过IGeoFeatureLayer.DisplayAnnotation属性设置;
2、IAnnotateLayerPropertiesCollection接口操作要素类图层,包括清除图层标注等;
3、ILabelEngineLayerProperties接口实现对图层标注样式的定义;
4、ITextSymbol接口实现对字体颜色、字体、字号等的定义。
3、界面设计
总共有三个界面,分别是主界面、标记界面、取消标记界面
(1)主界面
(2)标注界面
(3)取消标注界面
4、代码实现
(1)封装方法
//标注图层
public void FunLabelFeatureLayer(IFeatureLayer pFeaturelayer, string sLableField, IRgbColor pRGB, ITextSymbol textSymbol)
{
//判断图层是否为空
if (pFeaturelayer == null)
return;
IGeoFeatureLayer pGeoFeaturelayer = (IGeoFeatureLayer)pFeaturelayer;
IAnnotateLayerPropertiesCollection pAnnoLayerPropsCollection;
pAnnoLayerPropsCollection = pGeoFeaturelayer.AnnotationProperties;
pAnnoLayerPropsCollection.Clear();
//未指定字体颜色则默认为黑色
if (pRGB == null)
{
pRGB = new RgbColor();
pRGB.Red = 0;
pRGB.Green = 0;
pRGB.Blue = 0;
}
IBasicOverposterLayerProperties pBasicOverposterlayerProps = new BasicOverposterLayerProperties();
switch (pFeaturelayer.FeatureClass.ShapeType)//判断图层类型
{
case esriGeometryType.esriGeometryPolygon:
pBasicOverposterlayerProps.FeatureType = esriBasicOverposterFeatureType.esriOverposterPolygon;
break;
case esriGeometryType.esriGeometryPoint:
pBasicOverposterlayerProps.FeatureType = esriBasicOverposterFeatureType.esriOverposterPoint;
break;
case esriGeometryType.esriGeometryPolyline:
pBasicOverposterlayerProps.FeatureType = esriBasicOverposterFeatureType.esriOverposterPolyline;
break;
}
ILabelEngineLayerProperties pLabelEnginelayerProps = new LabelEngineLayerProperties() as ILabelEngineLayerProperties;
pLabelEnginelayerProps.Expression = "[" + sLableField + "]";
pLabelEnginelayerProps.Symbol = textSymbol;
pLabelEnginelayerProps.BasicOverposterLayerProperties = pBasicOverposterlayerProps;
pAnnoLayerPropsCollection.Add((IAnnotateLayerProperties)pLabelEnginelayerProps);
pGeoFeaturelayer.DisplayAnnotation = true;
}
/// <summary>
/// 获取待要素类的所有属性字段名
/// </summary>
/// <param name="pFeatureClass">待复制要素类</param>
/// <returns>返回待复制要素类的所有属性字段名</returns>
public static List<string> get_FieldsString(IFeatureClass pFeatureClass)
{
IFields pFields = pFeatureClass.Fields;
IField pField;
List<string> s = new List<string>();
for (int i = 0; i < pFields.FieldCount; i++)
{
pField = pFields.Field[i];
if (pField.Type != esriFieldType.esriFieldTypeGeometry)
s.Add(pField.Name);
}
return s;
}
/// <summary>
/// Color转IColor
/// </summary>
/// <param name="color"></param>
/// <returns></returns>
public static IColor ColorToIColor(Color color)
{
IColor pColor = new RgbColorClass();
pColor.RGB = color.B * 65536 + color.G * 256 + color.R;
return pColor;
}
(2)确定按钮事件(标注图层)
private void btnOK_Click(object sender, EventArgs e)
{
#region 输入条件判断
if (cbxLayers.Text.Trim() == "")
{
MessageBox.Show("请选择标注要素!", "提示");
return;
}
if (cbxFields.Text.Trim() == "")
{
MessageBox.Show("请选择标注字段!", "提示");
return;
}
#endregion
LabelField = cbxFields.Text;
string layerName = cbxLayers.Text;
IFeatureLayer pFeatureLayer=null;
for (int i = 0; i < pMap.LayerCount; i++)
{
if ((pMap.Layer[i] is FeatureLayer) && (pMap.Layer[i].Name == cbxLayers.Text))
{
pFeatureLayer = pMap.Layer[i] as IFeatureLayer;
break;
}
}
//产生文本符号
ITextSymbol pTextSymbol = new TextSymbolClass();
pTextSymbol.Font = pFontDisp;
pTextSymbol.Color = ColorToIColor(pColor);
FunLabelFeatureLayer(pFeatureLayer, LabelField, MyColor, pTextSymbol);
IActiveView pActiveView = pMap as IActiveView;
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
pFeatureLayer.ShowTips = true;
}
(3)字体及文字颜色设置按钮事件
/设置字体
private void btnStyle_Click(object sender, EventArgs e)
{
System.Drawing.Font font = null;
FontDialog fontDialog = new FontDialog();
if (fontDialog.ShowDialog() == DialogResult.OK)
{
font = fontDialog.Font;
pFontDisp.Name = font.Name;
pFontDisp.Size = (decimal)font.Size;
pFontDisp.Italic = font.Italic;
pFontDisp.Bold = font.Bold;
pFontDisp.Underline = font.Underline;
}
else
{
return;
}
richTextBox1.Font = font;
}
//设置文字颜色
private void simpleButton1_Click(object sender, EventArgs e)
{
ColorDialog colorDialog = new ColorDialog();
if (colorDialog.ShowDialog() == DialogResult.OK)
{
pColor = colorDialog.Color;
richTextBox1.ForeColor = pColor;
}
else
{
return;
}
}
5、代码下载
github: ArcEngine要素属性标注及取消标注 。