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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于WOA优化的Bi-LSTM多输入回归预测(Matlab)鲸鱼算法优化双向长短期神经网络回归预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 鲸鱼优化算法&#xff08;WOA&#xff09;&#xff1a; 双向长短期神经网络&#xff08;Bi-LSTM&#xff09;&#xff1a…

raspi_os 32-bit lite下使用摄像头

前置条件&#xff1a;已经烧录32位版本的raspi os 按照如下步骤即可使用摄像头&#xff1a; 将SD卡放入读卡器插到电脑上根目录下打开config.txtctrl f 查找到camera_auto_detect1将其注释定位到文件末尾添加如下 gpu_mem128 start_x1将SD卡放回树莓派启动&#xff0c;键入…

VMware下安装银河麒麟V10操作系统

VMware下安装银河麒麟V10操作系统 文章目录 下载在VMware中应用编辑虚拟机设置 在麒麟系统内安装 下载 官网下载&#xff1a;https://www.kylinos.cn/ 银河麒麟、中标麒麟、开放麒麟、星光麒麟 在VMware中应用 1.新建虚拟机 2.稍后安装操作系统 3.新建虚拟机向导&#xff0…

【无标题】力扣报错:member access within null pointer of type ‘struct ListNode‘

项目场景&#xff1a; 做单链表反转题目&#xff0c;报错&#xff1a;member access within null pointer of type ‘struct ListNode’ 题目链接:LINK 问题描述 我明明在初始化指针时候&#xff0c;已经处理了n2->next情况却依然报错 这个报错提示含义是&#xff1a;大概就…

Photoshop 2023(Ps)下载安装及详细安装教程

Photoshop(Ps)的介绍 Adobe Photoshop&#xff0c;简称“PS”&#xff0c;是由AdobeSystems开发和发行的图像处理软件。Photoshop主要处理以像素所构成的数字图像。使用其众多的编修与绘图工具&#xff0c;可以有效地进行图片编辑和创造工作。PS有很多功能&#xff0c;在图像、…

拼夕夕 拼多多关键词恢复供应,欢迎骚扰

API接口&#xff08;Application Programming Interface&#xff09;是一种定义了软件组件之间交互的规范。它允许不同的软件系统之间进行通信和数据交换&#xff0c;使得开发者可以利用已有的功能和服务来构建自己的应用程序。 API接口可以分为不同的类型&#xff0c;包括Web …

代理模式(Proxy模式)

所谓的代理&#xff0c;就是一个人或者一个机构代替另一个人或者另一个机构去做一些事情&#xff08;类似于中介或者代理商&#xff09;。 代理的种类 远程代理&#xff1a;为一个位于不同的地址空间的对象提供一个局域代表对象。 虚拟代理&#xff1a;根据需要创建一个资源消…

【LeetCode: 590. N 叉树的后序遍历 + DFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

C#使用 AutoUpdater.NET 实现程序自动更新

写在前面 开发桌面应用程序的时候&#xff0c;经常会因为新增功能需求或修复已知问题&#xff0c;要求客户更新应用程序&#xff0c;为了更好的服务客户&#xff0c;通常会在程序启动时判断版本变更情况&#xff0c;如发现新版本则自动弹出更新对话框&#xff0c;提醒客户更新…

k8s学习(RKE+k8s+rancher2.x)成长系列之简配版环境搭建(四)之Helm及cert-manager安装

安装Helm(三台都安装) 下载helm安装包并加入执行目录 tar zxf helm-v3.2.4-linux-amd64.tar.gz cd linux-amd64 cp helm /usr/bin/ helm version添加rancher稳定版仓库(三台都安装) helm repo add rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/serve…

c#程序应用程序设置文件Settings.settings详解

https://blog.csdn.net/wqq1027/article/details/84873014 应用程序设置 应用程序设置使您能够动态存储和检索应用程序的属性设置和其他信息。 还使您能够维护客户端计算机上的自定义应用程序和用户首选项。 通常这些数据&#xff08;如连接字符串&#xff09;对于运行应用程序…

RichAF 中文版(下)

原文&#xff1a;Rich AF : The Winning Money Mindset That Will Change Your Life 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 五、我出生时不是富人&#xff0c;但我的孩子会是 投资部分 当涉及投资时&#xff0c;我有三个关于致富的真相要分享&#xff1a; …

mysql同类型的多行变成一行value1和value2不同的列

关键字 row_number() over (partition by) 例如&#xff0c;下面的数据&#xff0c; 这是按照name分组后&#xff0c;展示property值。 我们想得到这样的值; 第一步&#xff1a;将每一组的property标上序号 select name,property,row_number() over (partition by name order…

CSS实现两栏布局,左侧固定宽高,右侧超高滚动加载

要实现左侧子元素高度固定&#xff0c;右侧子元素超高滚动加载&#xff0c;并且左侧子元素与父级元素高度一致且不跟随滚动&#xff0c;可以使用CSS的flex布局和overflow属性来实现。 首先&#xff0c;将父级元素设置为flex布局&#xff0c;并将其分为左右两个子元素。左侧子元…

hpp文件:C++开发中的利器

1 什么是hpp文件&#xff1f; hpp文件是C程序中一种特殊头文件&#xff0c;它可以包含类的声明和实现。与传统的h文件相比&#xff0c;hpp文件具有以下特点&#xff1a; 将类的声明和实现放在同一个文件里&#xff0c;减少了代码量&#xff0c;提高了代码的可读性。无需再将c…

Django学习笔记-创建第一个django项目

1.创建一个虚拟环境的python项目 2.点击解释器设置 3.安装django包 4.终端选择Command Prompt 5.创建django项目运行django-admin startproject demo01(自命名) 6.修改连接数据库为mysql 7.修改语言(中国汉语)和时区(亚洲上海)USE_TZ改为False,否则时区不生效 8.修改TEMPLA…

并发List、Set、ConcurrentHashMap底层原理

并发List、Set、ConcurrentHashMap底层原理 ArrayList: List特点&#xff1a;元素有放入顺序&#xff0c;元素可重复 存储结构&#xff1a;底层采用数组来实现 public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Clon…

基于Java的车辆租赁管理平台/租车系统

功能介绍 平台采用B/S结构&#xff0c;后端采用主流的Springboot框架进行开发&#xff0c;前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 前台功能包括&#xff1a;首页、车辆详情、车辆预订、用户中心模块。后台功能包括&#xff1a;车辆管理、分类管理…

从入门到精通:AI绘画与修图实战指南

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在这篇文章中&#xff0c;我们将深入探讨如何利…

android通过广播打印ram使用信息

在内存非常吃紧的情况下&#xff0c;android设备会开始kill部分非系统进程甚至系统进程来保证基本的系统运行。在这种情况下如何获取设备过去某段时间的ram使用情况至关重要。 通过开发者模式中的“内存”可以完美得知设备内存使用信息。 我们可以通过此途径&#xff0c;设计一…