【ArcGIS Pro二次开发】(65):进出平衡SHP转TXT、TXT转SHP
最近一个小伙伴提了这么一个需求,需要把TXT和SHP进行互转。
这种TXT文件其实遇到了好几个版本,都有一点小差异。之前已经做过一个TXT转SHP的工具,但好像不适用。于是针对这个版本,做了互转的2个工具。

【SHP转TXT】
一、要实现的功能

如上图所示,在【数据处理】组—【TXT相关】面板下,点击【进出平衡@SHP转TXT】工具。

在弹出的工具框中,分别输入参数:
1、输入SHP文件所在的文件夹。
2、输入TXT文件所在的文件夹。
3、这里不用填写,会自动列出【1】中所有的shp要素,不想转换的可以点复选框取消。
4、选择地块名称和地块用途,对应的字段值会写入TXT文件中。
生成结果如下:

二、实现流程
核心代码直接贴上,注释已经写得比较清楚了。
需要注意的是,这里获取要素的点集信息,我采取了通过要素的JSON文本来截取的做法,原因是不知道怎么用API来获取,所以用了这么个取巧的方法,以后要是学会了再改吧。这也是无奈之举,要学的东西还很多。
foreach (string fullPath in list_shpPath)
{// 初始化写入txt的内容string txt_all = "[地块坐标]" + "\r";string shp_name = fullPath[(fullPath.LastIndexOf(@"\") + 1)..]; // 获取要素名string shp_path = fullPath[..(fullPath.LastIndexOf(@"\"))]; // 获取shp名// 打开shpFileSystemConnectionPath fileConnection = new FileSystemConnectionPath(new Uri(shp_path), FileSystemDatastoreType.Shapefile);using FileSystemDatastore shapefile = new FileSystemDatastore(fileConnection);// 获取FeatureClassFeatureClass featureClass = shapefile.OpenDataset<FeatureClass>(shp_name);using (RowCursor rowCursor = featureClass.Search()){int featureIndex = 1;while (rowCursor.MoveNext()){using (Feature feature = rowCursor.Current as Feature){// 获取地块名称,地块性质Row row = feature as Row;string ft_name = "";string ft_type = "";var areaName = row[field_mc];var areaType = row[field_yt];if (areaName != null) { ft_name = areaName.ToString(); }if (areaType != null) { ft_type = areaType.ToString(); }// 获取面要素的JSON文字Geometry polygon = feature.GetShape();string js = polygon.ToJson().ToString();// 解析JSON文字// 取坐标点文字string cod = js[(js.IndexOf("[[[") + 3)..js.IndexOf("]]]")];// 坐标点列表List<string> list_xy = cod.Split("]]").ToList();for (int i = 0; i < list_xy.Count; i++){// 坐标行List<string> xy_detils = list_xy[i].Replace(",[[", "").Split("],[").ToList();// 加一行titleint count = xy_detils.Count; // 点的个数string title = $"{count},{ft_name},面,{ft_type},@ " + "\r";txt_all += title;for (int j = 0; j < xy_detils.Count; j++){// 点序号int index = j + 1;if (index == xy_detils.Count) { index = 1; }// XY坐标点string x = Math.Round(double.Parse(xy_detils[j].Split(",")[0]), 4).ToString();string y = Math.Round(double.Parse(xy_detils[j].Split(",")[1]), 4).ToString();// 加入文本txt_all += $"J{index},{featureIndex},{x},{y}\r";}}}featureIndex++;}}// 写入txt文件string txtPath = @$"{folder_txt}\{shp_name.Replace(".shp", "")}.txt";if (File.Exists(txtPath)){File.Delete(txtPath);}File.WriteAllText(txtPath, txt_all);
}
【TXT转SHP】
一、要实现的功能

如上图所示,在【数据处理】组—【TXT相关】面板下,点击【进出平衡@TXT转SHP】工具。

在弹出的工具框中,分别输入参数:
1、输入TXT文件所在的文件夹。
2、输入SHP文件所在的文件夹。
3、选择正确的坐标系。
4、这里不用填写,会自动列出【1】中所有的TXT文件,不想转换的可以点复选框取消。
生成结果如下:

二、实现流程
TXT转SHP之前已经已经写过一篇文章,可以参看:
【ArcGIS Pro二次开发】(41):勘测定界txt文件转数据库(批量)
https://blog.csdn.net/xcc34452366/article/details/131309938不过文章中用的TXT文件和今天这个有些不同,代码也就不一样,但思路是一致的。
这里只放核心代码,代码中用到一些自定义方法和之前是一样的引用,就不再一一放上:
foreach (string txtPath in list_txtPath)
{string shp_name = txtPath[(txtPath.LastIndexOf(@"\") + 1)..].Replace(".txt", ""); // 获取要素名pw.AddProcessMessage(@$"创建要素:{shp_name}", 10, time_base, Brushes.Black);// 创建一个空要素Arcpy.CreateFeatureclass(shpPath, shp_name, "POLYGON", spatial_reference);// 新建字段Arcpy.AddField(@$"{shpPath}\{shp_name}.shp", "地块名称", "TEXT");Arcpy.AddField(@$"{shpPath}\{shp_name}.shp", "地块性质", "TEXT");// 打开shpFileSystemConnectionPath fileConnection = new FileSystemConnectionPath(new Uri(shpPath), FileSystemDatastoreType.Shapefile);using FileSystemDatastore shapefile = new FileSystemDatastore(fileConnection);// 获取FeatureClassFeatureClass featureClass = shapefile.OpenDataset<FeatureClass>(shp_name);// 预设文本内容string text = "";// 获取txt文件的编码方式Encoding encoding = ToolManager.GetEncodingType(txtPath);// 读取【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(txtPath, Encoding.GetEncoding("GBK"))) { text = sr.ReadToEnd(); }}else if (encoding_index == 3) // UTF8编码的情况{using (StreamReader sr = new StreamReader(txtPath, Encoding.UTF8)) { text = sr.ReadToEnd(); }}// 文本中的【@】符号放前string updata_text = ChangeSymbol(text);// 获取要素txt列表的地块标记List<string> Parts = GetParts(updata_text);for (int i = 0; i < Parts.Count; i++){// 地块编号、地块性质string dkmc = "";string dkxz = "";// 根据换行符分解坐标点文本List<string> lines = Parts[i].Split("@").ToList();// 创建空坐标点集合var vertices_list = new List<List<Coordinate2D>>();for (int j = 1; j < lines.Count; j++){var vertices = new List<Coordinate2D>();vertices_list.Add(vertices);}// 构建坐标点集合for (int k = 1; k < lines.Count; k++){List<string> list_point = lines[k].Split("\r").ToList();foreach (var point in list_point){if (!point.Contains(",")) // 跳过无坐标部份的文本{continue;}else if (!point.StartsWith("J")) // 名称、地块编号、功能文本{dkmc = point.Split(",")[1];dkxz = point.Split(",")[3];}else // 点坐标文本{double lat = double.Parse(point.Split(",")[2]); // 经度double lng = double.Parse(point.Split(",")[3]); // 纬度vertices_list[k - 1].Add(new Coordinate2D(lat, lng)); // 加入坐标点集合}}}/// 构建面要素// 创建编辑操作对象EditOperation editOperation = new EditOperation();editOperation.Callback(context =>{// 获取要素定义FeatureClassDefinition featureClassDefinition = featureClass.GetDefinition();// 创建RowBufferusing RowBuffer rowBuffer = featureClass.CreateRowBuffer();// 写入字段值rowBuffer["地块名称"] = dkmc;rowBuffer["地块性质"] = dkxz;PolygonBuilderEx pb = new PolygonBuilderEx(vertices_list[0]);// 如果有空洞,则添加内部Polygonif (vertices_list.Count > 1){for (int i = 0; i < vertices_list.Count - 1; i++){pb.AddPart(vertices_list[i + 1]);}}// 给新添加的行设置形状rowBuffer[featureClassDefinition.GetShapeField()] = pb.ToGeometry();// 在表中创建新行using Feature feature = featureClass.CreateRow(rowBuffer);context.Invalidate(feature); // 标记行为无效状态}, featureClass);// 执行编辑操作editOperation.Execute();}// 保存编辑Project.Current.SaveEditsAsync();
}
三、工具文件分享
我把工具都集合成工具箱,不再单独放单个工具,可以到这里下载完整工具箱,会不断更新:
【ArcGIS Pro二次开发】:CC工具箱
https://blog.csdn.net/xcc34452366/article/details/131506345PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。
相关文章:
【ArcGIS Pro二次开发】(65):进出平衡SHP转TXT、TXT转SHP
最近一个小伙伴提了这么一个需求,需要把TXT和SHP进行互转。 这种TXT文件其实遇到了好几个版本,都有一点小差异。之前已经做过一个TXT转SHP的工具,但好像不适用。于是针对这个版本,做了互转的2个工具。 【SHP转TXT】 一、要实现的…...
Shell开发实践:服务器的磁盘、CPU、内存的占用监控
🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…...
超详细 async和await 项目实战运用(附加文字解答+源码)
文章目录 问题描述async什么是 asyncasync 的作用async 的应用场景async 优点 await什么是 awaitawait 的作用await 的应用场景await 的优点async和 await结合使用 结束语 大家好!又到了愉快的周末假期,今天是2023年9月3日|农历七月十九,我最…...
Maven入门教程(三):Maven语法
视频教程:Maven保姆级教程 Maven入门教程(一):安装Maven环境 Maven入门教程(二):idea/Eclipse使用Maven Maven入门教程(三):Maven语法 Maven入门教程(四):Nexus私服 Maven入门教程(五):自定义脚手架 6.Mav…...
C++技术点,故事解析
语言的魅力 从人类诞生开始 ,南方古猿到现代人类经历了非常多变化; 南方古猿到能人 有什么变化? 能人会使用工具,由于会使用工具 就可以获得肉类食物,当然只能吃一些动物腐肉 直到进化成直立人的晚期,在东…...
数据结构(Java实现)-字符串常量池与通配符
字符串常量池 在Java程序中,类似于:1, 2, 3,3.14,“hello”等字面类型的常量经常频繁使用,为了使程序的运行速度更快、更节省内存,Java为8种基本数据类型和String类都提供了常量池。…...
python强化学习--gym安装与使用
最近开始学习强化学习,第一步肯定是要学会安装和使用pym,原本以为很简单,事实上确实很简单,但是遇到一个小问题,就是安装gym之后,在应用的过程中,游戏界面没有显示出来,了解后才知道…...
105. 从前序与中序遍历序列构造二叉树
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 思路:题目给出了先序遍历和中序遍历的结果,因为先序遍历遵循根–>左–>…...
(第六天)初识Spring框架-SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录
SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录(第六天)初识Spring框架 昨天我们已经把Mybatis框架的基本知识全部学完,内容有Mybatis是一个半自动化的持久层ORM框架,深入学习编写动态SQL&a…...
如何使用『Nginx』配置后端『HTTPS』协议访问
前言 本篇博客主要讲解如何使用 Nginx 部署后端应用接口 SSL 证书,从而实现 HTTPS 协议访问接口(本文使用公网 IP 部署,读者可以自行替换为域名) 申请证书 须知 请在您的云服务平台申请 SSL 证书,一般来说证书期限…...
Git仓库简介
1、工作区、暂存区、仓库 工作区:电脑里能看到的目录。 暂存区:工作区有一个隐藏目录.git,是Git的版本库,Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区…...
TensorRTC++ | INT8量化
Int8量化步骤 // 这是基本需要的组件 auto builder = make_nvshared(nvinfer1::createInferBuilder(logger)); auto config = make_nvshared(builder->createBuilderConfig())...
VS + qt环境使用QCustomPlot等三方库如何配置
文章目录 前言VS环境下引入第三方类库QCustomPlot方法一:解决办法: C中.dll与.lib文件的生成与使用1. 两种库:2.两种文件的区别 前言 Qt提供了显式和隐式导入第三方库方法,本文只介绍显示导入方法。 一般的第三方提供的库文件包…...
OS 段页结合的实际内存管理
虚拟内存承接段和页,从用户角度,虚拟内存提供段,从硬件角度,虚拟内存把段打散映射到页 先基于段的翻译,再基于页的翻译 p是pcb跟着进程换,64M一个段,set base就是建段表 因为每个进程虚拟地址…...
一种改进多旋翼无人机动态仿真的模块化仿真环境研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
02-请解释一下Java的内存模型和happens-before规则?【Java面试题总结】
请解释一下Java的内存模型和happens-before规则? 概念:Java内存模型,简称JMM,是一种定义了多线程程序中内存访问行为的规范。它定义了线程如何与主内存和工作内存进行交互,以及如何保证多线程程序的正确性和可见性。J…...
PVE 8 出现CPU 100% 冻结(卡死)
最近在研究PVE,然后下载官方最新版本系统8.x安装好后出现卡死问题,就连开个软件CPU也能飙到100%,开始我以为是硬件问题可能是资源不够,但是将系统切换回裸机(不用PVE启动)一点问题也没有,后来逐…...
【高效编程技巧】编程菜鸟和编程大佬的差距究竟在哪里?
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《高效编程技巧》《C语言进阶》 ⛺️生活的理想,就是为了理想的生活! 文章目录 📋 前言1.如何写出好的代码?1.2 如何分析一个函数写的怎么样 2. 代码板式的重要性2.1 代码…...
继承【C++】
文章目录 继承的概念继承的定义继承方式和访问限定符继承基类成员访问方式的变化 默认继承方式 基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数继承与友元静态成员菱形继承及菱形虚拟继承继承的方式 菱形虚拟继承菱形虚拟继承原理 继承的概念 继承(inheritance)…...
ORB-SLAM3复现过程中遇到的问题及解决办法
在复现过程中遇到的问题的解决过程 1. 版本检查1.1 Opencv版本的检测1.2 Eigen版本的检测1.3 查看Python版本1.4 其他 2. 编译过程中遇到的问题及解决办法2.1 ./build.sh遇到的问题2.2 ./build_ros.sh遇到的问题 因为环境比较干净,所以遇到的问题相对少一些…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
