ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ArcGIS中shp转txt的自定义工具箱制作与避坑指南

ArcGIS中shp转txt的自定义工具箱制作与避坑指南 简介在ArcGIS环境下实现Shapefile与文本文件批量转换的专用工具箱包含自定义tbx工具、Python转换脚本和配套说明文档面向需要处理土地占补平衡、跨系统数据交换的GIS从业者与数据处理人员。资源共11个文件压缩包仅317KB除核心工具箱与脚本外还配有使用说明文档、坐标系统参考文档以及若干工程配置和开发辅助文件其中坐标系统参考信息对选择投影尤为重要可帮助用户避免因坐标设置错误导致转换结果偏移。已有1676人学习下载适合希望在ArcGIS中快速完成矢量数据与txt表格互转、同时保持空间参考一致的用户。通过学习使用说明能掌握参数设置与完整操作流程查看Python脚本则可理解底层读写逻辑并针对自身字段结构、坐标要求进行二次定制从而提升土地数据汇总、日常整理和跨平台导入导出效率。 做GIS数据处理最容易被问爆的问题里“shp转txt”绝对排得上号。别看它听起来简单一旦涉及ArcGIS不同版本、中文编码、坐标字段坑一个接一个。.dbf属性表虽然能直接打开但你要对接脚本、批量整理数据或者把数据交给不装GIS的同事时一个顺手好用的shp转txt ArcGIS工具箱远比临时找在线转换工具靠谱。这篇文章就从需求分析、脚本编写、工具箱封装到常见坑位把一个能落地的自定义转换工具箱完整拆一遍。无论你用的是ArcGIS Desktop还是ArcGIS Pro都可以照着手搓一个。1. 为什么这个工具值得自己做1.1 真实场景里的三种需求先说说我在实际项目中遇到的shp转txt需求基本能分三类。第一类是“给外部系统喂数据”。很多业务系统不认shp、不认gdb只认纯文本格式。比如把地块中心点坐标导出成清单交给施工方做定位把路网节点属性导出成txt给运维脚本去比对。这类需求往往要求字段顺序可控、坐标明确、分隔符固定ArcGIS自带的属性表按钮能做但不灵活。第二类是“批量整理归档”。你手里有几十个shp文件可能是网上扒下来的路网、行政区边界、渔网分割结果字段五花八门。一个个打开属性表再“另存为”效率太低而且很容易漏掉某个文件或混入不需要的字段。这时候固定模板化的转换工具配合批处理循环才是正解。第三类是“清理和校验数据”。txt文件可以用记事本、Notepad、Excel甚至命令行工具快速预览不需要启动重型GIS软件。属性值里有没有空值、编码有没有乱码、坐标是否在合理范围转成txt后用文本工具扫一遍比在ArcGIS里盯属性表舒服得多。1.2 内置导出功能到底卡在哪很多人第一反应是ArcGIS不是自带“表转Excel”或“导出CSV”吗但实际用下来内置功能有几个明显的痛点。“表转Excel”输出的是xls/xlsx不是txt而且老版本对65536行以上的数据会直接截断。数据量大一点的shp很容易踩这个雷。属性表右键“导出”虽然能选文本文件但每次都要手动挑字段、选格式字段一多就烦。更麻烦的是坐标并不在属性表里要先用“添加XY坐标”工具生成两个字段再导出一步都不能少。自带CSV导出的编码和分隔符经常和你的下游程序对不上尤其是中文环境下CSV用Excel打开乱码是常态。所以说把这些反复操作固化成一个小工具箱不是炫技是真能省时间的。2. 核心思路用Python脚本搭一个可复用的“转换器”2.1 为什么选脚本工具而不是ModelBuilder做这个转换可能有三个技术路线ModelBuilder、ArcPy独立脚本、自定义脚本工具。ModelBuilder虽然拖拽方便但处理“每一行都要做条件判断”这种逻辑时很笨拙。比如空值要不要写成空字符串、分隔符怎么转义、要不要自动附带坐标字段这些在ModelBuilder里要么绕圈子要么做不了。ArcPy脚本就不一样几行代码就能控制底层逻辑。再进一步为什么不直接跑一个.py文件因为ArcGIS的脚本工具能把参数面板做成可视化对话框别人使用的时候不用懂代码输入要素类、选好输出路径、点确定就行。而且参数能直接读到工具界面里不用每次打开脚本改路径。这对团队里不太熟悉Python的人特别友好。2.2 输出格式和坐标字段怎么定动手写脚本前先想清楚输出格式。txt不等于只有一个模板实际使用中常见的分隔符有三种半角逗号、制表符、竖线。默认我用逗号因为绝大多数场景下CSV/txt都能用逗号解析。但如果你处理的是带描述性文字的字段字段值里可能本身就有逗号这时候最好用竖线或制表符避免下游程序解析错位。坐标字段也是重点。shp文件本身不直接存储“X坐标”“Y坐标”这样的属性字段经纬度或平面坐标都藏在几何对象里。所以脚本里要动态加入SHAPEX和SHAPEY两个token让SearchCursor在读取属性时顺手把质心坐标带出来。对点要素来说这就是点本身的坐标对线、面要素来说这就是要素质心坐标。如果你需要的是每个折点坐标那要另写一段遍历几何对象的逻辑这篇先不展开。3. 工具箱制作全流程从脚本到面板3.1 先把脚本跑通配工具箱之前一定要先单独把脚本调通否则脚本里面一个语法错误你在ArcToolbox面板里只能看到一句笼统报错排查起来很痛苦。下面这段是我常用的基础版本兼容ArcGIS Desktop 10.x和ArcGIS Pro的Python环境关键是用了codecs.open和utf-8-sig对中文编码的处理比较稳。# -*- coding:utf-8 -*- import arcpy import codecs import os def shp_to_txt(input_fc, output_txt, delimiter,, need_xyTrue): arcpy.env.overwriteOutput True # 获取属性字段列表排除几何字段 fields [f.name for f in arcpy.ListFields(input_fc) if f.type ! Geometry] # 可选在末尾附加质心XY坐标 if need_xy: fields.extend([SHAPEX, SHAPEY]) # utf-8-sig 会在文件头写入BOMExcel打开不易乱码 with codecs.open(output_txt, w, utf-8-sig) as f: # 写表头 f.write(delimiter.join(fields) \n) # 逐行读取要素属性并写入 with arcpy.da.SearchCursor(input_fc, fields) as cursor: for row in cursor: row [ if v is None else str(v) for v in row] f.write(delimiter.join(row) \n) print(输出完成 output_txt) if __name__ __main__: input_fc arcpy.GetParameterAsText(0) output_txt arcpy.GetParameterAsText(1) delimiter arcpy.GetParameterAsText(2) or , need_xy arcpy.GetParameter(3) if arcpy.GetParameter(3) is not None else True shp_to_txt(input_fc, output_txt, delimiter, need_xy)代码逻辑其实就三步先拿到shp的全部属性字段把几何字段过滤掉再把坐标token追加到字段列表末尾最后用SearchCursor逐行读出来按分隔符拼成字符串写文件。空值统一转成空字符串避免txt里出现一堆None。3.2 封装成ArcGIS工具箱工具脚本能跑之后再把它挂到工具箱里。具体操作各版本菜单略有差异但思路一致。在Catalog窗口里右键目标文件夹选择“新建工具箱”起个名字比如DataTools.tbx。右键工具箱选择“添加” - “脚本”填入工具名称和标签。依次设置四个参数输入要素类数据类型选“要素图层”方向为“输入”必填。输出txt文件数据类型选“文件”方向为“输出”建议设置默认扩展名为.txt。分隔符数据类型选“字符串”方向为“输入”默认值填,。是否添加XY数据类型选“布尔型”方向为“输入”默认值勾选。在“源文件”里指定刚才写好的.py脚本路径。保存后双击工具测试一遍。参数名称很重要工具箱面板上显示的名称和脚本里GetParameterAsText的下标是对应的顺序不能乱。如果你在中途改了参数顺序脚本里的下标也要同步改否则会出现“输出文件里写的是输入字段”这种诡异问题。3.3 验证与批量扩展工具封装完不要急着全量跑。先用一个小shp试跑打开生成的txt检查三件事表头字段是否完整、坐标列是否出现、中文是否正常。确认无误后再跑大批数据。一旦基础工具稳定批量转换是很自然的扩展。你甚至不用改工具箱参数写一个外层循环脚本就行import arcpy import os arcpy.env.workspace rD:\shp_folder out_dir rD:\txt_output for fc in arcpy.ListFeatureClasses(): out_txt os.path.join(out_dir, os.path.basename(fc) .txt) shp_to_txt(fc, out_txt)这样就能把一个文件夹里的所有shp按同名规则输出成txt。网上常看到的“shp批量转kml”“shp批量转txt”其实都是同一个套路先做好单文件工具再在外面套一层循环。4. 实操细节与避坑要点4.1 中文乱码和Excel打开问题这是shp转txt里出现频率最高的问题。shp文件的dbf属性表本身有编码声明但网上下的数据来源不一常见有GBK、UTF-8、甚至无声明编码。你用Python读出来的字符串其实是Unicode只要写文件时统一用utf-8-sig大多数情况下都能在记事本和Excel里正常显示。但如果你打开txt看到一堆“锟斤拷”或“乱码”通常不是脚本问题而是源头数据已经是乱码。这种情况下先检查shp属性表在ArcMap或Pro里显示是否正常。如果原表就乱说明dbf编码被系统识别错了别指望转txt能修好。4.2 字段选择、空值与分隔符默认脚本会把所有非几何字段都导出包括一些你没用的字段比如Shape_Length、Shape_Area。这在某些场景下挺烦人。我一般建议做成两个版本一个直接全字段输出适合快速导出另一个限制字段列表参数里加一个“可选字段”多值参数让用户手动勾选。不过多值参数解析稍微麻烦点新手可以从全字段版本用起。空值处理上SHAPEX和SHAPEY一般不会为空但属性字段经常有Null。脚本里 if v is None else str(v)这个写法很好建议保留。如果你用Excel打开txt后需要做筛选或计算空字符串比None顺手得多。分隔符选型还有一个细节如果字段里可能含有换行符导出后txt的列数会错乱。这种脏数据建议先做字段清理或者改用制表符分隔并在下游解析时去掉换行符。4.3 大数据量shp的导出性能几十万甚至上百万行的shp用arcpy.da.SearchCursor逐行写文件速度是可以接受的但有几个习惯必须养成。不要在循环里用arcpy.GetParameterAsText获取参数值脚本运行时每次获取都有额外开销。启动时一次性取好。不要在循环里print每一行控制台输出会拖慢速度。如果数据量特别大可以考虑分批读取但shp本身有2GB限制真到百万行级别建议先考虑转成File Geodatabase要素类再处理速度和稳定性都会好很多。5. 常见问题与排查记录5.1 问题速查表问题可能原因解决办法输出txt打开后中文乱码源dbf编码有问题或写入时未用utf-8-sig先确认shp属性表本身不乱码写文件统一用utf-8-sig坐标列没有值参数“是否添加XY”未勾选或脚本里fields列表被覆盖确认勾选检查代码中fields的append逻辑txt里出现一堆None属性值为空脚本未做空值转换写入前执行 if v is None else str(v)工具面板参数顺序错乱脚本中GetParameterAsText下标与参数设置不一致从0开始核对参数顺序多个参数时写注释在ArcMap里脚本报错但在Pro里正常Python 2和Python 3语法/编码差异用兼容写法如codecs.open或直接迁移到Pro同一份txt在Excel和记事本里显示不一致编码或分隔符被软件自动识别错误用utf-8-sig编码导入Excel时手动指定分隔符5.2 两个容易被忽略的细节第一个是工具路径。工具箱和.py脚本尽量不要放在带中文、空格或特殊字符的路径下。虽然大多数电脑没任何问题但我在真实项目里遇到过脚本工具在中文路径下“时而能用时而不能用”的怪事最后把工具挪到纯英文目录就好了。这不是玄学是Python解释器和ArcGIS组件在底层处理路径编码时偶尔会抽风。第二个是坐标参考。如果你给的是一个没定义坐标系或者坐标系奇怪的shp导出的XY可能不是你想的那个坐标系。要保证txt坐标符合预期务必先确认shp的坐标系。如果是地理坐标系就是经纬度如果是投影坐标系就是平面坐标。网上下的“全国路网shp数据”“区域边界图”这类数据坐标系五花八门导出前看一下图层属性比导出后再后悔省事得多。6. 从txt还能往哪走6.1 二次加工与外部系统对接txt导出之后马上就能接各种下游操作。比如用Python的pandas读进来做统计、用Excel做透视、用脚本批量生成坐标点清单、甚至直接grep匹配关键字。我做外业控制点管理时就把点shp转成txt再按固定格式拼成设备导入文件整个过程完全脱离ArcGIS界面效率高很多。6.2 工具箱思路的扩展方向这个自定义工具箱的思路完全可以复用。把脚本里的核心函数换成“shp转kml”、换成“shp转3dtiles”、换成“shp属性清洗”外壳不变照样能封装成ArcGIS工具箱参数面板。很多人找“图吧工具箱”“cc工具箱”之类的替代品其实不如掌握自己封装小工具的方法遇到具体问题直接改脚本几小时就能做出一个顺手工具。最后说一个我自己的习惯这个工具箱我一般不放默认的“下载”目录而是在项目里单独建一个工具目录脚本和工具箱放一起路径里不要有中文和空格。每次批量转换前先拿一个小shp试跑一次瞄一眼txt结构对不对再去跑全量。数据这种东西导出前多想一分钟后面能省一晚上。本文还有配套的精品资源点击获取
返回列表