【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文件直接安装。

### 回答1: ArcGIS界址成果是用于记录和管理界址成果格。界址是用来示不动产界限的固定,它们是地籍测量和地籍管理的重要组成部分。 ArcGIS界址成果通常包含以下信息:界址编号、位置坐标、高程、界址类型、附属物信息、界址描述等。界址编号是每个界址的唯一标识符,通过编号可以快速定位和查询特定的界址。位置坐标用来记录界址的地理位置,通常使用经纬度或UTM坐标体系。高程界址的海拔高度,可以在地形图或数字高程模型中获取。界址类型描述了界址的种类,例如角界址、中间界址等。附属物信息包括界址周围的建筑、树木、道路等物体,对界址的环境进行详细描述。界址描述可以包括界址的特征、形状、颜色等详细描述,以便于地籍测量和地籍管理人员进行识别和核对。 ArcGIS界址成果可以通过ArcGIS软件进行创建和编辑,也可以通过导入已有的界址数据进行更新和维护。在地籍测量和地籍管理中,界址成果是一个重要的工具,可以帮助人们准确记录和管理不动产界限信息,提高地籍测量和管理的效率和准确性。 ### 回答2: ArcGIS界址成果是一个记录和展示界址相关数据的格。通常,它包含以下字段: 1. 界址编号:每个界址都有一个唯一的编号,用于标识和区分不同的界址。 2. 坐标信息:记录了界址的经度和纬度坐标,以便在地图上准确地定位界址的位置。 3. 属性信息:包括界址的名称、类型、所属地块、所属行政区等属性,以便对界址进行分类和管理。 4. 区划信息:记录了界址所属的行政区划,例如国家、省、市、县等信息,用于在空间分析和查询时进行筛选和过滤。 5. 界址照片:有时还可以在成果中添加界址的照片,以便更直观地展示界址的实际情况。 通过ArcGIS界址成果,可以方便地对界址进行管理和分析。我们可以使用ArcGIS软件将成果导入到地图中,通过地图进行界址的可视化展示和查询。同时,利用ArcGIS的空间分析功能,可以对界址进行空间关系分析、缓冲区分析等操作,帮助我们更好地理解和利用界址数据。此外,ArcGIS还提供了丰富的地图制图和数据处理工具,可以根据界址成果的数据生成专题地图、空间数据可视化等,从而更好地展示和分析界址数据。使用ArcGIS界址成果,可以让我们更高效地管理和利用界址数据,提高工作效率和决策能力。 ### 回答3: ArcGIS界址成果是一种记录界址调查结果的格。在进行地籍调查或土地规划工作时,经过测绘人员的实地勘测,确定的界址需要记录在成果中,以便后续的土地管理和使用。 成果中通常包含以下几个主要信息:界址编号、位置描述、地理坐标、临近地物描述等。界址编号是唯一标识界址的编号,可以根据调查顺序进行标号。位置描述是对界址所在位置的文字描述,可以包括道路名称、附近地物等信息,以便于确认界址的具体位置。地理坐标是利用全球定位系统(GPS)或其他测量设备,将界址的经度和纬度坐标记录下来,确保测量结果的精确性。临近地物描述是指界址附近的地物特征,如周围建筑物、道路情况等,用于更好地描述该界址的周边环境。 通过记录界址成果,可以方便地了解土地的具体位置信息和周边环境特征,为土地规划、土地权属确认、土地交易等提供参考依据。在ArcGIS软件中,可以通过导入成果数据,将界址的位置及属性信息以地图的形式进行展示,方便地理空间数据的管理和分析。 总之,ArcGIS界址成果是一种重要的记录界址调查结果的格,它的存在可以方便地呈现界址的位置、坐标和环境特征,为土地管理和规划提供有价值的信息。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

规划GIS会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值