——国土报批TXT坐标文件批量转SHP实战)
1. 国土报批TXT坐标文件的典型痛点国土部门提供的土地报批数据通常以TXT格式存储坐标信息这种文件结构看似简单但在实际工作中却存在诸多不便。我处理过上百个这类文件发现它们普遍存在三个致命缺陷首先多地块混杂存储是最大的问题。一个TXT文件可能包含数十个地块的坐标这些地块之间仅用空行分隔。传统的手动处理方法需要人工识别每个地块的起止位置工作量巨大且容易出错。我曾处理过一个高标准农田项目单个文件包含87个地块用Excel处理花了整整两天时间。其次属性信息丢失现象严重。原始TXT文件通常只包含坐标数据地块编号、地类代码等重要属性要么缺失要么以注释形式存在。后期需要反复对照纸质材料手动添加属性这个过程既枯燥又容易产生误差。最后坐标系不统一问题频发。不同项目可能采用不同坐标系如CGCS2000、西安80等但TXT文件中很少明确标注。有次我直接将坐标导入ArcGIS结果地块位置偏差了200多米导致整个项目返工。2. PythonArcPy自动化解决方案2.1 基础转换原理通过Python脚本处理TXT坐标文件的核心思路是坐标解析-点生成-面构建的三步走策略。具体实现流程如下import arcpy # 第一步读取TXT文件 with open(input.txt, r, encodinggb2312) 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_referencesr ) # 添加属性字段 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, encodinggb2312) 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, fDK{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:], start1): 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%。最关键的是当甲方临时调整地块边界时我们只需要重新运行脚本就能立即生成最新成果不再需要从头开始手动处理。