【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遇到的问题 因为环境比较干净,所以遇到的问题相对少一些…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
