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

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

在规划工作中有时候会收到一种带坐标点的txt文件:

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

上网查了一下资料,这是根据《勘测定界界址点坐标交换格式》制作的固定格式文件。

其中包含了坐标系、精度、地块编号、地块名称、坐标点等信息。

这个工具的目的就是将TXT格式坐标批量转换为数据库文件,并读取地块编号,地块名称,地块用途、3个属性,写到要素类的字段中。(其它信息感觉好像没什么用,就暂不写入了。)


一、要实现的功能

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

如上图所示,点击【TXT文件转要素类(批量)】按钮,在弹出的工具框中输入参数。

1、输入包含txt文件的文件夹:

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

2、输出gdb数据库的位置。

3、手动输入要生成的要素类的名字。

4、选择坐标系。这里已经预设了几种坐标系,可以下拉选择。如果没有你需要的,也可以手动输入。坐标系名字可以打开ArcGIS里查看:

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

需要注意的是,上面显示空格的地方要换成英文输入状态下的“_”。

点击【执行】,生成结果如下:

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


二、实现流程

1、创建一个空的面要素类,并新增3个字段

这部分比较简单,直接用GP工具即可:

// 创建一个空要素
Arcpy.CreateFeatureclass(gdb_path, fc_name, "POLYGON", spatial_reference);
// 新建字段
Arcpy.AddField(gdb_path + @"\" + fc_name, "地块编号", "TEXT");
Arcpy.AddField(gdb_path + @"\" + fc_name, "地块名称", "TEXT");
Arcpy.AddField(gdb_path + @"\" + fc_name, "功能分类", "TEXT");

2、获取文件夹下的所有txt文件

这里写了一个通用方法,可以使用关键字,采取递归方式来获取:

        // 获取输入文件夹下的所有文件
        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 (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;
        }

调用方法:

var files = GetAllFiles(folder_path, ".txt");

3、解析txt文件内容

解析txt文件的时候遇到一个问题,文件采取的编码方式不同,如下图:

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

通过解析,发现这个ANSI返回的也是UTF-8,但是按UTF-8打开却发现中文部分是乱码。

之前没接触过这部分的知识,实在是不知道什么原理。只是对返回结果的差异点作个判断。

                            // 解析txt文件内容,创建面要素
                            foreach (var path in files)
                            {
                                // 预设文本内容
                                string text = "";
                                // 获取txt文件的编码方式
                                Encoding encoding = ToolManager.GetEncodingType(path);
                                // 读取【ANSI和UTF-8】的不同+++++++(ANSI为0,UTF-8为3)
                                // 我也不知道具体原理,只是找出差异点作个判断,以后再来解决这个问题------
                                int encoding_index = int.Parse(encoding.Preamble.ToString().Substring(encoding.Preamble.ToString().Length - 2, 1));

                                if (encoding_index == 0)        // ANSI编码的情况
                                {
                                    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
                                    using (StreamReader sr = new StreamReader(path, Encoding.GetEncoding("GBK"))) { text = sr.ReadToEnd(); }
                                }
                                else if (encoding_index == 3)               // UTF8编码的情况
                                {
                                    using (StreamReader sr = new StreamReader(path, Encoding.UTF8)) { text = sr.ReadToEnd(); }
                                }
                            }

读取到txt文件的内容后,就可以逐步分解,找到有用的信息:

                                // 获取坐标点文本
                                string txt_cod = text.Substring(text.IndexOf("@") + 1);
                                // 根据换行符分解坐标点文本
                                string[] list_point = txt_cod.Split("\n");
                                // 构建坐标点集合
                                var vertices = new List<Coordinate2D>();
                                foreach (var point in list_point)
                                {
                                    if (!point.Contains("J"))     // 跳过无坐标部份的文本
                                    {
                                        continue;
                                    }
                                    double lat = double.Parse(point.Split(",")[3]);         // 经度
                                    double lng = double.Parse(point.Split(",")[2]);         // 纬度
                                    // 加入坐标点集合
                                    vertices.Add(new Coordinate2D(lat, lng));
                                }

                                // 获取名称、地块编号、功能等文本
                                string txt_filed = text.Substring(text.IndexOf("[地块坐标]") + 1).Split("\n")[1];
                                string bh = txt_filed.Split(",")[2];          // 地块编号
                                string mc = txt_filed.Split(",")[3];          // 地块名称
                                string gn = txt_filed.Split(",")[6];          // 功能

获取到所需信息后,就可以用来构面,写入字段值,并保存到数据库中:

                                /// 构建面要素
                                // 创建编辑操作对象
                                EditOperation editOperation = new EditOperation();
                                editOperation.Callback(context =>
                                {
                                    // 获取要素定义
                                    FeatureClassDefinition featureClassDefinition = featureClass.GetDefinition();
                                    // 创建RowBuffer
                                    using RowBuffer rowBuffer = featureClass.CreateRowBuffer();
                                    // 写入字段值
                                    rowBuffer["地块编号"] = bh;
                                    rowBuffer["地块名称"] = mc;
                                    rowBuffer["功能分类"] = gn;

                                    // 给新添加的行设置形状
                                    rowBuffer[featureClassDefinition.GetShapeField()] = new PolygonBuilderEx(vertices).ToGeometry();

                                    // 在表中创建新行
                                    using Feature feature = featureClass.CreateRow(rowBuffer);
                                    context.Invalidate(feature);      // 标记行为无效状态
                                }, featureClass);

                                // 执行编辑操作
                                editOperation.Execute();

编辑后,出现结果未保存的情况,搞不清楚原理,就来个硬保存:

// 保存编辑
Project.Current.SaveEditsAsync();

以上便实现了工具的基本功能。

这里可能还有一些未考虑的细节,包括一些因为不懂基本原理的因素,估计会有些BUG,后面边试边改吧。


三、工程文件分享

 最后,放上工程文件的链接:

TXT2FeatureClasshttps://pan.baidu.com/s/1mysXD0LmS_xJ9mPHiVyFfg?pwd=5haiPS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。文章来源地址https://www.toymoban.com/news/detail-493902.html

到了这里,关于【ArcGIS Pro二次开发】(41):勘测定界txt文件转数据库(批量)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

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

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

    2024年02月11日
    浏览(81)
  • 【ArcGIS Pro二次开发】(52):布局导出图片(批量)

    在ArcGIS Pro中设定好布局后,可以直接导出为各种类型的图片。 这是很基本的功能,但是如果你的布局很多,一张一张导图就有点费劲。 之前有网友提出希望可以批量导图,要实现起来并不难,于是就做了这个工具。 如上图所示,点击【制图相关】面板下【导出布局(批量)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月16日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包