【ArcGIS Pro二次开发】(55):给多个要素或表批量添加字段

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

在工作中可能会遇到这样的场景:有多个GDB要素、表格,或者是SHP文件,需要给这个要素或表添加相同的多个字段。

在这种情况下,手动添加就变得很繁琐,于是就做了这个工具。

需求具体如下图:

【ArcGIS Pro二次开发】(55):给多个要素或表批量添加字段,ArcGIS,ArcGIS Pro SDK,arcgis,arcgis pro sdk,arcgis pro,二次开发,批量添加字段

左图是待处理数据,有shp文件也有gdb文件。

右图是待添加字段的属性结构描述表,有4个参数,【字段名称、字段别名、字段类型、字段长度】。

(文件格式为Excel,文章末尾的下载链接会附上示例Excel)

工具的执行流程为:依次为左图待处理的数据添加右图定义好的字段。


一、要实现的功能

【ArcGIS Pro二次开发】(55):给多个要素或表批量添加字段,ArcGIS,ArcGIS Pro SDK,arcgis,arcgis pro sdk,arcgis pro,二次开发,批量添加字段

如上图所示,点击【字段处理】组【字段综合】面板下的【添加字段(批量)】工具。

【ArcGIS Pro二次开发】(55):给多个要素或表批量添加字段,ArcGIS,ArcGIS Pro SDK,arcgis,arcgis pro sdk,arcgis pro,二次开发,批量添加字段

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

1、包含要素或表格的文件夹。这里可以支持SHP文件和GDB文件,但不支持MDB。

2、包含字段属性的Excel表。这个表格的格式是固定的,在后面的工具链接里,我会将其一块共享,可自行下载,在此基础上修改可以少些错误。

【ArcGIS Pro二次开发】(55):给多个要素或表批量添加字段,ArcGIS,ArcGIS Pro SDK,arcgis,arcgis pro sdk,arcgis pro,二次开发,批量添加字段

E列的说明性文字只是查看用的,不会参与工具的计算(可以删掉)。这里列出6个字段类型格式,除此之外的类型文字是不认的。

3、关键字筛选。这是可选填的,如果你只想处理包含“规划”文字的要素和表,可以在关键字里输入。如果想全部处理,就可以不填任何文字。

最后点击执行即可,生成结果如下(以单个为例):

【ArcGIS Pro二次开发】(55):给多个要素或表批量添加字段,ArcGIS,ArcGIS Pro SDK,arcgis,arcgis pro sdk,arcgis pro,二次开发,批量添加字段


二、实现流程

第一步,从Excel表中获取字段的参数,返回双层List。

                    // 获取字段属性结构表
                    List<List<string>> list_field_attribute = new List<List<string>>();
                    // 建立 Excel 应用程序对象
                    Application excelApp = new Application();
                    // 打开 Excel 文件
                    Workbook workbook = excelApp.Workbooks.Open(excel_path);
                    // 获取工作表
                    var worksheet = workbook.Worksheets[1];
                    // 获取总行数
                    int row_count = worksheet.UsedRange.Rows.Count;
                    // 获取字段属性
                    for (int i = 3; i < row_count; i++)
                    {
                        // 获取字段属性
                        string mc = worksheet.Cells[i, 1].Value.ToString();               // 字段名称
                        string bm = worksheet.Cells[i, 2].Value.ToString();              // 字段别名
                        string field_type = worksheet.Cells[i, 3].Value.ToString();           // 字段类型
                        string lenth = worksheet.Cells[i, 4].Value.ToString();              // 字段长度
                        // 加入
                        list_field_attribute.Add(new List<string> { mc, bm, field_type, lenth });
                    }

第二步,从输入的文件夹中获取所有要素类和表。

首先是shp文件的情况:

        // 获取输入文件夹下的所有文件
        public static List<string> GetAllFiles(string folder_path, string key_word ="no match")
        {
            List<string> filePaths = new List<string>();

            // 获取当前文件夹下的所有文件
            string[] files = Directory.GetFiles(folder_path);
            // 判断是否包含关键字
            if (key_word == "no match")
            {
                filePaths.AddRange(files);
            }
            else
            {
                foreach (string file in files)
                {
                    // 检查文件名是否包含指定扩展名
                    if (System.IO.Path.GetExtension(file).Equals(key_word, StringComparison.OrdinalIgnoreCase))
                    {
                        filePaths.Add(file);
                    }
                }
            }

            // 获取当前文件夹下的所有子文件夹
            string[] subDirectories = Directory.GetDirectories(folder_path);

            // 递归遍历子文件夹下的文件
            foreach (string subDirectory in subDirectories)
            {
                filePaths.AddRange(GetAllFiles(subDirectory, key_word));
            }

            return filePaths;
        }

要获取gdb文件下要素和表,首先要获取gdb文件:

        public static List<string> GetAllGDBFilePaths(string folderPath)
        {
            List<string> gdbFilePaths = new List<string>();
            DirectoryInfo directoryInfo = new DirectoryInfo(folderPath);

            // 检查文件夹是否存在
            if (!directoryInfo.Exists)
            {
                throw new DirectoryNotFoundException("指定的文件夹路径不存在!");
            }

            // 查找所有GDB数据库文件(.gdb文件夹)
            DirectoryInfo[] gdbDirectories = directoryInfo.GetDirectories("*.gdb", SearchOption.AllDirectories);
            foreach (DirectoryInfo gdbDirectory in gdbDirectories)
            {
                // 获取GDB数据库的路径
                string gdbPath = gdbDirectory.FullName.Replace(@"/", @"\");

                // 添加到列表中
                gdbFilePaths.Add(gdbPath);
            }

            return gdbFilePaths;
        }

再从GDB文件下获取所有要素类和表:

        // 获取数据库下的所有要素类的完整路径
        public static List<string> GetFeatureClassPath(string gdb_path)
        {
            List<string> result = new List<string>();
            // 打开GDB数据库
            using Geodatabase gdb = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(gdb_path)));
            // 获取所有要素类
            IReadOnlyList<FeatureClassDefinition> featureClasses = gdb.GetDefinitions<FeatureClassDefinition>();
            foreach (FeatureClassDefinition featureClass in featureClasses)
            {
                using (FeatureClass fc = gdb.OpenDataset<FeatureClass>(featureClass.GetName()))
                {
                    // 获取要素类路径
                    string fc_path = fc.GetPath().ToString().Replace("file:///", "").Replace("/", @"\");
                    result.Add(fc_path);
                }
            }

            return result;
        }

        // 获取数据库下的所有独立表的完整路径
        public static List<string> GetTablePath(string gdb_path)
        {
            List<string> result = new List<string>();
            // 打开GDB数据库
            using Geodatabase gdb = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(gdb_path)));
            // 获取所有独立表
            IReadOnlyList<TableDefinition> tables = gdb.GetDefinitions<TableDefinition>();
            foreach (TableDefinition tableDef in tables)
            {
                using (Table table = gdb.OpenDataset<Table>(tableDef.GetName()))
                {
                    // 获取要素类路径
                    string fc_path = table.GetPath().ToString().Replace("file:///", "").Replace("/", @"\");
                    result.Add(fc_path);
                }
            }
            return result;
        }

获取所有输入要素和表后,即可添加字段:

【obj_all】为获取的所有要素和表的路径,【list_field_attribute】为获取的字段属性结构列表。

                    // 添加字段
                    foreach (var ob in obj_all)
                    {
                        string target_name = ob[ob.LastIndexOf(@"\")..];
                        // 如果不含关键字,直接添加字段
                        if (key_word != "")
                        {
                            foreach (var fa in list_field_attribute)
                            {
                                Arcpy.AddField(ob, fa[0], fa[2], fa[1], int.Parse(fa[3]));
                            }
                        }
                        else
                        {
                            // 如果含有关键字,筛选出含关键字的部分,再添加字段
                            if (target_name.Contains(key_word))
                            {
                                foreach (var fa in list_field_attribute)
                                {
                                    Arcpy.AddField(ob, fa[0], fa[2], fa[1], int.Parse(fa[3]));
                                }
                            }
                        }
                    }

以上便是工具实现的核心代码。


三、工具文件分享

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

【ArcGIS Pro二次开发】:CC工具箱https://blog.csdn.net/xcc34452366/article/details/131506345PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。文章来源地址https://www.toymoban.com/news/detail-624423.html

到了这里,关于【ArcGIS Pro二次开发】(55):给多个要素或表批量添加字段的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【ArcGIS Pro二次开发】(41):勘测定界txt文件转数据库(批量)

    在规划工作中有时候会收到一种带坐标点的txt文件: 上网查了一下资料,这是根据《勘测定界界址点坐标交换格式》制作的固定格式文件。 其中包含了坐标系、精度、地块编号、地块名称、坐标点等信息。 这个工具的目的就是将TXT格式坐标批量转换为数据库文件,并读取地

    2024年02月09日
    浏览(47)
  • 【ArcGIS Pro二次开发】(57):地图系列

    在ArcGIS Pro中,有一个地图系列,可以在一个布局中导出多个地图。 在SDK中为ArcGIS.Desktop.layout.MapSeries类和映射系列导出选项,可以以支持多页导出。 MapSeries类提供了一个静态CreateSpatialMapSeries方法,该方法使用指定的索引层(作为参数传递)为给定布局生成空间地图系列。 使

    2024年02月14日
    浏览(47)
  • 【ArcGIS Pro二次开发】(64):多分式标注

    在ArcGIS中有时会遇到需要二分式标注的情况,有时甚至是三分式、四分式。 通过输入标注表达式,可以做出如下的效果,但是代码不短,每次都要输一遍也挺麻烦。 网上也有一些分式标注的python工具,但不够直观,于是做了这个一键式的工具。 如上图所示,在待处理的要素

    2024年02月10日
    浏览(50)
  • 【ArcGIS模型构建器】05:批量为多个矢量数据添加相同的字段

    本文实现借助arcgis模型构建器,实现批量为多个土地利用矢量数据添加相同的字段,例如DLMC,DLTB等。 有多个土地利用数据矢量图层,每个图层中有很多个图斑,现在需要给每个图层添加一个或者多个字段,如DLCM,DLBM等。 属性表如下所示: 该如何实现?可以借助ArcGIS模型构

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

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

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

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

    2024年02月13日
    浏览(39)
  • 【ArcGIS Pro二次开发】(56):界址点导出Excel

    界址点成果表是地籍测绘中的一种表格,用于记录地块的界址点坐标和相关属性信息。 这个工具的目的就是为了将地块要素导出为界址点成果表。 如上图所示,在【数据处理】组—【Excel相关】面板下,点击【界址点导出Excel】工具。 在弹出的工具框中,分别输入参数: 1、

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

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

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

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

    2024年02月20日
    浏览(47)
  • 【ArcGIS Pro二次开发】(60):按图层导出布局

    在使用布局导图时,会遇到如下问题: 为了切换图层和导图方便,一般情况下,会把相关图层做成图层组。 在导图的时候,如果想要按照图层组进行分开导图,如上图,想导出【现状图、规划图、管控边界】3张图,系统并没有方便的工具。 于是就自己做一个。   如上图所

    2024年02月12日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包