【ArcGIS Pro二次开发】(56):界址点导出Excel

界址点成果表是地籍测绘中的一种表格,用于记录地块的界址点坐标和相关属性信息。

这个工具的目的就是为了将地块要素导出为界址点成果表。


一、要实现的功能

如上图所示,在【数据处理】组—【Excel相关】面板下,点击【界址点导出Excel】工具。

在弹出的工具框中,分别输入参数:

1、输入地块要素图层。

2、输入名称字段。这里的字段值是为了区分地块,以名称字段值作为标识,1个要素生成1个Excel表格。

3、导出Excel表格所在的文件夹。将导出的多个Excel表格放在文件夹里。

生成结果如下:

Excel内容如下:

目前工具只考虑到简单的面要素,多部件、带空洞的要素还不支持,后续工具继续更新在共享链接里。


二、实现流程

核心代码直接放上。

流程虽然不短,但都是一些基础操作,注释里已经说明,没有什么特别麻烦的地方,就不一一细说了。

其中一些对Excel表格的插入行,合并格等操作是基于Excel模板文件的必要操作,没有什么特别的意思。Excel模板文件也会一块放在共享链接里。

                    // 遍历面要素类中的所有要素using (var cursor = featurelayer.Search()){while (cursor.MoveNext()){using (var feature = cursor.Current as Feature){int rowIndex = 9;   // 起始行int pointIndex = 1;  // 起始点序号// 获取ID和名称string oid = feature["OBJECTID"].ToString();string feature_name = feature[in_field].ToString();// 复制界址点Excel表string excel_path = excel_folder + @$"\{oid} - {feature_name}界址点表.xlsx";ToolManager.CopyResourceFile(@"CCTool.Data.Excel.【模板】界址点表.xlsx", excel_path);// 建立 Excel 应用程序对象Application excelApp = new Application();// 打开 Excel 文件Workbook workbook = excelApp.Workbooks.Open(excel_path);// 获取工作表Worksheet worksheet = workbook.Worksheets["Sheet1"];worksheet.Application.DisplayAlerts = false;      // 禁用警告提示// 获取要素的几何var geometry = feature.GetShape() as ArcGIS.Core.Geometry.Polygon;if (geometry != null){// 计算多边形的面积,并写入double polygonArea = Math.Round(Math.Abs(geometry.Area)/10000, 3);string areaStr = worksheet.Cells[5, 1].value.ToString();worksheet.Cells[5, 1] = areaStr.Replace("ZDMJ", polygonArea.ToString());// 获取面要素的所有折点(顶点)var vertices = geometry.Points;// 输出折点的XY值和距离到Excel表double prevX = double.NaN;double prevY = double.NaN;foreach (var vertex in vertices){// 插入新行if (rowIndex > 13){Range copyRange = worksheet.Range["A13:E14"];    // 选择要复制的单元格范围  copyRange.Copy();    // 复制单元格范围到剪贴板Range pasteRange = worksheet.Range[$"A{rowIndex}"];    // 选择要粘贴的单元格// 将剪贴板中的内容粘贴到指定单元格pasteRange.PasteSpecial(XlPasteType.xlPasteAll, XlPasteSpecialOperation.xlPasteSpecialOperationNone, false, false);}// 写入序号和点号worksheet.Cells[rowIndex, 1] = pointIndex.ToString();worksheet.Cells[rowIndex, 2] = $"J{pointIndex}";double x = vertex.X;double y = vertex.Y;// 写入折点的XY值worksheet.Cells[rowIndex, 3] = x;worksheet.Cells[rowIndex, 4] = y;// 计算当前点与上一个点的距离if (!double.IsNaN(prevX) && !double.IsNaN(prevY)){double distance = Math.Sqrt(Math.Pow(x - prevX, 2) + Math.Pow(y - prevY, 2));worksheet.Cells[rowIndex - 1, 5] = distance;}// 合并距离单元格if (rowIndex > 9){Range mergeRange = worksheet.Range[$"E{rowIndex - 1}:E{rowIndex}"]; // 获取要合并的单元格范围mergeRange.Merge(); // 合并单元格// 设置文字居中mergeRange.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;mergeRange.VerticalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;}prevX = x;prevY = y;rowIndex += 2;pointIndex++;}}// 整理表格for (int row = 9; row <= worksheet.UsedRange.Rows.Count; row++){worksheet.Rows[row].RowHeight = 7.5;   // 设置行高if (row == worksheet.UsedRange.Rows.Count){Range rangeEnd = worksheet.Range[$"E{row}"];//worksheet.Cells[row, 5] = "";rangeEnd.Value = "";         // 清除空距离值rangeEnd.Borders.Color = Microsoft.Office.Interop.Excel.XlRgbColor.rgbBlack;   // 设置边框}}//  保存并关闭 Excel 文件和应用程序对象workbook.Close(true);excelApp.Quit();}}}

三、工具文件分享

我把工具都集合成工具箱,不再单独放单个工具,可以到这里下载完整工具箱,会不断更新:

【ArcGIS Pro二次开发】:CC工具箱https://blog.csdn.net/xcc34452366/article/details/131506345PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。

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

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

相关文章

File 类和 InputStream, OutputStream 的用法总结

目录 一、File 类 1.File类属性 2.构造方法 3.普通方法 二、InputStream 1.方法 2.FileInputStream 三、OutputStream 1.方法 2.FileOutputStream 四、针对字符流对象进行读写操作 一、File 类 1.File类属性 修饰符及类型属性说明static StringpathSeparator依赖于系统的路…

echarts 饼图的label放置于labelLine引导线上方

一般的饼图基础配置后长这样。 想要实现将文本放置在引导线上方&#xff0c;效果长这样 const options {// ...series: [{label: {padding: [0, -40],},labelLine: {length: 10,length2: 50,},labelLayout: {verticalAlign: "bottom",dy: -10,},},], };label.padd…

教您一招解决找素材困难好的方法

创作视频内容时&#xff0c;找到合适的素材是至关重要的。然而&#xff0c;有时候寻找视频素材可能会变得困难。本文将分享一些实用的方法&#xff0c;帮助您轻松解决找视频素材困难的问题。 素材库和在线平台是寻找视频素材的首选方法。 利用专业的视频剪辑工具 在电脑上安…

linux-MySQL的数据目录

总结&#xff1a; window中的my.ini linux 中 /etc/my.cnfwindow中的D:\soft\mysql-5.7.35-winx64\data linux 中 /var/lib/mysql 1.查找与mysql有关的目录 find / -name mysql [rootVM-4-6-centos etc]# find / -name mysql /opt/mysql /etc/selinux/targeted/tmp/modul…

MATLAB(R2023a)添加工具箱TooLbox的方法-以GPOPS为例

一、找到工具箱存放位置 首先我们需要找到工具箱的存放位置&#xff0c;点击这个设置路径可以看到 我们的matlab工具箱的存放位置 C:\Program Files\MATLAB\R2023a\toolbox\matlab 从资源管理器中打开这个位置&#xff0c;可以看到里面各种工具箱 二、放入工具箱 解压我们…

Windows server上用nginx部署vue3项目

Windows server上用nginx部署vue3项目 一、Node中node_modules文件夹及package.json文件的作用说明二、VUE3项目打包三、Windows Server上的Nginx部署 一、Node中node_modules文件夹及package.json文件的作用说明 node_modules是安装node后用来存放用包管理工具下载安装的包的…

Linux中安装Node

安装 先从 官方网站 下载安装包&#xff0c;有时 node 版本太新会导致失败&#xff0c;详见下方的常见问题第2点 cd /home // 创建目录&#xff0c;将下载好的 node 安装包上传到此目录 mkdir Download mkdir /usr/local/lib/node解压 // 解压&#xff0c;前面是文件当前路径…

vue2中使用mock数据发送请求

1.安装 npm i mockjs1.1 2.准备json数据 说明&#xff1a;mock数据需要的图片放置到public文件夹中&#xff08;原封不动的打包到dist文件夹&#xff09; [{"id": "1","imgUrl": "/images/banner1.jpg"},{"id": "2&qu…

基于Orangepi 3 lts 的云台相机

利用orangepi 3 lts 和arduino nano 制作了一个云台相机&#xff0c;可用于室内监控。 硬件&#xff1a; orangepi 3 ,arduino nano ,usb相机&#xff0c;180度舵机两个 WeChat_20230806213004 软件&#xff1a; 整体采用mqtt进行消息的中转。 相机采用python 利用opencv…

Python3 处理PDF之PyMuPDF 入门

PyMuPDF 简介 PyMuPDF是一个用于处理PDF文件的Python库&#xff0c;它提供了丰富的功能来操作、分析和转换PDF文档。这个库的设计目标是提供一个简单易用的API,使得开发者能够轻松地在Python程序中实现PDF文件的各种操作。 PyMuPDF的主要特点如下&#xff1a; 跨平台兼容性&a…

ACL访问控制列表

ACL介绍 acl: 访问控制列表 步骤&#xff1a; 创建一个访问控制规则调用这个规则 ACL的分类和标识 ACL的匹配顺序以及匹配结果 拓扑图 配置 # 首先通过三层交换的实验做一次 ....## 检测ip地址 display ip interface brief## 在交换机2上做配置 [S2]acl name test ?IN…

【Java可执行命令】(十六)诊断命令请求发送工具 jcmd:提供一种简单而强大的方式来管理和监控 Java 进程 ~

Java可执行命令之jcmd 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 jcmd -l&#xff1a;列出正在运行的 Java 进程3.3 jcmd < pid> help&#xff1a;列出特定进程的诊断命令列表3.4 jcmd < pid> < command>&#xff1a;执行诊断命令 4️⃣ 应用场景…