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

news2024/11/25 4:52:25

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

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

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

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


一、要实现的功能

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

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

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

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

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

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

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


二、实现流程

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文件的时候遇到一个问题,文件采取的编码方式不同,如下图:

通过解析,发现这个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文件直接安装。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/667045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生物群落(生态)数据统计分析与绘图

R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂&#xff0c;涉及众多统计分析方法。以生物群落数据分析中的最常用的统计方法回归和混合效应模型、多元统计分析技术及结构方程等数量分析方法为主线&#xff0c;通过多个来自经典…

一些WEB测试方法

ladys and 乡亲们&#xff0c;long time no see&#xff0c;发个笔记&#xff1a;&#xff09; 首先&#xff0c;WEB是咋组成的 Web应用程序一般是B/S模式&#xff0c;一个Web应用程序是由完成特定任务的各种Web组件(web components)构成的并通过Web将服务展示给外界&#xff…

最喜爱的编程语言——Python

一、编程语言发展 编程语言&#xff08;programming language&#xff09;可以简单的理解为一种计算机和人都能识别的语言。一种能够让程序员准确地定义计算机所需数据的计算机语言&#xff0c;并精确地定义在不同情况下所应当采取的行动。 编程语言处在不断的发展和变化中&…

上海亚商投顾:沪指延续调整 机器人概念股掀涨停潮

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 大小指数今日略显分化&#xff0c;沪指全天震荡调整&#xff0c;深成指、创业板指则拉升翻红。机器人概念股掀涨停…

手把手教你使用抖音DOU+创作个性化视频!

抖音DOU是抖音推出的一项全新功能&#xff0c;旨在为用户提供更加个性化、丰富多彩的内容创作和交流体验。DOU提供了一系列强大的创作工具&#xff0c;包括音频剪辑、特效滤镜、场景转换、字幕编辑等&#xff0c;让用户可以轻松地将自己的创意通过视频分享到抖音平台上来。下面…

数值分析第四章节 用Python实现数值积分与数值微分

参考书籍&#xff1a;数值分析 第五版 李庆杨 王能超 易大义编 第4章 数值积分与数值微分 文章声明&#xff1a;如有发现错误&#xff0c;欢迎批评指正 文章目录 梯形公式矩形公式辛普森公式柯特斯公式复合梯形公式复合辛普森公式 4.1数值积分概论 4.1.1数值积分基本思想 使用某…

【Vue全家桶高仿小米商城】——(四)项目基础架构

第四章&#xff1a;项目基础架构 此章节全力讲解前端基本项目架构&#xff0c;通过此章节可搭建一个通用性的前端架构&#xff0c;内容涵盖跨域方案、路由封装、错误拦截等。 文章目录 第四章&#xff1a;项目基础架构一、前端跨域解决什么是前端跨域&#xff1f;怎么解决前端…

将h5项目转成uniapp小程序

打开微信开发者工具&#xff0c;新建项目&#xff1b;pages下index文件中index.wxml文件打开内容全删除&#xff1b;写入<web-view srchttp://域名.com/></web-view>&#xff1b;编译&#xff0c;成功在小程序中展示&#xff1b;其后&#xff0c;正常按照小程序流程…

scp命令及后台运行

将项目从一个服务器迁移到另外一个服务器的时候 当项目很大的时候 可以用到如下 1、scp -r 本地项目路径 需要迁移服务器的IP:/存放路径 scp -r /u01/media/Disk1/ 192.168.1.31:/u01/media/ reverse mapping checking getaddrinfo for bogon failed - POSSIBLE BREAK-IN ATTEM…

算法篇——动态规划 01背包问题 (js版)——更新新题

416. 分割等和子集 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 链接&#xff1a;力扣 解题思路&#xff1a; 这道题看似是比较简单的背包问题&#xff1a; 首先可以通过判断数组和是否是…

【ZenUML】时序图之ZenUML详解

时序图 序列图是一种交互图&#xff0c;显示进程如何彼此操作以及顺序。 Mermaid可以使用ZenUML渲染序列图。请注意&#xff0c;ZenUML使用的语法与mermaid中的原始序列图不同。 目前&#xff0c;最新版本mermaid v10.2.3 暂时不单独支持zenuml语法,需要配合mermaid-zenuml一…

动态规划_可视化校园导航Floyd算法应用

目录 引言 图片展示 视频展示 针对校园导航问题的分析 关键技术和算法介绍 详细介绍&#xff1a;算法的实现 总结 代码 附件&#xff1a;Map.png 引言 本文主要通过详细的程序打印和作者的推理过程&#xff0c;描述作者对Floyd算法的理解&#xff0c;阐述其中的动态规划思想是如…

突然发现CSDN变得不一样了【建议】【活动】

突然发现CSDN变得不一样了【活动】 前言推荐突然发现CSDN变得不一样了关于上传代码包关于上传视频关于运行代码关于插入代码1关于插入代码2关于社区的建立关于社区的管理关于此次活动的评选关于排行突然发现说明一下关于我 最后 前言 2023-6-19 23:34:04 本文章仅用于参加 20…

【Python 随练】年龄计算问题

题目&#xff1a; 有 5 个人坐在一起&#xff0c;问第五个人多少岁&#xff1f;他说比第 4 个人大 2 岁。问第 4 个人岁数&#xff0c;他说比第3 个人大 2 岁。问第三个人&#xff0c;又说比第 2 人大两岁。问第 2 个人&#xff0c;说比第一个人大两岁。最后问第一个人&#x…

C++基础(8)——类和对象(6)

前言 本文主要介绍了C中多态的基本知识 4.7.1&#xff1a;多态的基本概念和原理剖析 1&#xff1a;基本概念 静态多态&#xff1a;函数重载、运算符重载 动态多态&#xff1a;派生类和虚函数实现运行时多态 静态多态在编译阶段确定函数地址&#xff1b;动态多态在运行阶段…

微信小程序uniapp+springboot实现小程序服务通知

微信小程序uniappspringboot实现小程序服务通知 1. 实现效果 2. 模板选用及字段类型判断 2.1 开通订阅消息,并选用模板 如果点击订阅消息让开启消息订阅开启后就可以出现以下页面,我本次使用的模板是月卡到期提醒模板,点击选用即可 2.2 查看模板字段类型 TemplateId后续会使用…

面试官问:Redis 分布式锁如何自动续期?

资深面试官&#xff1a;你们项目中的分布式锁是怎么实现的&#xff1f; 老任&#xff1a;基于redis的set命令&#xff0c;该命令有nx和ex选项。 资深面试官&#xff1a;那如果锁到期了&#xff0c;业务还没结束&#xff0c;如何进行自动续期呢&#xff1f; 老任&#xff1a;…

第九章 番外篇:TORCHSCRIPT

下文中的代码都使用参考教程中的例子。 会给出一点自己的解释。 参考教程&#xff1a; 文章目录 Introduction复习一下nn.Module()Torchscripttorch.jit.ScriptModule()torch.jit.script()torch.jit.trace()一个小区别 使用示例tracing Modulesscripting ModuleMixing scripti…

乐鑫线上研讨会|探索 LCD 屏在物联网中的发展趋势

LCD 屏通过显示实时信息并提供交互式体验&#xff0c;现已成为各类设备的重要组成部分。在当下的 AIoT 时代&#xff0c;随着物联网技术的快速发展和应用场景的不断拓展&#xff0c;LCD 作为人机交互的主要输入输出设备&#xff0c;在智能家居、智能安防、工业控制、智慧城市等…

C#开发的OpenRA游戏之建造物品的窗口5

C#开发的OpenRA游戏之建造物品的窗口5 前面分析了TAB窗口的建立和运行,现在关注它的子窗口,也就是ProductionPaletteWidget类实现的窗口,这个窗口主要用来显示所有可以创建物品的ICON图标。用户可以通过这个窗口实现物品创建,如下图所示: 比如要创建电厂,就是点击上面…