ArcGIS Pro脚本工具(8)——国土报批TXT坐标文件批量转SHP实战
1. 国土报批TXT坐标文件的典型痛点
国土部门提供的土地报批数据通常以TXT格式存储坐标信息,这种文件结构看似简单,但在实际工作中却存在诸多不便。我处理过上百个这类文件,发现它们普遍存在三个致命缺陷:
首先,多地块混杂存储是最大的问题。一个TXT文件可能包含数十个地块的坐标,这些地块之间仅用空行分隔。传统的手动处理方法需要人工识别每个地块的起止位置,工作量巨大且容易出错。我曾处理过一个高标准农田项目,单个文件包含87个地块,用Excel处理花了整整两天时间。
其次,属性信息丢失现象严重。原始TXT文件通常只包含坐标数据,地块编号、地类代码等重要属性要么缺失,要么以注释形式存在。后期需要反复对照纸质材料手动添加属性,这个过程既枯燥又容易产生误差。
最后,坐标系不统一问题频发。不同项目可能采用不同坐标系(如CGCS2000、西安80等),但TXT文件中很少明确标注。有次我直接将坐标导入ArcGIS,结果地块位置偏差了200多米,导致整个项目返工。
2. Python+ArcPy自动化解决方案
2.1 基础转换原理
通过Python脚本处理TXT坐标文件的核心思路是坐标解析-点生成-面构建的三步走策略。具体实现流程如下:
import arcpy # 第一步:读取TXT文件 with open("input.txt", "r", encoding='gb2312') as f: lines = f.readlines() # 第二步:解析坐标点 points = [] for line in lines: if line.strip(): # 跳过空行 x, y = map(float, line.split()) points.append(arcpy.Point(x, y)) # 第三步:构建面要素 array = arcpy.Array(points) polygon = arcpy.Polygon(array)这个基础版本虽然简单,但已经能处理单个地块的转换。实际项目中我们需要扩展更多功能,比如处理多地块、添加属性等。
2.2 多地块处理技巧
处理多地块文件的关键在于空行识别和属性关联。改进后的脚本应该:
- 通过空行分割不同地块
- 为每个地块创建独立的面要素
- 保留原始地块顺序编号
- 支持自定义属性添加
def txt_to_shp(input_txt, output_shp): # 创建空SHP文件 sr = arcpy.SpatialReference(4490) # CGCS2000坐标系 arcpy.CreateFeatureclass_management( os.path.dirname(output_shp), os.path.basename(output_shp), "POLYGON", spatial_reference=sr ) # 添加属性字段 arcpy.AddField_management(output_shp, "DKBM", "TEXT") # 地块编码 arcpy.AddField_management(output_shp, "DLMC", "TEXT") # 地类名称 # 解析TXT文件 with arcpy.da.InsertCursor(output_shp, ["SHAPE@", "DKBM", "DLMC"]) as cursor: current_polygon = [] dk_index = 1 with open(input_txt, "r", encoding='gb2312') as f: for line in f: line = line.strip() if line: # 坐标行 parts = line.split() if len(parts) >= 2: x, y = map(float, parts[:2]) current_polygon.append(arcpy.Point(x, y)) else: # 空行表示地块结束 if current_polygon: polygon = arcpy.Polygon(arcpy.Array(current_polygon)) cursor.insertRow([polygon, f"DK{dk_index}", ""]) dk_index += 1 current_polygon = []3. ArcGIS Pro脚本工具封装
3.1 工具参数配置
将Python脚本封装为ArcGIS Pro脚本工具需要定义工具参数。关键参数包括:
- 输入TXT文件:文件选择器,支持多选
- 输出位置:工作空间或文件夹
- 坐标系:下拉选择框,常用CGCS2000、西安80等
- 属性映射:可选参数,用于关联外部属性表
在ArcGIS Pro中创建脚本工具时,需要设置参数数据类型和过滤条件。例如输入TXT文件参数应设置为"File"类型,并添加".txt"后缀过滤器。
3.2 异常处理机制
健壮的脚本工具必须包含完善的异常处理:
try: # 检查文件编码 with open(input_txt, 'rb') as f: rawdata = f.read() encoding = detect(rawdata)['encoding'] # 检查坐标有效性 if not all(-180 <= x <= 180 and -90 <= y <= 90 for x,y in coordinates): raise ValueError("坐标值超出合理范围") except UnicodeDecodeError: arcpy.AddError("文件编码识别失败,请尝试GB2312或UTF-8编码") except ValueError as e: arcpy.AddWarning(f"坐标数据异常:{str(e)}")特别要注意处理中文路径问题。建议在脚本开头添加:
import sys reload(sys) sys.setdefaultencoding('utf-8')4. 高级功能扩展
4.1 属性自动关联
通过与Excel属性表关联,可以实现智能属性填充:
import pandas as pd def join_attributes(shp_path, excel_path): # 读取Excel属性表 df = pd.read_excel(excel_path) # 更新SHP属性 with arcpy.da.UpdateCursor(shp_path, ["DKBM"] + list(df.columns[1:])) as cursor: for row in cursor: dkbm = row[0] match = df[df["地块编号"] == dkbm] if not match.empty: for i, col in enumerate(df.columns[1:], start=1): row[i] = match[col].values[0] cursor.updateRow(row)4.2 拓扑检查
转换完成后自动执行拓扑检查:
def check_topology(feature_class): # 创建拓扑 topology = arcpy.CreateTopology_management( os.path.dirname(feature_class), "检查拓扑", arcpy.Describe(feature_class).spatialReference ) # 添加规则 arcpy.AddFeatureClassToTopology_management(topology, feature_class) arcpy.AddRuleToTopology_management( topology, "Must Not Overlap (Area)", feature_class ) # 验证拓扑 arcpy.ValidateTopology_management(topology) return topology这套方案在某省国土三调项目中应用后,单个项目的处理时间从原来的3-5天缩短到2小时以内,且准确率达到100%。最关键的是,当甲方临时调整地块边界时,我们只需要重新运行脚本就能立即生成最新成果,不再需要从头开始手动处理。
