【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); }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/403261.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网站常见的攻击类型有什么,如何针对性防护

在互联网时代&#xff0c;几乎每个网站都存在着潜在的安全威胁。这些威胁可能来自人为失误&#xff0c;也可能源自网络犯罪团伙所发起的复杂攻击。无论攻击的本质如何&#xff0c;网络攻击者的主要动机通常是谋求经济利益。这意味着不管是什么网站类型潜在的威胁一直都存在。 在…

关于2025年的AMC8竞赛,你可能感兴趣的一些问题和信息

最近几天&#xff0c;我分享了一些历年的AMC8数学竞赛真题和解析&#xff0c;有一些家长和孩子第一次接触&#xff0c;产生了浓厚的兴趣&#xff0c;并且问了许多关于AMC8的问题。为了帮助更多家长和孩子了解这个比赛&#xff0c;我把常见的问题&#xff0c;以及大家可能感兴趣…

[java基础揉碎]封装

封装介绍 封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部&#xff0c;程序的其它部分只有通过被授权的操作[方法],才能对数据进行操作。 比如说我们用遥控器对电视的操作, 我们按电视机的开关键, 其实开关背后是一个复杂的过程,…

Codeforces Round 927 (Div. 3)

F. Feed Cats 题目大意 给一长度为的数轴&#xff0c;个区间在数轴上选取一些点作为特殊点在满足个区间中&#xff0c;每个区间内只能有一个特殊点问最多能选多少个特殊点 解题思路 对于每个点有放或不放两种状态考虑表示位置可能放或不放的最优结果若不放&#xff0c;若放…

unity hub初学配置

1、安装Unity Hub 2、设置中文 3、安装编辑器 4、新建项目 5、新建完成后进入编辑器 6、 编辑器设置中文 editPreferencesLanguages选择中文

数据安全治理实践路线(上)

基于以上数据安全治理实践理念&#xff0c;可以按照自顶向下和自底向上相结合的思路推进实践过程。一方面&#xff0c;组织自顶向下,以数据安全战略规划为指导,以规划、建设、运营、优化为主线&#xff0c;围绕构建数据安全治理体系这一核心&#xff0c;从组织架构、制度流程、…

SQL注入:使用预编译防御SQL注入时产生的问题

目录 前言 模拟预编译 真正的预编译 预编译中存在的SQL注入 宽字节 没有进行参数绑定 无法预编译的位置 前言 相信学习过SQL注入的小伙伴都知道防御SQL注入最好的方法&#xff0c;就是使用预编译也就是PDO是可以非常好的防御SQL注入的&#xff0c;但是如果错误的设置了…

【C语言】socket 层到网络接口的驱动程序之间的函数调用过程

一、socket 层到网络接口的驱动程序之间的函数调用过程概述 在 Linux 操作系统中&#xff0c;socket 层到网络接口的驱动程序之间的函数调用过程相对复杂&#xff0c;涉及多个层次的交互。以下是一个简化的概述&#xff0c;描述数据从 socket 传递到硬件驱动&#xff0c;再到硬…

新书推荐:《分布式商业生态战略:未来数字商业新逻辑与企业数字化转型新策略》

近两年&#xff0c;商业经济环境的不确定性越来越明显&#xff0c;市场经济受到疫情、技术、政策等多方因素影响越来越难以预测&#xff0c;黑天鹅事件时有发生。在国内外经济方面&#xff0c;国际的地缘政治对商业经济产生着重大的影响&#xff0c;例如供应链中断&#xff0c;…

PostgreSQL 实体化视图的使用

上周的教程中&#xff0c;通过 DVD Rental Database 示例&#xff0c;让我们了解了在 PostgreSQL 中创建实体化视图的过程。正如我们所了解的&#xff0c;PostgreSQL 实体化视图提供了一种强大的机制&#xff0c;通过预计算和存储查询结果集为物理表来提高查询性能。接下来的内…

C#_扩展方法

简述&#xff1a; 扩展方法所属类必需是静态类&#xff08;类名依据规范通常为XXXExtension&#xff0c;XXX为被扩展类&#xff09;扩展方法必需是公有的静态方法扩展方法的首个参数由this修饰&#xff0c;参数类型为被扩展类型 示例&#xff1a; static class DoubleExtens…

vue实现拖拽(vuedraggable)

实现效果: 左侧往右侧拖动&#xff0c;右侧列表可以进行拖拽排序。 安装引用&#xff1a; npm install vuedraggable import draggable from vuedraggable 使用&#xff1a; data数据&#xff1a; componentList: [{groupName: 考试题型,children: [{componentType: danxua…

【基础】提高前端的增益

低噪声&#xff0c;低偏移电压&#xff0c;低漂移-当你把信号链前端的增益提高后&#xff0c;所有的这些精密小信号处理的目标变得很简单。 这是一个很简单的概念。如图1所示&#xff0c;第二级的误差将除以第一级的增益。比如&#xff0c;第一级增益适度&#xff0c;值为10&a…

制造业客户数据安全解决方案(终端安全/文件加密/介质管理等)

针对前文制造业客户数据安全解决方案&#xff08;数据防泄密需求分析&#xff09;提到的泄密风险&#xff0c;本文详细介绍一套完整、合理的解决方案&#xff0c;通过该方案构建公司数据安全防护边界&#xff0c;自动加密、全方位保护数据安全。 PC端&#xff1a;https://isite…

Qt开发:MAC安装qt、qtcreate(配置桌面应用开发环境)

安装qt-creator brew install qt-creator安装qt brew install qt查看qt安装路径 brew info qtzhbbindembp ~ % brew info qt > qt: stable 6.6.1 (bottled), HEAD Cross-platform application and UI framework https://www.qt.io/ /opt/homebrew/Cellar/qt/6…

创建一个基于Node.js的实时聊天应用

在当今数字化社会&#xff0c;实时通讯已成为人们生活中不可或缺的一部分。无论是在社交媒体平台上与朋友交流&#xff0c;还是在工作场合中与同事协作&#xff0c;实时聊天应用都扮演着重要角色。与此同时&#xff0c;Node.js作为一种流行的后端技术&#xff0c;为开发者提供了…

10大数据恢复软件可以帮助您恢复电脑数据

您可能会非常紧张&#xff0c;因为知道有人意外地从您的硬盘驱动器中删除了您的宝贵数据&#xff08;甚至使用 ShiftDelete 从回收站中删除&#xff09;&#xff0c;并且您确实需要这些数据&#xff0c;并且没有其他备份源可以在其中找到这些数据。不要担心&#xff0c;保持冷静…

B² NETWORK空投

空投要点 众多大机构支持&#xff0c;是为数不多的有 Bitcoin 主网验证 Rollup 解决方案的 BTC Layer2&#xff0c;提前埋伏其实是普通人抢早期筹码最好的方式&#xff0c;参加 B Buzz 就是手握金铲子&#xff0c;对标eth二层网络的繁荣程度你就能想象这个前景明牌空投5%给早期…

Kotlin 进阶 学习 委托

1.接口委托 package com.jmj.jetpackcomposecompositionlocal.byStudy/*** 接口委托*/ interface HomeDao{fun getAllData():List<String> }interface ADao{fun getById(id:Int):String }class HomeDaoImpl:HomeDao{override fun getAllData(): List<String> {ret…

useRef有什么用?

看一下官网定义 useRef是一个React Hook&#xff0c;它能帮助引用一个不需要渲染的值 这句话透露出一个信息&#xff0c;不需要渲染的值可以用useRef引用&#xff0c;那需要渲染的值用什么引用呢&#xff1f;当然是useState了&#xff0c;需要渲染的值指的就是状态嘛&#xff0…