Python|勘测定界TXT坐标点转shp文件——Arcpy实现

平时日常工作中,经常会遇到txt格式的测绘数据,这类数据通常只有不同地块的界址点集和坐标系信息,没法直接导入GIS软件中进行分析。拿到这类原始文本文件,首要工作就是将之转换为shp图层数据。

今天,主要分享两种转shp数据的方法,一种是在arcmap中直接转换,另一种是通过arcpy编程的方式进行转换。前者适合地块数量较少的情况,后者适合地块较多时批量处理。

一、ArcMap实现

1、txt文件转Excel文件

首先打开原始txt坐标文件,将红框中某个地块的坐标点集复制保存到另一个空白txt文件中。

Python|勘测定界TXT坐标点转shp文件——Arcpy实现_第1张图片

然后新建一个Excel文件,在文件打开中导入新保存的txt文件。

Python|勘测定界TXT坐标点转shp文件——Arcpy实现_第2张图片

注意选择好分隔符,本例子中分割符为逗号。

Python|勘测定界TXT坐标点转shp文件——Arcpy实现_第3张图片

将含有xy坐标的两列数据类型修改为数值,设置小数位数,并加上列头方便后续识别。其他列可以保留也可以删除掉,最后另存为97-2003版本后缀为xls的Excel文件。

Python|勘测定界TXT坐标点转shp文件——Arcpy实现_第4张图片

2、Excel文件生成点要素

打开ArcMap,选择【添加XY数据】,选择刚才生成的xls文件,指定XY字段和坐标系,坐标系可以通过原始txt文件判断,最后点击确定即可生成点要素。

Python|勘测定界TXT坐标点转shp文件——Arcpy实现_第5张图片

生成的点要素如下图所示:

Python|勘测定界TXT坐标点转shp文件——Arcpy实现_第6张图片

3、点要素转线要素

首先将生成的点导出为shp文件,然后打开ArcToolbox工具栏,选择【数据管理工具】--->【要素】--->【点集转线】工具,选择导出的shp文件,点击确定。

Python|勘测定界TXT坐标点转shp文件——Arcpy实现_第7张图片

生成的线要素如下图所示:

Python|勘测定界TXT坐标点转shp文件——Arcpy实现_第8张图片

4、线要素转面要素

打开ArcToolbox工具栏,选择【数据管理工具】--->【要素】--->【要素转面】工具,选择生成的线要素,点击确定。

Python|勘测定界TXT坐标点转shp文件——Arcpy实现_第9张图片

生成的面要素如下图所示:

Python|勘测定界TXT坐标点转shp文件——Arcpy实现_第10张图片

5、面要素导出为shp

Python|勘测定界TXT坐标点转shp文件——Arcpy实现_第11张图片

二、ArcPy实现

上述步骤只是将一个地块界址点生成面图层shp,操作起来就已经很繁琐了,假如一个txt文件中包含大量地块或同时拥有许多txt文件时那工作量就要爆炸了。因此,可以通过调用上述几个脚本工具编写python脚本进行批量处理。

1、核心函数介绍

①遍历文件夹批量获取txt文件名

指定文件根目录,遍历根目录获取所有txt完整路径名,同时修改包含特殊字符的文件名称,最后保存为一个txt文件名称列表。

 1def getfnames(root, filetype):
 2    txt_fullname_list = []
 3    #遍历获取文件名,顺便更改特殊字符
 4    for root, dirs, files in os.walk(root):
 5        files[:] = [f for f in files if f.endswith(filetype)]
 6        for txt in files:
 7            txt_fullname = os.path.join(root, txt)
 8            new_txt_fullname = txt_fullname.replace('-', '_').replace('、', '').replace('(', '').replace(')', '')
 9            #修改原文本文件名,去掉特殊字符
10            os.rename(txt_fullname, new_txt_fullname)
11            txt_fullname_list.append(new_txt_fullname)
12    return txt_fullname_list

②单个txt转面shp文件

依次遍历txt文件名称列表,将每一个txt文件生成一个同名称shp文件。注意,所有txt文件默认编码方式需为gbk编码。

 1def txtToshp(txtfname):
 2    print(txtfname)
 3    #1.读取坐标信息
 4    polygon_list = []
 5    polygonGeometryList = []
 6    arcpy.env.workspace = u"E:\\shp\\陕西txt"
 7
 8    polygon = []
 9    id = ''
10    with open(txtfname, 'r') as file:
11        line = file.readline().decode('gbk').encode('utf-8')
12        while line:
13            line = file.readline().decode('gbk').encode('utf-8')
14            if "带号" in line:
15                id = line.split('=')[-1].strip('\n')
16            if len(line.split(',')) == 4:
17                point = [[], []]
18                c, d, e, f = line.split(',')
19                point[1].append(e)  # Y坐标
20                point[0].append(f)  # X坐标
21                polygon.append(point)
22            elif len(line.split(',')) >= 6:
23                if polygon:
24                    polygon_list.append(polygon)
25                polygon = []
26        polygon_list.append(polygon)
27
28    #2.创建面要素
29    outfile = txtfname.split('.')[0] + ".shp"
30    for polygon in polygon_list:
31        array = arcpy.Array()
32        for xy in polygon:
33            point = arcpy.Point(float(xy[0][0]), float(xy[1][0]))
34            #print(point)
35            array.add(point)
36        # 创建面
37        polygon = arcpy.Polygon(array)
38        polygonGeometryList.append(polygon)
39
40    if arcpy.Exists(outfile):
41        print(outfile + " have alread!")
42    else:
43        # 保存要素到工作空间
44        arcpy.CopyFeatures_management(polygonGeometryList, outfile)
45        # 定义投影
46        spatial_id_dic = {'35':4523,'36':4524,'37':4525,'38':4526}
47        #print(id)
48        spatial_id = spatial_id_dic[id]
49        #print(spatial_id)
50        if spatial_id:
51            spatial = arcpy.SpatialReference(spatial_id)
52            arcpy.DefineProjection_management(outfile, spatial)
53        else:
54            print("spatial_id error....")

2、完整脚本

 1# -*- coding: utf-8 -*-
 2# @Time    : 2021/5/20 16:43
 3# @Author  : 药菌
 4
 5import arcpy
 6import os
 7
 8def getfnames(root, filetype):
 9    txt_fullname_list = []
10    #遍历获取文件名,顺便更改特殊字符
11    for root, dirs, files in os.walk(root):
12        files[:] = [f for f in files if f.endswith(filetype)]
13        for txt in files:
14            txt_fullname = os.path.join(root, txt)
15            new_txt_fullname = txt_fullname.replace('-', '_').replace('、', '').replace('(', '').replace(')', '')
16            #修改原文本文件名,去掉特殊字符
17            os.rename(txt_fullname, new_txt_fullname)
18            txt_fullname_list.append(new_txt_fullname)
19    return txt_fullname_list
20
21def txtToshp(txtfname):
22    print(txtfname)
23    #1.读取坐标信息
24    polygon_list = []
25    polygonGeometryList = []
26    arcpy.env.workspace = u"E:\\shp\\陕西txt"
27
28    polygon = []
29    id = ''
30    with open(txtfname, 'r') as file:
31        line = file.readline().decode('gbk').encode('utf-8')
32        while line:
33            line = file.readline().decode('gbk').encode('utf-8')
34            if "带号" in line:
35                id = line.split('=')[-1].strip('\n')
36            if len(line.split(',')) == 4:
37                point = [[], []]
38                c, d, e, f = line.split(',')
39                point[1].append(e)  # Y坐标
40                point[0].append(f)  # X坐标
41                polygon.append(point)
42            elif len(line.split(',')) >= 6:
43                if polygon:
44                    polygon_list.append(polygon)
45                polygon = []
46        polygon_list.append(polygon)
47
48    #2.创建面要素
49    outfile = txtfname.split('.')[0] + ".shp"
50    for polygon in polygon_list:
51        array = arcpy.Array()
52        for xy in polygon:
53            point = arcpy.Point(float(xy[0][0]), float(xy[1][0]))
54            #print(point)
55            array.add(point)
56        # 创建面
57        polygon = arcpy.Polygon(array)
58        polygonGeometryList.append(polygon)
59
60    if arcpy.Exists(outfile):
61        print(outfile + " have alread!")
62    else:
63        # 保存要素到工作空间
64        arcpy.CopyFeatures_management(polygonGeometryList, outfile)
65        # 定义投影
66        spatial_id_dic = {'35':4523,'36':4524,'37':4525,'38':4526}
67        #print(id)
68        spatial_id = spatial_id_dic[id]
69        #print(spatial_id)
70        if spatial_id:
71            spatial = arcpy.SpatialReference(spatial_id)
72            arcpy.DefineProjection_management(outfile, spatial)
73        else:
74            print("spatial_id error....")
75
76if __name__ == '__main__':
77
78    #root = u"E:\\shp\\陕西txt"
79    root = arcpy.GetParameterAsText(0)
80
81    #获取指定目录下所有txt文件的全路径
82    txt_fullname_list = getfnames(root, '.txt')
83
84    #各文本文件依次生成shp图层文件
85    for txt_fullname in txt_fullname_list:
86        txtToshp(txt_fullname)
87        pass

以上就是这次的分享的全部内容了,如有问题,请在后台留言。如果觉得这篇内容还不错,欢迎大家点赞、转发、转载,感谢大家的支持与陪伴。

你可能感兴趣的:(GDAL/OGR空间数据处理,python,ArcGIS,Arcpy)