平时日常工作中,经常会遇到txt格式的测绘数据,这类数据通常只有不同地块的界址点集和坐标系信息,没法直接导入GIS软件中进行分析。拿到这类原始文本文件,首要工作就是将之转换为shp图层数据。
今天,主要分享两种转shp数据的方法,一种是在arcmap中直接转换,另一种是通过arcpy编程的方式进行转换。前者适合地块数量较少的情况,后者适合地块较多时批量处理。
首先打开原始txt坐标文件,将红框中某个地块的坐标点集复制保存到另一个空白txt文件中。
然后新建一个Excel文件,在文件打开中导入新保存的txt文件。
注意选择好分隔符,本例子中分割符为逗号。
将含有xy坐标的两列数据类型修改为数值,设置小数位数,并加上列头方便后续识别。其他列可以保留也可以删除掉,最后另存为97-2003版本后缀为xls的Excel文件。
打开ArcMap,选择【添加XY数据】,选择刚才生成的xls文件,指定XY字段和坐标系,坐标系可以通过原始txt文件判断,最后点击确定即可生成点要素。
生成的点要素如下图所示:
首先将生成的点导出为shp文件,然后打开ArcToolbox工具栏,选择【数据管理工具】--->【要素】--->【点集转线】工具,选择导出的shp文件,点击确定。
生成的线要素如下图所示:
打开ArcToolbox工具栏,选择【数据管理工具】--->【要素】--->【要素转面】工具,选择生成的线要素,点击确定。
生成的面要素如下图所示:
上述步骤只是将一个地块界址点生成面图层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
以上就是这次的分享的全部内容了,如有问题,请在后台留言。如果觉得这篇内容还不错,欢迎大家点赞、转发、转载,感谢大家的支持与陪伴。