当前位置: 首页 > news >正文

【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文件直接安装。

相关文章:

【ArcGIS Pro二次开发】(65):进出平衡SHP转TXT、TXT转SHP

最近一个小伙伴提了这么一个需求&#xff0c;需要把TXT和SHP进行互转。 这种TXT文件其实遇到了好几个版本&#xff0c;都有一点小差异。之前已经做过一个TXT转SHP的工具&#xff0c;但好像不适用。于是针对这个版本&#xff0c;做了互转的2个工具。 【SHP转TXT】 一、要实现的…...

Shell开发实践:服务器的磁盘、CPU、内存的占用监控

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…...

超详细 async和await 项目实战运用(附加文字解答+源码)

文章目录 问题描述async什么是 asyncasync 的作用async 的应用场景async 优点 await什么是 awaitawait 的作用await 的应用场景await 的优点async和 await结合使用 结束语 大家好&#xff01;又到了愉快的周末假期&#xff0c;今天是2023年9月3日|农历七月十九&#xff0c;我最…...

Maven入门教程(三):Maven语法

视频教程&#xff1a;Maven保姆级教程 Maven入门教程(一)&#xff1a;安装Maven环境 Maven入门教程(二)&#xff1a;idea/Eclipse使用Maven Maven入门教程(三)&#xff1a;Maven语法 Maven入门教程(四)&#xff1a;Nexus私服 Maven入门教程(五)&#xff1a;自定义脚手架 6.Mav…...

C++技术点,故事解析

语言的魅力 从人类诞生开始 &#xff0c;南方古猿到现代人类经历了非常多变化&#xff1b; 南方古猿到能人 有什么变化&#xff1f; 能人会使用工具&#xff0c;由于会使用工具 就可以获得肉类食物&#xff0c;当然只能吃一些动物腐肉 直到进化成直立人的晚期&#xff0c;在东…...

数据结构(Java实现)-字符串常量池与通配符

字符串常量池 在Java程序中&#xff0c;类似于&#xff1a;1&#xff0c; 2&#xff0c; 3&#xff0c;3.14&#xff0c;“hello”等字面类型的常量经常频繁使用&#xff0c;为了使程序的运行速度更快、更节省内存&#xff0c;Java为8种基本数据类型和String类都提供了常量池。…...

python强化学习--gym安装与使用

最近开始学习强化学习&#xff0c;第一步肯定是要学会安装和使用pym&#xff0c;原本以为很简单&#xff0c;事实上确实很简单&#xff0c;但是遇到一个小问题&#xff0c;就是安装gym之后&#xff0c;在应用的过程中&#xff0c;游戏界面没有显示出来&#xff0c;了解后才知道…...

105. 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 思路&#xff1a;题目给出了先序遍历和中序遍历的结果&#xff0c;因为先序遍历遵循根–>左–>…...

(第六天)初识Spring框架-SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录

SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录&#xff08;第六天&#xff09;初识Spring框架 ​ 昨天我们已经把Mybatis框架的基本知识全部学完&#xff0c;内容有Mybatis是一个半自动化的持久层ORM框架&#xff0c;深入学习编写动态SQL&a…...

如何使用『Nginx』配置后端『HTTPS』协议访问

前言 本篇博客主要讲解如何使用 Nginx 部署后端应用接口 SSL 证书&#xff0c;从而实现 HTTPS 协议访问接口&#xff08;本文使用公网 IP 部署&#xff0c;读者可以自行替换为域名&#xff09; 申请证书 须知 请在您的云服务平台申请 SSL 证书&#xff0c;一般来说证书期限…...

Git仓库简介

1、工作区、暂存区、仓库 工作区&#xff1a;电脑里能看到的目录。 暂存区&#xff1a;工作区有一个隐藏目录.git&#xff0c;是Git的版本库&#xff0c;Git的版本库里存了很多东西&#xff0c;其中最重要的就是称为stage&#xff08;或者叫index&#xff09;的暂存区&#xf…...

TensorRTC++ | INT8量化

Int8量化步骤 // 这是基本需要的组件 auto builder = make_nvshared(nvinfer1::createInferBuilder(logger)); auto config = make_nvshared(builder->createBuilderConfig())...

VS + qt环境使用QCustomPlot等三方库如何配置

文章目录 前言VS环境下引入第三方类库QCustomPlot方法一&#xff1a;解决办法&#xff1a; C中.dll与.lib文件的生成与使用1. 两种库&#xff1a;2.两种文件的区别 前言 Qt提供了显式和隐式导入第三方库方法&#xff0c;本文只介绍显示导入方法。 一般的第三方提供的库文件包…...

OS 段页结合的实际内存管理

虚拟内存承接段和页&#xff0c;从用户角度&#xff0c;虚拟内存提供段&#xff0c;从硬件角度&#xff0c;虚拟内存把段打散映射到页 先基于段的翻译&#xff0c;再基于页的翻译 p是pcb跟着进程换&#xff0c;64M一个段&#xff0c;set base就是建段表 因为每个进程虚拟地址…...

一种改进多旋翼无人机动态仿真的模块化仿真环境研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

02-请解释一下Java的内存模型和happens-before规则?【Java面试题总结】

请解释一下Java的内存模型和happens-before规则&#xff1f; 概念&#xff1a;Java内存模型&#xff0c;简称JMM&#xff0c;是一种定义了多线程程序中内存访问行为的规范。它定义了线程如何与主内存和工作内存进行交互&#xff0c;以及如何保证多线程程序的正确性和可见性。J…...

PVE 8 出现CPU 100% 冻结(卡死)

最近在研究PVE&#xff0c;然后下载官方最新版本系统8.x安装好后出现卡死问题&#xff0c;就连开个软件CPU也能飙到100%&#xff0c;开始我以为是硬件问题可能是资源不够&#xff0c;但是将系统切换回裸机&#xff08;不用PVE启动&#xff09;一点问题也没有&#xff0c;后来逐…...

【高效编程技巧】编程菜鸟和编程大佬的差距究竟在哪里?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《高效编程技巧》《C语言进阶》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言1.如何写出好的代码&#xff1f;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遇到的问题 因为环境比较干净&#xff0c;所以遇到的问题相对少一些&#xf…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…...

【Ftrace 专栏】Ftrace 参考博文

ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...

Java中HashMap底层原理深度解析:从数据结构到红黑树优化

一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一&#xff0c;是基于哈希表的Map接口非同步实现。它允许使用null键和null值&#xff08;但只能有一个null键&#xff09;&#xff0c;并且不保证映射顺序的恒久不变。与Hashtable相比&#xff0c;Hash…...