海口网络平台网站开发,优化营商环境,专业软件开发培训机构,大连网站建设怎么做一、要实现的效果
废话不多说#xff0c;这次要实现的是类似控规指标块的标注#xff1a; 这里只是示例#xff0c;用了5个格子#xff0c;做成9个格子也是可以的。
实现这个效果最关键的是要用到Pro中的复合标注。
关于复合标注的用法可以搜一下帮助里的【使用复合注释…一、要实现的效果
废话不多说这次要实现的是类似控规指标块的标注 这里只是示例用了5个格子做成9个格子也是可以的。
实现这个效果最关键的是要用到Pro中的复合标注。
关于复合标注的用法可以搜一下帮助里的【使用复合注释的标注】 这里要介绍的是如何在SDK实现复合标注的功能。 二、实现思路
1、获取标注类CIMLabelClass
常规操作获取图层——图层定义——标注类。
// 获取图层
FeatureLayer featureLayer MapView.Active.GetSelectedLayers().FirstOrDefault() as FeatureLayer;
// 获取图层定义
CIMFeatureLayer lyrDefn featureLayer.GetDefinition() as CIMFeatureLayer;// 获取标注
var listLabelClasses lyrDefn.LabelClasses.ToList();
CIMLabelClass theLabelClass listLabelClasses.FirstOrDefault();
2、修改标注表达式
将标注语言修改为Arcade这里官方推荐用Arcade我也就用它了。
按照帮助里的写法根据图层的字段修改一下表达式。
// 设置标注语言为Arcade
theLabelClass.ExpressionEngine LabelExpressionEngine.Arcade;
// 设置标注内容
string code PART position\top\${$feature.DLMC}/PARTPART position\left\${$feature.DLBM}/PARTPART position\middle\${$feature.TBBH}/PARTPART position\right\${$feature.ZLDWMC}/PARTPART position\bottom\${$feature.QSXZ}/PART;theLabelClass.Expression code;
这里实际上是复制了在Pro里的手动操作对应的在Pro里的操作步骤如下 3、设置标注符号
首先获取图层自身的标注符号然后在这个基础上进行修改。
// 创建一个标注符号CIMTextSymbol
CIMTextSymbol textSymbol theLabelClass.TextSymbol.Symbol as CIMTextSymbol;
设置文本的前后缩进不然文字会挤在一起不美观。
// 设置文本前后缩进
textSymbol.IndentAfter 5;
textSymbol.IndentBefore 5;
以上都是常规设置下面是最重要的复合标注的设置。
新建一个注释类CIMCompositeCallout。
// 创建一个CIMCompositeCallout
CIMCompositeCallout ccs new CIMCompositeCallout();
给它创建一个背景符号设置背景颜色、形式、边框颜色等并应用。
// 创建一个面符号CIMPolygonSymbol
CIMPolygonSymbol polySymbol SymbolFactory.Instance.ConstructPolygonSymbol(ColorFactory.Instance.CreateRGBColor(170, 241, 247, 50), SimpleFillStyle.Solid);
// 设置边框线颜色
polySymbol.SetOutlineColor(ColorFactory.Instance.CreateRGBColor(0, 0, 255, 80));// 应用面符号
ccs.BackgroundSymbol polySymbol;
默认的边框拐角挺碍眼给它取消掉。
// 拐角半径
ccs.CornerRadius 0;
文字的边距也设置下这个随意美观为主。
// 边距
ccs.Margin new CIMTextMargin()
{Left 2, Top 2, Right 2, Bottom 2
};
对应的Pro操作如下 下一步是对复合标注各个位置属性的设置。
示例里用到了5个格子所以只设置【top、left、middle、right、bottom】5个部件就行了。
// 设置各部分属性
CIMCompositeTextPartPosition top new CIMCompositeTextPartPosition()
{IsPartWithinCalloutBox true,VerticalAlignment VerticalAlignment.Bottom,HorizontalAlignment HorizontalAlignment.Center,
};
CIMCompositeTextPartPosition left new CIMCompositeTextPartPosition()
{IsPartWithinCalloutBox true,VerticalAlignment VerticalAlignment.Center,HorizontalAlignment HorizontalAlignment.Right,
};
CIMCompositeTextPartPosition middle new CIMCompositeTextPartPosition()
{IsPartWithinCalloutBox true,VerticalAlignment VerticalAlignment.Center,
};
CIMCompositeTextPartPosition right new CIMCompositeTextPartPosition()
{IsPartWithinCalloutBox true,VerticalAlignment VerticalAlignment.Center,HorizontalAlignment HorizontalAlignment.Left,
};
CIMCompositeTextPartPosition bottom new CIMCompositeTextPartPosition()
{IsPartWithinCalloutBox true,VerticalAlignment VerticalAlignment.Top,
};ccs.Top top;
ccs.Left left;
ccs.Middle middle;
ccs.Right right;
ccs.Bottom bottom;
这里设置的主要内容是在标注框内包含元素水平和垂直对齐。
其实还可以设置XY偏移等内容看需要吧。
对应的Pro操作如下 最后应用标注给图层就行了。
// 应用标注符号
textSymbol.Callout ccs;// 应用标注设置
lyrDefn.LabelClasses[0] theLabelClass; // 假设只有一个标注类别// 应用标注
featureLayer.SetDefinition(lyrDefn);// 打开标注
if (!featureLayer.IsLabelVisible) { featureLayer.SetLabelVisibility(true); } 三、完整代码
// 获取图层
FeatureLayer featureLayer MapView.Active.GetSelectedLayers().FirstOrDefault() as FeatureLayer;
// 获取图层定义
CIMFeatureLayer lyrDefn featureLayer.GetDefinition() as CIMFeatureLayer;// 获取标注
var listLabelClasses lyrDefn.LabelClasses.ToList();
CIMLabelClass theLabelClass listLabelClasses.FirstOrDefault();// 设置标注语言为Arcade
theLabelClass.ExpressionEngine LabelExpressionEngine.Arcade;
// 设置标注内容
string code PART position\top\${$feature.DLMC}/PARTPART position\left\${$feature.DLBM}/PARTPART position\middle\${$feature.TBBH}/PARTPART position\right\${$feature.ZLDWMC}/PARTPART position\bottom\${$feature.QSXZ}/PART;theLabelClass.Expression code;// 创建一个标注符号CIMTextSymbol
CIMTextSymbol textSymbol theLabelClass.TextSymbol.Symbol as CIMTextSymbol;
// 设置文本前后缩进
textSymbol.IndentAfter 5;
textSymbol.IndentBefore 5;// 创建一个CIMCompositeCallout
CIMCompositeCallout ccs new CIMCompositeCallout();// 创建一个面符号CIMPolygonSymbol
CIMPolygonSymbol polySymbol SymbolFactory.Instance.ConstructPolygonSymbol(ColorFactory.Instance.CreateRGBColor(170, 241, 247, 50), SimpleFillStyle.Solid);
// 设置边框线颜色
polySymbol.SetOutlineColor(ColorFactory.Instance.CreateRGBColor(0, 0, 255, 80));// 应用面符号
ccs.BackgroundSymbol polySymbol;
// 拐角半径
ccs.CornerRadius 0;
// 边距
ccs.Margin new CIMTextMargin()
{Left 2,Top 2,Right 2,Bottom 2
};// 设置各部分属性
CIMCompositeTextPartPosition top new CIMCompositeTextPartPosition()
{IsPartWithinCalloutBox true,VerticalAlignment VerticalAlignment.Bottom,HorizontalAlignment HorizontalAlignment.Center,
};
CIMCompositeTextPartPosition left new CIMCompositeTextPartPosition()
{IsPartWithinCalloutBox true,VerticalAlignment VerticalAlignment.Center,HorizontalAlignment HorizontalAlignment.Right,
};
CIMCompositeTextPartPosition middle new CIMCompositeTextPartPosition()
{IsPartWithinCalloutBox true,VerticalAlignment VerticalAlignment.Center,
};
CIMCompositeTextPartPosition right new CIMCompositeTextPartPosition()
{IsPartWithinCalloutBox true,VerticalAlignment VerticalAlignment.Center,HorizontalAlignment HorizontalAlignment.Left,
};
CIMCompositeTextPartPosition bottom new CIMCompositeTextPartPosition()
{IsPartWithinCalloutBox true,VerticalAlignment VerticalAlignment.Top,
};ccs.Top top;
ccs.Left left;
ccs.Middle middle;
ccs.Right right;
ccs.Bottom bottom;// 应用标注符号
textSymbol.Callout ccs;// 应用标注设置
lyrDefn.LabelClasses[0] theLabelClass; // 假设只有一个标注类别// 应用标注
featureLayer.SetDefinition(lyrDefn);// 打开标注
if (!featureLayer.IsLabelVisible) { featureLayer.SetLabelVisibility(true); }