【ArcGIS Pro二次开发】(47):要素类追加至空库(批量)

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

本工具主要是针对国空数据入库而做的。

如果你手头已经整理了一部分要素类数据,但是数据格式,字段值可能并没有完全按照规范设置好,需要将这些数据按规范批量和库,就可以尝试用这个工具。

准备数据:标准空库、你已做好的数据。

做好的数据需要把要素名改成和标准空库对应的要素同名。

如果你想把某些有用的字段值导入到标准空库,同样的字段名也要和对应字段同名。


一、要实现的功能

【ArcGIS Pro二次开发】(47):要素类追加至空库(批量),ArcGIS,ArcGIS Pro SDK,arcgis,二次开发,c#,arcgis pro sdk,批量入库

如上图所示,点击【GDB相关】下的【要素类追加至空库(批量)】工具。

【ArcGIS Pro二次开发】(47):要素类追加至空库(批量),ArcGIS,ArcGIS Pro SDK,arcgis,二次开发,c#,arcgis pro sdk,批量入库

在弹出的工具框中,分别输入要素类所在的GDB数据库、GDB空库和要保存生成数据库的位置。

点击执行即可,生成结果如下:

【ArcGIS Pro二次开发】(47):要素类追加至空库(批量),ArcGIS,ArcGIS Pro SDK,arcgis,二次开发,c#,arcgis pro sdk,批量入库

如右图所示,工具读取输入GDB里的要素名,如果和空库里的要素同名,就会执行【追加】,输入的要素如果有和空库要素同名字段,则会保留字段和字段值,如果存在空库要素没有的字段,则丢弃该字段。


二、实现流程

首先,要把空库复制一份,不能直接修改空库。

// 复制空库
ToolManager.CopyAllFiles(gdb_empty_path, folder_path + @"/result_all.gdb");

调用的方法:

        // 复制文件夹下的所有文件到新的位置
        public static void CopyAllFiles(string sourceDir, string destDir)
        {
            //目标目录不存在则创建
            if (!Directory.Exists(destDir))
            {
                Directory.CreateDirectory(destDir);
            }
            DirectoryInfo sourceDireInfo = new DirectoryInfo(sourceDir);
            List<FileInfo> fileList = new List<FileInfo>();
            GetFileList(sourceDireInfo, fileList); // 获取源文件夹下的所有文件
            List<DirectoryInfo> dirList = new List<DirectoryInfo>();
            GetDirList(sourceDireInfo, dirList); // 获取源文件夹下的所有子文件夹
            // 创建目标文件夹结构
            foreach (DirectoryInfo dir in dirList)
            {
                string sourcePath = dir.FullName;
                string destPath = sourcePath.Replace(sourceDir, destDir); // 替换源文件夹路径为目标文件夹路径
                if (!Directory.Exists(destPath))
                {
                    Directory.CreateDirectory(destPath); // 创建目标文件夹
                }
            }
            // 复制文件到目标文件夹
            foreach (FileInfo fileInfo in fileList)
            {
                string sourceFilePath = fileInfo.FullName;
                string destFilePath = sourceFilePath.Replace(sourceDir, destDir); // 替换源文件夹路径为目标文件夹路径
                File.Copy(sourceFilePath, destFilePath, true); // 复制文件,允许覆盖目标文件
            }
        }

工具的核心是应用【追加】工具,所以需要获取各个要素类的完整路径,这里不能直接用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:///", "");
                    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:///", "");
                    result.Add(fc_path);
                }
            }
            return result;
        }

获取路径后,再将对应的路径做成Dictionary备用:

                    // 获取要素类和表的完整路径
                    List<string> in_data_paths = ToolManager.GetFeatureClassAndTablePath(gdb_path);
                    List<string> empty_data_paths = ToolManager.GetFeatureClassAndTablePath(folder_path + @"/result_all.gdb");
                    // 创建dict,捕捉同名要素类和独立表
                    Dictionary<string, string> keyValuePairs= new Dictionary<string, string>();
                    foreach (var da in in_data_paths)
                    {
                        // 提取要素类或独立表名
                        string in_name = da[(da.LastIndexOf(@"/") + 1)..];
                        foreach (var em in empty_data_paths)
                        {
                            string em_name = em[(em.LastIndexOf(@"/") + 1)..];
                            if (in_name == em_name)
                            {
                                keyValuePairs.Add(da, em);
                                break;
                            }
                        }
                    }

最后执行【追加】工具即可:

                    // 执行追加工具
                    foreach (var pair in keyValuePairs)
                    {
                        string pair_name = pair.Key[(pair.Key.LastIndexOf(@"/") + 1)..];
                        // 追加
                        Arcpy.Append(pair.Key, pair.Value);
                    }

以上就是工具的核心代码。


三、工具文件分享

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

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

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

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

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

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月14日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包