【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文件转数据库(批量)icon-default.png?t=N7T8https://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工具箱icon-default.png?t=N7T8https://blog.csdn.net/xcc34452366/article/details/131506345PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

响应式图片与 CSS image-set

响应式图片 前置知识 art direction problem光栅图像与矢量图像 raster image and vector images img 能否担此重任 sizessrcset实际看一看 picture: img 的好姐妹 source实际看一看 CSS image-set 语法兼容性 其他注意事项 响应式图片 图片在网页中占据了 超过 60% 的浏览带…

nodepad++ 插件的安装

nodepad 插件的安装 一、插件安装二、安装插件&#xff1a;Json Viewer nodepad 有 插件管理功能&#xff0c;其中有格式化json以及可以将json作为树查看的插件&#xff1a; Json Viewer 一、插件安装 1、首先下载最新的notepad 64位【https://notepad-plus.en.softonic.com…

VTK——使用ICP算法进行模型配准

ICP算法 迭代最近点&#xff08;Iterative Closest Point&#xff0c;ICP&#xff09;算法是一种用于两个三维形状之间几何对齐&#xff08;也叫做配准&#xff09;的计算方法。通常&#xff0c;这两个形状至少有一个是点云数据。ICP算法用于最小化源点云与目标点云之间点到点…

java企业工程管理系统源码之提高工程项目管理软件的效率

高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中&#xff0c;管理不畅以及不良的项目执行&#xff0c;往往会导致项目延期、成本上升、回款拖后&#xff0c;最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统&#xff0c;确保…

Golang设计模式

Golang设计模式 Golang设计模式简介Golang工厂设计模式Golang单例设计模式Golang抽象工厂设计模式Golang建造者模式 (Builder Pattern)Golang 原型模式(Prototype Pattern)Golang适配器模式Golang 桥接模式&#xff08;Bridge Pattern&#xff09;Golang装饰器模式(Decorator …

Qt5界面Qt Designer上添加资源图片后,ModuleNotFoundError: No module named ‘rcc_rc‘ 的终极解决方案

在网上找了很久都没弄明白&#xff0c;最后还是自己思考解决了。 起因&#xff1a; 用 Qt Designer 添加资源文件作为背景图&#xff0c;编译 \resource\static\qrc> pyuic5 -o .\xx.py .\xx.ui发现在 xx.py 文件末尾中多了一个语句&#xff1a; import rcc_rc然后运行就…

vue项目——表情选择器

组件库地址&#xff1a;https://www.npmjs.com/package/emoji-mart-vue 1、下载 npm install --save emoji-mart-vue 2、引入 import { Picker } from emoji-mart-vueexport default {components: {Picker} }3、使用 <picker set"emojione" /> <picker …

ChatGPT 总结前端HTML, JS, Echarts都包含哪些内容

AIGC ChatGPT ,BI商业智能, 可视化Tableau, PowerBI, FineReport, 数据库Mysql Oracle, Office, Python ,ETL Excel 2021 实操,函数,图表,大屏可视化 案例实战 http://t.csdn.cn/zBytu

M1 Pro 新芯片安装python2 方案汇总

前言&#xff1a;磨刀不误砍柴工&#xff0c;环境装好&#xff0c;才能打工。M1 Pro 新芯片安装python2 文章目录 方案一 docker 容器构造环境&#xff08;如果涉及本地两个仓库需要关联则不适用&#xff09;方案二 使用 pyenv &#x1f680; 作者简介&#xff1a;作为某云服务…

thinkphp6 入门(3)--获取GET、POST请求的参数值

一、Request对象 thinkphp提供了Request对象&#xff0c;其可以 支持对全局输入变量的检测、获取和安全过滤 支持获取包括$_GET、$_POST、$_REQUEST、$_SERVER、$_SESSION、$_COOKIE、$_ENV等系统变量&#xff0c;以及文件上传信息 具体参考&#xff1a;https://www.kanclou…

Fedora Linux Flatpak 八月推荐应用

导读本文介绍了 Flathub 中可用的项目以及安装说明。 Flathub 是获取和分发适用于所有 Linux 的应用的地方。它由 Flatpak 提供支持&#xff0c;允许 Flathub 应用在几乎任何 Linux 发行版上运行。 请阅读 “Flatpak 入门”。要启用 Flathub 作为你的 Flatpak 提供商&#xff…

什么是jvm

一、初识JVM&#xff08;虚拟机&#xff09; JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Jav…

6种超简单方法告诉你卧室墙面该怎么去装饰

创意 1&#xff1a;夏日宁静 潮汐的变化并不意味着你的夏日精神也要随之改变。用海洋壁画装饰海滩吧&#xff0c;让咸咸的空气、沙滩上的脚趾和木板道上的梦想随风飘散。 创意 2&#xff1a;漂浮艺术 如果你是那种喜欢少走弯路的人&#xff0c;可以考虑完全避开 “墙面艺术&qu…

pytorch中nn.Conv1d功能介绍

在使用Conv1d函数时&#xff0c;pytorch默认你的数据是一维的&#xff0c;比如一句话“深度学习”可以用一个一维数组 [深, 度, 学, 习] 表示&#xff0c;这个数据就是一维的。图片是二维数据&#xff0c;它有长宽两个维度。 因此在使用 Conv1d 函数时&#xff0c;输入是一个三…

14:00面试,14:08就出来了,问的问题有点变态

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

小白学Go 基础02-了解Go语言的诞生与演进

Go语言诞生于何时&#xff1f;它的最初设计者是谁&#xff1f;它为什么被命名为Go&#xff1f;它的设计目标是什么&#xff1f;它如今发展得怎么样&#xff1f;带着这些问题&#xff0c;我们一起穿越时空&#xff0c;回到2007年9月Go语言诞生的那一历史时刻吧。 Go语言的诞生 …

数据结构与算法基础-学习-30-插入排序之直接插入排序、二分插入排序、希尔排序

一、排序概念 将一组杂乱无章的数据按一定规律顺次排列起来。 将无序序列排成一个有序序列&#xff08;由小到大或由大到小&#xff09;的运算。 二、排序方法分类 1、按数据存储介质 名称描述内部排序数据量不大、数据在内存&#xff0c;无需内外交换存交换存储。外部排序…

【CLIP详读】

个人网站&#xff1a;https://tianfeng.space 一、前言 OpenAI的CLIP项目自从推出以来&#xff0c;CLIP引起了广泛的关注。它的方法看似简单&#xff0c;但效果非常出色&#xff0c;许多结果令人惊叹。例如&#xff0c;预训练模型可以在任何视觉分类数据集上实现出色的效果&a…

Elasticsearch 集成--Flink 框架集成

一、Flink 框架介绍 Apache Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 Apache Spark 掀开了内存计算的先河&#xff0c;以内存作为赌注&#xff0c;赢得了内存计算的飞速发展。 但是在其火热的同时&#xff0c;开发人员发现&#xff0c;在 Spark …

【Linux】DNS系统,ICMP协议,NAPT技术

遏制自己内心的知识优越感&#xff0c;才能让你发自内心的去尊重他人&#xff0c;避免狂妄自大&#xff0c;才能让你不断的丰富自己的内心。 文章目录 一、DNS系统1.DNS服务器返回域名对应的ip2.使用dig工具分析DNS过程3.浏览器中输入url后发生的事情&#xff1f; 二、ICMP协议…