【ArcGIS Pro二次开发】(82):玩个花活_控规指标块生成

2024-02-20 11:44

本文主要是介绍【ArcGIS Pro二次开发】(82):玩个花活_控规指标块生成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、要实现的效果

废话不多说,这次要实现的是类似控规指标块的标注:

这里只是示例,用了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}</PART><PART position=\"left\">${$feature.DLBM}</PART><PART position=\"middle\">${$feature.TBBH}</PART><PART position=\"right\">${$feature.ZLDWMC}</PART><PART 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}</PART><PART position=\"left\">${$feature.DLBM}</PART><PART position=\"middle\">${$feature.TBBH}</PART><PART position=\"right\">${$feature.ZLDWMC}</PART><PART 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); }

这篇关于【ArcGIS Pro二次开发】(82):玩个花活_控规指标块生成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/728110

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

C/C++随机数生成的五种方法

《C/C++随机数生成的五种方法》C++作为一种古老的编程语言,其随机数生成的方法已经经历了多次的变革,早期的C++版本使用的是rand()函数和RAND_MAX常量,这种方法虽然简单,但并不总是提供... 目录C/C++ 随机数生成方法1. 使用 rand() 和 srand()2. 使用 <random

Flask 验证码自动生成的实现示例

《Flask验证码自动生成的实现示例》本文主要介绍了Flask验证码自动生成的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 目录生成图片以及结果处理验证码蓝图html页面展示想必验证码大家都有所了解,但是可以自己定义图片验证码

Python如何在Word中生成多种不同类型的图表

《Python如何在Word中生成多种不同类型的图表》Word文档中插入图表不仅能直观呈现数据,还能提升文档的可读性和专业性,本文将介绍如何使用Python在Word文档中创建和自定义各种图表,需要的... 目录在Word中创建柱形图在Word中创建条形图在Word中创建折线图在Word中创建饼图在Word

nginx生成自签名SSL证书配置HTTPS的实现

《nginx生成自签名SSL证书配置HTTPS的实现》本文主要介绍在Nginx中生成自签名SSL证书并配置HTTPS,包括安装Nginx、创建证书、配置证书以及测试访问,具有一定的参考价值,感兴趣的可... 目录一、安装nginx二、创建证书三、配置证书并验证四、测试一、安装nginxnginx必须有"-

Java实战之利用POI生成Excel图表

《Java实战之利用POI生成Excel图表》ApachePOI是Java生态中处理Office文档的核心工具,这篇文章主要为大家详细介绍了如何在Excel中创建折线图,柱状图,饼图等常见图表,需要的... 目录一、环境配置与依赖管理二、数据源准备与工作表构建三、图表生成核心步骤1. 折线图(Line Ch

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为