【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名

    // 打开shp
    FileSystemConnectionPath fileConnection = new FileSystemConnectionPath(new Uri(shp_path), FileSystemDatastoreType.Shapefile);
    using FileSystemDatastore shapefile = new FileSystemDatastore(fileConnection);
    // 获取FeatureClass
    FeatureClass 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();

                    // 加一行title
                    int 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");

    // 打开shp
    FileSystemConnectionPath fileConnection = new FileSystemConnectionPath(new Uri(shpPath), FileSystemDatastoreType.Shapefile);
    using FileSystemDatastore shapefile = new FileSystemDatastore(fileConnection);
    // 获取FeatureClass
    FeatureClass 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();
            // 创建RowBuffer
            using RowBuffer rowBuffer = featureClass.CreateRowBuffer();
            // 写入字段值
            rowBuffer["地块名称"] = dkmc;
            rowBuffer["地块性质"] = dkxz;

            PolygonBuilderEx pb = new PolygonBuilderEx(vertices_list[0]);
            // 如果有空洞,则添加内部Polygon
            if (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文件直接安装。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Go几种读取配置文件的方式

比较有名的方案有 使用viper管理配置[1] 支持多种配置文件格式&#xff0c;包括 JSON,TOML,YAML,HECL,envfile&#xff0c;甚至还包括Java properties 支持为配置项设置默认值 可以通过命令行参数覆盖指定的配置项 支持参数别名 viper[2]按照这个优先级&#xff08;从高到低&am…

爬虫逆向实战(二十八)--某税网第一步登录

一、数据接口分析 主页地址&#xff1a;某税网 1、抓包 通过抓包可以发现登录接口是factorAccountLogin 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看载荷模块可以发现有一个datagram 和 一个signature加密参数 请求头是否加密&#xff1f; 通过查看“标…

11 mysql float/double/decimal 的数据存储

前言 这里主要是 由于之前的一个 datetime 存储的时间 导致的问题的衍生出来的探究 探究的主要内容为 int 类类型的存储, 浮点类类型的存储, char 类类型的存储, blob 类类型的存储, enum/json/set/bit 类类型的存储 本文主要 的相关内容是 float, decimal 类类型的相关数据…

电脑提示找不到concrt140.dll怎么修复?concrt140.dll快速修复方法

今天&#xff0c;我将和大家分享一个关于电脑计算机中丢失concrt140.dll文件的问题及其修复方法。希望通过这次演讲&#xff0c;能够帮助大家解决在日常使用电脑过程中遇到的问题&#xff0c;提高我们的工作效率。 首先&#xff0c;让我们来了解一下concrt140.dll是什么。concr…

爬虫--爬取自己想去的目的的车票信息

前言&#xff1a; 本篇文章主要作为一个爬虫项目的小练习&#xff0c;来给大家进行一下爬虫的大致分析过程以及来帮助大家在以后的爬虫编写中有一个更加清晰的认识。 一&#xff1a;环境配置 Python版本&#xff1a;3.7 IDE:PyCharm 所需库&#xff1a;requests&#xff0…

ShardingJDBC——基于JPA的读写分离实战

摘要 本博文主要介绍基于JPA的读写分离实战&#xff0c;帮助大家更好的学会使用读写分离。透明化读写分离所带来的影响&#xff0c;让使用方尽量像使用一个数据库一样使用主从数据库集群&#xff0c;是ShardingSphere读写分离模块的主要设计目标。 一、读写分离库的场景和设计…

CSRF与XSS结合利用

文章目录 修改cms网站后台管理员密码成功登录总结 修改cms网站后台管理员密码 CSRF和XSS结合的JS代码&#xff1a; <script> xmlhttp new XMLHttpRequest(); xmlhttp.open("post","http://10.4.7.130/cms/admin/user.action.php",false); xmlhttp…

【位运算】leetcode面试题:消失的两个数字

一.题目描述 消失的两个数字 二.思路分析 本题难度标签是困难&#xff0c;但实际上有了只出现一次的数字iii这道题的铺垫&#xff0c;本题的思路还是很容易想到的。 温馨提示&#xff1a;阅读本文前可以先查看我的【位运算】专栏的第一篇文章&#xff0c;其中包含位运算这类…

NFTScan | 08.21~08.27 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。周期&#xff1a;2023.08.21~ 2023.08.27 NFT Hot News 01/ NFT 品牌体验平台 Recur 将于 11 月 16 日彻底关闭&#xff0c;此前曾获 5000 万美元融资 8 月 21 日&#xff0c;NFT 品牌体验平台 Recur 在 X…

微信小程序 - 2023年最新版手机号快捷登录详细教程

前言 最近开发公司手机快捷登录的功能&#xff0c;花费了不少时间&#xff0c;这里附上详细教程。 这里以海底捞小程序的图片为例&#xff0c;如有侵权请联系小编删除。 代码如下 <button open-type"getPhoneNumber" getphonenumber"getPhoneNumber"…

8.31作业

一、面试题 1、什么是多态、虚函数、纯虚函数 多态是一种行为的多种实现方式&#xff0c;通过虚函数和虚指针来实现。是子类对父类虚函数重写然后父类通过虚指针调用重写后的实现。虚指针在类的最前面会指向一个虚函数表。里面记录了虚函数包括子类重写的。虚函数就是在函数前…

Linux(CentOS7)下如何配置多个Tomcat容器?

一、在 liunx 系统安装 jdk 1、安装jdk&#xff08;yum install 安装&#xff09; 查看是否系统是否自带jdk并卸载 rpm -qa |grep java rpm -qa |grep jdk rpm -qa |grep gcj 其中&#xff0c;GCJ是GNU的Java编译器,可以把java程序编译成本地代码&#xff0c;编译成功后的可…

Mybatis 动态SQL – 使用if, where标签动态生成条件语句

前面几篇我们介绍了使用Mybatis进行数据的增删改查&#xff0c;并且也了解了如何在Mybatis中使用JDK的日志系统打印日志&#xff1b;本篇我们继续介绍如何使用Mybatis提供的if,where标签动态生成条件语句。 如果您对数据的增删改查和Mybatis集成JDK日志系统不太了解&#xff0…

九、MySQL(DQL基础查询)如何查询表中信息?

1、DQL基础用法&#xff1a; 2、实例&#xff1a; &#xff08;1&#xff09;初始化表格&#xff1a; # 创建表头 create table things(id int comment 编号,number int comment 学号,name char(5) comment 姓名,address char(6) comment 地址,phone number int comment 电话…

stable diffusion实践操作-VAE

本文专门开一节写图生图相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 VAE&#xff0c;全名Variational autoenconder&#xff0c;中文叫变分自编码器。作用是&#xff1a;滤镜微调 &#xff0c;名字中带有vae&#xff0c;后…

AI图像行为分析算法 opencv

AI图像行为分析算法通过pythonopencv深度学习框架对现场操作行为进行全程实时分析&#xff0c;AI图像行为分析算法通过人工智能视觉能够准确判断出现场人员的作业行为是否符合SOP流程规定&#xff0c;并对违规操作行为进行自动抓拍告警。OpenCV是一个基于Apache2.0许可&#xf…

ViT论文Pytorch代码解读

ViT论文代码实现 论文地址&#xff1a;https://arxiv.org/abs/2010.11929 Pytorch代码地址&#xff1a;https://github.com/lucidrains/vit-pytorch ViT结构图 调用代码 import torch from vit_pytorch import ViTdef test():v ViT(image_size 256, patch_size 32, num_cl…

Rust 学习笔记(持续更新中…)

一、 编译和运行是单独的两步 运行 Rust 程序之前必须先编译&#xff0c;命令为&#xff1a;rustc 源文件名 - rustc main.rs编译成功之后&#xff0c;会生成一个二进制文件 - 在 Windows 上还会生产一个 .pdb 文件 &#xff0c;里面包含调试信息Rust 是 ahead-of-time 编译的…

外贸爬虫系统

全球智能搜索 全球智能搜索 支持全球所有国家搜索引擎&#xff0c;及社交平台&#xff0c;精准定位优质的外贸客户&#xff0c;免翻墙 全球任意国家地区实时采集 搜索引擎全网邮箱电话采集 社交平台一键查看采集&#xff08;Facebook,Twitter,Linkedin等&#xff09; 职位…

Pytorch 的基本概念和使用场景介绍

文章目录 一、基本概念1. 张量&#xff08;Tensor&#xff09;2. 自动微分&#xff08;Autograd&#xff09;3. 计算图&#xff08;Computation Graph&#xff09;4. 动态计算图&#xff08;Dynamic Computation Graph&#xff09;5. 变量&#xff08;Variable&#xff09; 二、…