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

这篇具有很好参考价值的文章主要介绍了【ArcGIS Pro二次开发】(65):进出平衡SHP转TXT、TXT转SHP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近一个小伙伴提了这么一个需求,需要把TXT和SHP进行互转。

这种TXT文件其实遇到了好几个版本,都有一点小差异。之前已经做过一个TXT转SHP的工具,但好像不适用。于是针对这个版本,做了互转的2个工具。

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


【SHP转TXT】

一、要实现的功能

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

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

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

在弹出的工具框中,分别输入参数:

1、输入SHP文件所在的文件夹。

2、输入TXT文件所在的文件夹。

3、这里不用填写,会自动列出【1】中所有的shp要素,不想转换的可以点复选框取消。

4、选择地块名称和地块用途,对应的字段值会写入TXT文件中。

生成结果如下:

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


二、实现流程

核心代码直接贴上,注释已经写得比较清楚了。

需要注意的是,这里获取要素的点集信息,我采取了通过要素的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】

一、要实现的功能

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

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

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

在弹出的工具框中,分别输入参数:

1、输入TXT文件所在的文件夹。

2、输入SHP文件所在的文件夹。

3、选择正确的坐标系。

4、这里不用填写,会自动列出【1】中所有的TXT文件,不想转换的可以点复选框取消。

生成结果如下:

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


二、实现流程

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");

    // 打开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工具箱https://blog.csdn.net/xcc34452366/article/details/131506345PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。文章来源地址https://www.toymoban.com/news/detail-689064.html

到了这里,关于【ArcGIS Pro二次开发】(65):进出平衡SHP转TXT、TXT转SHP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ArcGIS Pro二次开发】(63):批量更改字段别名

    在我工作中遇到的大多数图斑,字段名称一般是英文,字段别名是中文,使用起来是比较方便的。 但有时候也会遇到一些不一样的情况,不知是经过了怎样的处理,图斑的字段别名被修改成了和字段名称一样的英文,这样就很理解字段名称的意思,特别是其它专业、不熟悉的

    2024年02月11日
    浏览(81)
  • 【ArcGIS Pro二次开发】(52):布局导出图片(批量)

    在ArcGIS Pro中设定好布局后,可以直接导出为各种类型的图片。 这是很基本的功能,但是如果你的布局很多,一张一张导图就有点费劲。 之前有网友提出希望可以批量导图,要实现起来并不难,于是就做了这个工具。 如上图所示,点击【制图相关】面板下【导出布局(批量)

    2024年02月16日
    浏览(54)
  • 【ArcGIS Pro二次开发】(59):Editing(编辑)模块

    ArcGIS Pro SDK中的\\\"Editing\\\"(编辑)模块提供了一系列API和工具,允许开发人员在ArcGIS Pro中实现各种地图数据编辑操作,从简单的要素绘制到复杂的数据集编辑。 下面列举一些常用编辑工具的实现方法。 1、获取所选要素的属性及赋值 2、通过【inspector】获取字段属性 3、裁剪面

    2024年02月13日
    浏览(40)
  • 【ArcGIS Pro二次开发】(80):标注_CIMLabelClass

    CIMLabelClass(Cartographic Information Model Label Class)是ArcGIS Pro SDK中的一个类。 它主要用于定义标签的样式和属性,如字体、大小、颜色、对齐方式等,以及标签的排列和布局规则。 1、获取当前地图的标签引擎 2、修改当前地图的标签引擎 3、将文字符号TextSymbol应用到要素图层

    2024年02月19日
    浏览(51)
  • 【ArcGIS Pro二次开发】(81):文本符号_CIMTextSymbol

    CIMTextSymbol是用于绘制文本图形注释的文本符号。 0、属性 Angel 文本符号的放置角度 BlockProgression 多行文本的堆叠方向 Callout 引线 DrawSoftHyphen 连字符 FlipAngle 文本翻转(镜像)到位的角度 FontEffects 上下标 FontEncoding 获取文字的Encoding FontFamilyName 字体名称 FontStyleName 字形样式,例

    2024年02月20日
    浏览(48)
  • 【ArcGIS Pro二次开发】(36):度分秒转十进制度

    经纬度坐标的表达方式比较常用的一般有2种,【度分秒和十进制度】。 在成果展示中,以【度分秒】居多,但如果要将坐标导入ArcGIS中,则一般需要用到【十进制度】,这个转换可以在Excel中进行,也可以在ArcGIS中的字段计算里计算,但都有点小麻烦。 为了更方便的转换,

    2024年02月09日
    浏览(52)
  • 【ArcGIS Pro二次开发】(60):按图层导出布局

    在使用布局导图时,会遇到如下问题: 为了切换图层和导图方便,一般情况下,会把相关图层做成图层组。 在导图的时候,如果想要按照图层组进行分开导图,如上图,想导出【现状图、规划图、管控边界】3张图,系统并没有方便的工具。 于是就自己做一个。   如上图所

    2024年02月12日
    浏览(47)
  • 【ArcGIS Pro二次开发】(56):界址点导出Excel

    界址点成果表是地籍测绘中的一种表格,用于记录地块的界址点坐标和相关属性信息。 这个工具的目的就是为了将地块要素导出为界址点成果表。 如上图所示,在【数据处理】组—【Excel相关】面板下,点击【界址点导出Excel】工具。 在弹出的工具框中,分别输入参数: 1、

    2024年02月14日
    浏览(38)
  • 【ArcGIS Pro二次开发】(58):数据的本地化存储

    在做村规工具的过程中,需要设置一些参数,比如说导图的DPI,需要导出的图名等等。 每次导图前都需要设置参数,虽然有默认值,但还是需要不时的修改。 在使用的过程中,可能会有一些常用的参数,希望能够保存下来,而不是每次都去修改默认值。 于是,想到可以将这

    2024年02月14日
    浏览(45)
  • 【ArcGIS Pro二次开发】(50):布局(Layout)的基本操作

    ArcGIS Pro SDK中的布局(Layout)是用于创建和编辑打印布局的一组功能。 Layout是打印布局的容器,它可以包含多个元素,例如地图框、文本框、图例、比例尺等。 Layout中包含多种元素,比较重要的有:地图(MapFrameElement)、文本(TextElement)、图片(PictureElement)、图例(LegendElement)等。

    2024年02月16日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包