简介:本资源是一套面向GIS从业者与空间数据处理初学者的ArcGIS实用工具包,聚焦Shapefile与文本格式间的双向转换需求,特别适用于土地利用分析、占补平衡核算及跨平台数据交换等实际业务场景。压缩包共11个文件,含1个核心ArcGIS工具箱(.tbx)、1个Python脚本(.py)用于txt转shp、2个Word文档(.docx)分别提供详细使用说明与WKID坐标系参考列表,另有4个XML配置文件支撑工具箱运行,以及开发环境相关文件(.iml、.gitignore等),整体仅317KB,轻量易部署。目前已有1727人学习下载,体现了其在中小规模空间数据文本化处理中的高频实用价值。用户可直接调用工具箱完成shp属性与几何信息的结构化导出,结合Python脚本反向重建矢量数据,并依据WKID文档准确设置坐标系统,避免投影错误;配套说明文档覆盖参数配置、输入输出规范及常见问题提示,显著降低使用门槛。
1. SHP转TXT:ArcGIS工具箱里那个总被忽略的“导出坐标表”功能,到底能不能扛住生产环境批量处理?
很多做国土、测绘、规划的一线人员,手头常有一堆SHP文件——地块边界、管线走向、监测点位,图层看着规整,但领导突然要一份Excel可读的坐标清单,或者第三方系统只认TXT格式的点序列(x,y,z,id),这时候打开ArcMap或ArcGIS Pro,翻遍【导出】菜单、右键图层属性、甚至进Geoprocessing搜索“txt”,结果要么弹出“不支持的输出格式”,要么导出的TXT是乱码、缺字段、没坐标值。其实ArcGIS工具箱里真有一个原生、稳定、可脚本化的SHP转TXT路径,它不依赖第三方插件,不调用Python临时脚本,也不需要手动复制粘贴属性表——就是【要素转ASCII】(Feature To ASCII)这个冷门工具。它专为结构化地理数据导出设计,支持点/线/面要素的坐标序列化,能保留OID、FID、自定义字段,还能控制分隔符、小数位数和坐标系单位。适合需要每日导出几十个SHP为标准TXT供下游系统解析的场景,也适合写进自动化工作流做前置数据清洗。如果你还在用“导出为Excel→另存为CSV→手动改后缀为TXT”这种玄学流程,这篇笔记就是为你写的。
2. 用【要素转ASCII】在本地跑通SHP转TXT的最小命令:从ArcMap到ArcGIS Pro双环境实测
2.1 ArcMap 10.8 环境下启用并定位该工具
ArcMap中,【要素转ASCII】不在默认工具箱里,它藏在【转换工具】→【转为ASCII】工具集中。启动步骤如下:
- 打开ArcMap,加载待转换的SHP图层(例如
parcel_boundary.shp); - 点击【地理处理】→【ArcToolbox】,展开【转换工具】→【转为ASCII】;
- 双击【要素转ASCII】,弹出参数对话框。
提示:若【转为ASCII】工具集不可见,说明当前许可等级不足(需Standard或Advanced许可),Basic许可不支持该工具。这是常见误判点——很多人以为是软件版本问题,实际是许可锁死。
关键参数说明:
- 输入要素:选择已加载的图层或直接浏览SHP路径;
- 输出ASCII文件:指定TXT保存路径,如
D:\output\parcel_coords.txt; - 输出坐标系(可选):若勾选,将按指定坐标系重投影后导出坐标;不勾选则用源SHP的坐标系原样输出;
- 字段分隔符:默认空格,但生产环境强烈建议改为
逗号或制表符(Tab),避免坐标值含空格时解析错位; - 小数位数:默认6位,对高精度测绘建议设为8~10;对规划类粗略坐标,4位足够,减小文件体积。
2.2 ArcGIS Pro 3.1 环境下的等效操作与界面差异
ArcGIS Pro中,该工具位于【分析】选项卡→【工具】面板→搜索栏输入Feature To ASCII,或路径:【工具箱】→【转换工具】→【转为ASCII】→【要素转ASCII】。
界面逻辑一致,但有三处关键变化:
- 【输出坐标系】参数变为下拉选择框,支持“与输入要素相同”、“GCS_WGS_1984”等常用预设;
- 新增【坐标格式】选项:
POINT_XY(仅导出X,Y)、POINT_XYZ(含Z值)、POLYLINE_COORDINATES(线要素逐点序列)、POLYGON_COORDINATES(面要素环坐标序列); - 【字段分隔符】支持下拉选择:空格、逗号、分号、制表符,不再需手动输入符号。
下面是一段可在ArcGIS Pro Python窗口中直接运行的最小化脚本,用于批量处理同一文件夹下所有点状SHP:
import arcpy import os # 设置工作空间 arcpy.env.workspace = r"D:\input_shp" output_folder = r"D:\output_txt" # 遍历所有SHP文件 for shp in arcpy.ListFeatureClasses("*", "Point"): input_path = os.path.join(arcpy.env.workspace, shp) output_name = os.path.splitext(shp)[0] + ".txt" output_path = os.path.join(output_folder, output_name) # 执行要素转ASCII,指定坐标格式为POINT_XY,分隔符为逗号,小数位4 arcpy.conversion.FeatureToASCII( in_features=input_path, out_ascii_file=output_path, coordinate_format="POINT_XY", field_delimiter=",", decimal_places=4 ) print(f"✅ 已导出: {shp} → {output_name}")逻辑说明:
coordinate_format="POINT_XY"是点要素最常用模式,每行输出X,Y,ID(ID默认为FID,若需其他字段需后续加字段映射);field_delimiter=","确保生成的TXT可被Excel或pandas直接read_csv()读取;decimal_places=4控制小数精度,在保证厘米级定位(坐标单位为米时)的同时,避免浮点冗余;- 脚本未设置
spatial_reference参数,即保持源SHP坐标系,避免重投影引入误差。
2.3 输出TXT文件结构详解:不是简单表格,而是带元数据头的地理序列
导出的TXT并非纯二维表,而是带结构化头部的地理数据文本。以一个含3个点的SHP为例,典型输出如下:
# ASCII File Generated by ArcGIS Pro 3.1 # Input Feature: D:\input_shp\monitor_points.shp # Coordinate Format: POINT_XY # Field Delimiter: , # Decimal Places: 4 # Spatial Reference: GCS_WGS_1984 (4326) # Fields: FID,X,Y 0,116.3852,39.9047 1,116.3861,39.9053 2,116.3870,39.9049关键特征:
- 前6行是注释头(以
#开头),记录生成环境、坐标系、字段名等元数据,方便溯源; - 第7行是字段名行(
FID,X,Y),由工具自动推断,若SHP含Z值且选POINT_XYZ,则为FID,X,Y,Z; - 数据行严格按字段顺序排列,无空行、无额外空格;
- 坐标值按
decimal_places四舍五入,非截断,保障数值合理性。
这种结构使TXT既可人工校验,又便于下游程序解析:读取时跳过#行,按逗号切分,第0列即ID,第1列为经度(X),第2列为纬度(Y)——完全符合GIS数据交换通用范式。
3. 字段映射与自定义输出:如何让TXT包含名称、高程、时间戳等业务字段?
3.1 默认导出只含几何字段?错,它其实能带任意属性字段
很多用户试过发现TXT里只有FID、X、Y三列,误以为【要素转ASCII】只能导出坐标。这是最大认知偏差。该工具默认导出所有字段,但前提是这些字段必须是“可导出类型”:数值型(Short, Long, Float, Double)、文本型(Text)、日期型(Date)。而BLOB、Raster、Geometry类型字段会被自动跳过。
验证方法:新建一个点SHP,添加字段NAME(Text, 长度50)、ELEV(Double)、INSPECT_DATE(Date),填入测试值,再运行【要素转ASCII】。输出TXT头部会变成:
# Fields: FID,X,Y,NAME,ELEV,INSPECT_DATE 0,116.3852,39.9047,"A-001",45.23,"2024-03-15"注意:日期字段导出为ISO格式字符串(YYYY-MM-DD),无需额外格式化;文本字段自动加双引号,防逗号干扰。
3.2 控制字段顺序与排除无关字段:用【字段映射】参数精准裁剪
若SHP含20个字段,但只需导出其中5个(如ID_CODE,X,Y,STATUS,UPDATE_TIME),可借助【字段映射】参数精简输出,避免下游解析负担。
在ArcMap或Pro的工具对话框中,点击【字段映射】右侧的“…”按钮,弹出字段映射编辑器。操作步骤:
- 左侧列表显示所有源字段,右侧为空白目标字段区;
- 拖拽需保留的字段(如
ID_CODE)到右侧,其别名自动设为原名; - 对于几何字段
Shape,需手动添加:点击右侧【添加字段】→ 类型选Double→ 别名填X,再在【源字段】下拉中选Shape→ 【属性】选FirstPoint.X;同理添加Y字段,属性选FirstPoint.Y; - 不需的字段(如
SHAPE_AREA,CREATOR)不拖入右侧,即自动排除; - 点击【确定】返回主界面,执行导出。
这样导出的TXT头部为:
# Fields: ID_CODE,X,Y,STATUS,UPDATE_TIME "A001",116.3852,39.9047,"OK","2024-03-15"注意:
FirstPoint.X和FirstPoint.Y是ArcGIS内部表达式,仅对点要素有效;线/面要素需用Centroid.X/Centroid.Y获取中心点,或用POLYLINE_COORDINATES模式导出全部节点。
3.3 处理中文字段名与乱码:编码设置与系统区域配置双保险
若SHP属性表字段名为中文(如点位名称、高程值),导出TXT后用记事本打开显示乱码(如λ),并非工具缺陷,而是Windows记事本默认用ANSI编码读取UTF-8文件。
解决方案分两步:
第一步:确保ArcGIS内部使用UTF-8
- ArcGIS Pro:【项目】→【选项】→【地域设置】→【字符编码】选
UTF-8; - ArcMap:需修改注册表(风险较高),更稳妥做法是在导出前,用【表转Excel】先导出属性表为xlsx,确认中文正常,再用【要素转ASCII】——因工具读取的是属性表缓存,非原始DBF。
第二步:下游程序正确解码
- Python读取时显式指定编码:
pd.read_csv("output.txt", skiprows=6, encoding='utf-8'); - Excel导入时,用【数据】→【从文本/CSV】→ 选择文件 → 编码选
UTF-8→ 分隔符选逗号。
实测表明,只要ArcGIS Pro设置为UTF-8且字段名不含特殊符号(如/、\、*),导出TXT的中文字段名和值均能100%保真。
4. 避坑:SHP转TXT的5个血泪经验,第3条90%的人第一次都踩过
4.1 现象:导出TXT为空文件(0字节),日志无报错
原因:输入SHP图层处于“定义查询”(Definition Query)状态,且查询条件过滤掉所有要素。工具检测到0个要素,静默生成空文件。
解决:右键图层→【属性】→【定义查询】→ 清除查询表达式,或确认查询后仍有要素可见;也可在工具中直接输入SHP绝对路径,绕过图层状态影响。
4.2 现象:TXT中X/Y坐标值异常巨大(如1e+07),明显不是经纬度
原因:SHP坐标系未正确定义,或定义错误(如将WGS84误标为CGCS2000)。工具原样导出坐标值,不做任何校验。
解决:用【描述】工具检查SHP的spatialReference属性;若为空,用【定义投影】工具赋予正确坐标系;若错误,用【投影】工具重投影后再导出。
4.3 现象:线/面要素导出TXT后,坐标行数远超预期,且出现负数、重复点
原因:【坐标格式】选错。对线要素误选POINT_XY,工具会把整条线的起点、终点、所有折点都压成单行X,Y,导致一行变多行;而POLYLINE_COORDINATES才是线要素的正确模式,它按“线ID+坐标序列”分块输出。
解决:务必根据要素类型选择坐标格式——点选POINT_XY/POINT_XYZ,线选POLYLINE_COORDINATES,面选POLYGON_COORDINATES;导出后用文本编辑器搜索#号,确认每个要素块有独立头部。
4.4 现象:导出TXT的字段名行(如FID,X,Y)与数据行字段数不匹配
原因:SHP中存在空值(Null)的文本字段,且该字段长度为0。ArcGIS在生成字段头时仍计入,但导出数据行时跳过空字段,造成列数错位。
解决:导出前用【计算字段】工具为所有文本字段设默认值(如"N/A");或用【删除字段】移除全空字段;最彻底方案是用【表转Excel】先导出,人工清理空列后再转回SHP。
4.5 现象:批量脚本运行时报错ERROR 000210: Cannot create output
原因:输出路径含中文、空格或特殊符号(如&、#),Windows系统路径解析失败;或目标文件夹不存在且脚本未创建。
解决:脚本中统一用os.path.normpath()标准化路径;输出前加判断:if not os.path.exists(output_folder): os.makedirs(output_folder);路径变量全用原始字符串(r"D:\data")或双反斜杠("D:\\data")。
5. 进阶技巧:用TXT坐标反向生成SHP,构建闭环数据流
5.1 为什么需要反向生成?——当TXT是唯一可信源时
在某些现场作业场景中,外业设备(如RTK手簿、无人机飞控)直接导出TXT坐标文件,格式为ID,Lat,Lon,Elev,Time,但无空间参考信息。此时,你手头没有原始SHP,只有这份TXT,却需要将其还原为带属性的点图层,用于叠加分析或入库。这就需要【ASCII转要素】(ASCII To Feature Class)工具,它是【要素转ASCII】的逆向操作,构成完整闭环。
5.2 用【ASCII转要素】还原点图层:4步搞定坐标系与字段绑定
假设你有survey_points.txt,内容如下(无头部,纯数据):
A001,39.9047,116.3852,45.2,2024-03-15 A002,39.9053,116.3861,46.1,2024-03-15还原步骤:
准备字段定义文件(.csv):新建
fields_def.csv,定义各列类型与名称:Name,Type,Length ID,TEXT,10 Y,DOUBLE, X,DOUBLE, ELEV,DOUBLE, TIME,DATE,注意:Y列必须在X前列,因ArcGIS约定“纬度在前、经度在后”对应地理坐标系。
执行【ASCII转要素】:
- 输入ASCII文件:
survey_points.txt; - 输出要素类:
survey_points.shp; - 输入字段文件:
fields_def.csv; - X字段:
X;Y字段:Y; - 坐标系:明确指定
GCS_WGS_1984(EPSG:4326); - 输出要素类型:
POINT。
- 输入ASCII文件:
验证结果:生成的SHP属性表将严格按
fields_def.csv定义,含5个字段,坐标正确落位。批量自动化:将上述过程封装为Python脚本,配合
arcpy.management.ASCIIToFeatureClass函数,可每日定时拉取设备上传的TXT,自动生成最新SHP供内业处理。
5.3 TXT与SHP互转的精度守恒原则:小数位、坐标系、字段类型三者必须一致
我在某跨平台系统对接项目中吃过亏:外业TXT用6位小数导出,内业用4位小数导入,导致点位偏移达0.1米(WGS84下1度≈111km,1e-4度≈11米)。后来总结出三条铁律:
| 维度 | 守恒要求 | 违反后果 |
|---|---|---|
| 小数位数 | 导出TXT的decimal_places必须等于导入时坐标解析的保留位数(如pandas读取后.round(6)) | 坐标偏移、拓扑错误 |
| 坐标系 | TXT头部# Spatial Reference必须与【ASCII转要素】中指定的坐标系完全一致(含WKID) | 投影扭曲、距离失真 |
| 字段类型 | TXT中数值字段不能含单位符号(如45.2m),日期不能含时区(如2024-03-15T08:00:00Z) | 导入失败、字段被识别为TEXT |
现在我所有项目都强制执行:导出时加decimal_places=8,坐标系用WKID(如4326)明文指定,字段定义文件用CSV而非手工输入——这成了我的后悔药,也是团队交接时最省心的文档。
希望帮到你。
本文还有配套的精品资源,点击获取