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

这篇具有很好参考价值的文章主要介绍了【ArcGIS Pro二次开发】(56):界址点导出Excel。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

【ArcGIS Pro二次开发】(56):界址点导出Excel,ArcGIS,ArcGIS Pro SDK,excel,Arcgis Pro SDK,二次开发,arcgis pro sdk,界址表

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


一、要实现的功能

【ArcGIS Pro二次开发】(56):界址点导出Excel,ArcGIS,ArcGIS Pro SDK,excel,Arcgis Pro SDK,二次开发,arcgis pro sdk,界址表

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

【ArcGIS Pro二次开发】(56):界址点导出Excel,ArcGIS,ArcGIS Pro SDK,excel,Arcgis Pro SDK,二次开发,arcgis pro sdk,界址表

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

1、输入地块要素图层。

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

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

生成结果如下:

【ArcGIS Pro二次开发】(56):界址点导出Excel,ArcGIS,ArcGIS Pro SDK,excel,Arcgis Pro SDK,二次开发,arcgis pro sdk,界址表

Excel内容如下:

【ArcGIS Pro二次开发】(56):界址点导出Excel,ArcGIS,ArcGIS Pro SDK,excel,Arcgis Pro SDK,二次开发,arcgis pro sdk,界址表

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


二、实现流程

核心代码直接放上。

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

其中一些对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文件直接安装。文章来源地址https://www.toymoban.com/news/detail-627935.html

到了这里,关于【ArcGIS Pro二次开发】(56):界址点导出Excel的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【ArcGIS Pro二次开发】(63):批量更改字段别名

    【ArcGIS Pro二次开发】(63):批量更改字段别名

    在我工作中遇到的大多数图斑,字段名称一般是英文,字段别名是中文,使用起来是比较方便的。 但有时候也会遇到一些不一样的情况,不知是经过了怎样的处理,图斑的字段别名被修改成了和字段名称一样的英文,这样就很理解字段名称的意思,特别是其它专业、不熟悉的

    2024年02月11日
    浏览(78)
  • 【ArcGIS Pro二次开发】(59):Editing(编辑)模块

    ArcGIS Pro SDK中的\\\"Editing\\\"(编辑)模块提供了一系列API和工具,允许开发人员在ArcGIS Pro中实现各种地图数据编辑操作,从简单的要素绘制到复杂的数据集编辑。 下面列举一些常用编辑工具的实现方法。 1、获取所选要素的属性及赋值 2、通过【inspector】获取字段属性 3、裁剪面

    2024年02月13日
    浏览(10)
  • 【ArcGIS Pro二次开发】(80):标注_CIMLabelClass

    CIMLabelClass(Cartographic Information Model Label Class)是ArcGIS Pro SDK中的一个类。 它主要用于定义标签的样式和属性,如字体、大小、颜色、对齐方式等,以及标签的排列和布局规则。 1、获取当前地图的标签引擎 2、修改当前地图的标签引擎 3、将文字符号TextSymbol应用到要素图层

    2024年02月19日
    浏览(14)
  • 【ArcGIS Pro二次开发】(81):文本符号_CIMTextSymbol

    CIMTextSymbol是用于绘制文本图形注释的文本符号。 0、属性 Angel 文本符号的放置角度 BlockProgression 多行文本的堆叠方向 Callout 引线 DrawSoftHyphen 连字符 FlipAngle 文本翻转(镜像)到位的角度 FontEffects 上下标 FontEncoding 获取文字的Encoding FontFamilyName 字体名称 FontStyleName 字形样式,例

    2024年02月20日
    浏览(16)
  • 【ArcGIS Pro二次开发】(36):度分秒转十进制度

    【ArcGIS Pro二次开发】(36):度分秒转十进制度

    经纬度坐标的表达方式比较常用的一般有2种,【度分秒和十进制度】。 在成果展示中,以【度分秒】居多,但如果要将坐标导入ArcGIS中,则一般需要用到【十进制度】,这个转换可以在Excel中进行,也可以在ArcGIS中的字段计算里计算,但都有点小麻烦。 为了更方便的转换,

    2024年02月09日
    浏览(11)
  • 【ArcGIS Pro二次开发】(58):数据的本地化存储

    【ArcGIS Pro二次开发】(58):数据的本地化存储

    在做村规工具的过程中,需要设置一些参数,比如说导图的DPI,需要导出的图名等等。 每次导图前都需要设置参数,虽然有默认值,但还是需要不时的修改。 在使用的过程中,可能会有一些常用的参数,希望能够保存下来,而不是每次都去修改默认值。 于是,想到可以将这

    2024年02月14日
    浏览(12)
  • 【ArcGIS Pro二次开发】(45):手搓一个工具执行进度框

    【ArcGIS Pro二次开发】(45):手搓一个工具执行进度框

    我在之前做的工具中,UI这部分基本没怎么深入,都是直接用现成的控件。 其中有一个问题比较突出,就是没有工具执行的进度框提示。曾经也用过系统自带的信息提示框和进度条,但太简陋,确实不好用。于是就想抄一个进度框来用,自然而然想到了ArcGIS中地理工具执行时

    2024年02月13日
    浏览(28)
  • 【ArcGIS Pro二次开发】(49):村规数据入库【福建省】

    【ArcGIS Pro二次开发】(49):村规数据入库【福建省】

    之前用Arcpy脚本工具做了一个村规数据入库和主要图纸生成工具。 在使用过程中,感觉对电脑环境比较高,换电脑用经常会一些莫名其妙的错误,bug修得很累。近来随着ArcGIS Pro SDK的熟悉,就有了移植的想法。 这里先把村规数据入库工具做出来,后续还将继续做主要图纸生成

    2024年02月16日
    浏览(9)
  • 【ArcGIS Pro二次开发】(61):样式(Style)和符号(Symbol)

    在 ArcGIS Pro SDK 中,地图要素符号(Symbol)和符号样式(Style)是2个很重要的概念。 【Symbol】是用于表示地图上不同类型的要素(如点、线、面)的图形化表示。 在地图中,各种要素都需要通过符号来展示,符号通常包括颜色、线型、填充样式、大小等属性。在 ArcGIS Pro SDK

    2024年02月11日
    浏览(63)
  • 【ArcGIS Pro二次开发】(50):布局(Layout)的基本操作

    ArcGIS Pro SDK中的布局(Layout)是用于创建和编辑打印布局的一组功能。 Layout是打印布局的容器,它可以包含多个元素,例如地图框、文本框、图例、比例尺等。 Layout中包含多种元素,比较重要的有:地图(MapFrameElement)、文本(TextElement)、图片(PictureElement)、图例(LegendElement)等。

    2024年02月16日
    浏览(18)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包