批量标准矢量shp互转txt工具:高效解决格式转换与数据交付难题
简介:面向自然资源系统及GIS数据处理人员的批量标准矢量SHP互转TXT工具,主要解决Shapefile几何与属性信息向通用文本格式转换的问题,可服务于建设用地报批、设施农用地上图、卫片处理等需要大量空间数据整理与交换的场景。压缩包共147个文件,约17.12MB,以54个dll动态库、35个gfs、24个csv及若干wkt、xsd、xml配置与样本数据为主,另含exe主程序与config配置文件,解压后运行即可在Windows 7/10环境下使用,无需复杂安装。已有4861人学习下载。工具通过读取SHP几何与属性表输出行列式TXT结构,并内置坐标系统相关支持,便于在非GIS环境中继续统计与分析,适合需要批量转换与快速核对的用户参考使用。
1. 批量标准矢量shp互转txt工具:一个被低估的格式转换刚需
上周帮某规划院的朋友处理一批地块数据,对方发来 37 个 shp 文件,要求全部转成 txt 坐标文本,字段顺序还得按他们内部规范来。我第一反应是打开 GIS 软件一个个导出,试了三个就放弃了——属性表字段名带中文、坐标系不统一、部分文件还有空几何。这种活看着简单,真批量跑起来全是坑。后来翻出这个批量标准矢量 shp 互转 txt 工具,命令行一挂,几十个文件几分钟跑完,字段映射和编码问题也一并解决了。它解决的就是 shp 与 txt 之间双向批量转换这件事:shp 转 txt 用于数据交付、坐标核对、导入不支持 shp 的老系统;txt 转 shp 用于把测绘队交来的坐标表快速还原成矢量图层。适合经常做数据交付、格式对接、批量入库的从业者,尤其是被"一个个点导出"折磨过的人。
2. shp 与 txt 的格式对账:先搞清楚两边到底存了什么
2.1 shp 不是单个文件,txt 也不是随便写写
很多人以为 shp 就是一个文件,实际上一个完整的 shapefile 至少包含 .shp(几何)、.shx(索引)、.dbf(属性)三个文件,缺一个都打不开。.shp 里存的是二进制几何坐标,.dbf 里存的是属性表,两者通过记录序号对应。而 txt 这边,常见的有两种形态:一种是纯坐标文本,每行一个点或一个环,用逗号或空格分隔;另一种是带表头的结构化文本,第一行列名,后面每行一条记录,几何用 WKT 或坐标串表示。这个工具在转换时默认按"结构化文本"处理,也就是保留属性字段,几何部分用坐标串表达,这样来回转换才不丢信息。
理解这个差异很关键。如果你只需要坐标、不需要属性,那转换逻辑可以很简单;但一旦涉及属性字段,就要处理字段名映射、类型转换、编码问题。shp 的 .dbf 字段名有 10 字符限制,中文名经常被截断或乱码,txt 这边如果表头写全名,转回去就对不上。工具的做法是维护一张字段映射表,转换时按映射表走,这个设计在后面讲参数配置时会细说。
2.2 为什么不用 GIS 软件手动导出
手动导出不是不行,问题在批量场景下效率太低。假设 50 个文件,每个打开、选导出、设参数、确认,熟练工也要两三个小时,中间还容易点错。更麻烦的是坐标系:不同文件可能带不同投影,手动导出时如果没注意,出来的 txt 坐标是投影坐标而不是经纬度,交付方拿到后对不上底图。工具在批量模式下会读取每个文件的 .prj 信息,按配置决定是否做坐标转换,这一点比手动靠谱。另外空几何、自相交多边形这些脏数据,手动导出时软件可能直接报错中断,工具则可以选择跳过或记录日志继续跑。
2.3 转换的核心流程拆解
整个转换链路可以拆成四步:读取 shp 文件组、解析几何与属性、按目标格式组装文本、写出文件。读取阶段要处理文件组完整性检查,缺 .dbf 时要么报错要么降级为纯几何模式。解析阶段是重点,点、线、面三种几何类型的坐标组织方式不同,面还要处理内环和外环的区分。组装阶段涉及分隔符选择、编码设置、数值精度控制。写出阶段要处理文件名冲突和目录结构。这四步里,解析和组装是最容易出问题的地方,后面的避坑章节会结合具体现象讲。
3. 上手实操:批量转换的命令行与参数配置
3.1 环境准备与工具获取
工具是绿色版,解压后直接可用,不依赖 GIS 桌面软件,但需要系统里有对应的运行库。常见做法是先确认运行环境,再跑一个单文件测试。解压后目录里一般有可执行主程序、一个示例配置文件和若干示例数据。建议先拿示例数据跑通,再换自己的数据,这样出问题容易定位是环境问题还是数据问题。
# 解压后进入工具目录,先看帮助确认参数 ./shp2txt --help # 用自带示例数据跑一个单文件转换,验证环境 ./shp2txt -i ./sample/demo.shp -o ./output/demo.txt -e UTF-8 -s ","第一行看帮助,重点确认输入输出参数名和编码参数是否支持。第二行是最小可用命令:-i指定输入 shp,-o指定输出 txt,-e指定编码,-s指定分隔符。跑通后打开输出文件,检查三件事:坐标数量对不对、属性列全不全、中文有没有乱码。这三项过了,说明环境和基础配置没问题。
3.2 批量转换的参数怎么设
批量模式的核心是一个输入目录加一个输出目录,工具会遍历目录下所有 shp 文件逐个转换。关键参数集中在编码、分隔符、精度和坐标处理上。
# 批量转换:输入目录下所有 shp 转 txt ./shp2txt -I ./input_shp -O ./output_txt \ -e UTF-8 \ -s "," \ -p 6 \ -c WGS84 \ --skip-empty \ --log ./convert.log逐项说明:-I和-O是批量输入输出目录,工具会保持相对目录结构;-e UTF-8指定输出编码,交付给 Windows 老系统时可能要改成 GBK;-s ","是字段分隔符,坐标串内部的分隔符另有参数控制,别混淆;-p 6是坐标保留小数位,经纬度一般 6 位够用,投影坐标可以设 3 位;-c WGS84指定目标坐标系,工具会读取源文件 .prj 做转换,源文件没有 .prj 时会跳过转换并记日志;--skip-empty遇到空几何跳过而不是中断;--log把每个文件的处理结果写进日志,批量跑完先看日志再抽查输出。
提示:批量转换前先用
--dry-run模式跑一遍,只输出将要处理的文件清单和识别到的坐标系,不实际写文件,能提前发现目录里混入的非 shp 文件或坐标系缺失的文件。
3.3 txt 转 shp 的反向操作
反向转换的参数逻辑类似,但多了几何类型推断这一步。txt 里如果没有明确的几何类型标识,工具需要根据坐标组织方式判断是点、线还是面。
# txt 批量转 shp,指定几何类型和字段类型映射 ./txt2shp -I ./input_txt -O ./output_shp \ -t polygon \ -e GBK \ -s "," \ --header \ --field-map ./field_map.json \ --prj ./ref/wgs84.prj-t polygon明确指定几何类型,避免推断错误;-e GBK是输入 txt 的编码,和输出 shp 的 .dbf 编码是两回事,.dbf 编码由工具内部按字段内容处理;--header表示第一行是列名;--field-map指向字段映射文件,解决 txt 表头全名与 .dbf 10 字符限制的冲突;--prj指定输出 shp 的投影文件,txt 本身不带坐标系信息,必须外部提供。字段映射文件是个 JSON,形如{"地块编号":"DKBH","面积平方米":"MJ"},左边是 txt 表头,右边是 shp 字段名,控制在 10 字符以内。
3.4 字段映射与编码的配合
字段映射和编码这两个参数经常要一起调。举个典型场景:txt 是 UTF-8 编码、表头是中文全名,目标 shp 要给一个只认 GBK 和短字段名的老系统用。这时候-e GBK管的是读入解码,--field-map管的是字段名转换,两者缺一不可。如果只设编码不设映射,字段名会被截断成前 10 个字节,中文可能截出半个字导致乱码;如果只设映射不设编码,读入阶段就已经乱码了,映射表对不上。我的习惯是先拿一个文件做单文件转换,用 GIS 软件打开检查字段名和属性值,确认无误再批量跑。
4. 避坑与排查:五条血泪经验
4.1 转换后中文属性全是问号
现象:txt 打开后属性列的中文变成问号或方块。原因:输出编码与目标系统不匹配,最常见的是工具默认 UTF-8,而接收方用 GBK 打开。解决:转换时显式指定-e GBK,或者转换后用编码转换工具转一道。更稳妥的做法是在配置里固定编码,别依赖默认值。这个问题在跨单位交付时几乎必现,属于玄学级别的坑——文件本身没坏,就是打开方式不对。
4.2 面要素转出来只剩外环
现象:带内环的面(比如带天井的地块)转成 txt 后,内环坐标丢了。原因:txt 格式本身没有标准的内外环标识,工具默认只输出外环,或者用固定分隔符区分但接收方不认。解决:转换前确认工具是否支持环标识参数,常见做法是在坐标串里用特定标记分隔内外环,并在交付说明里写清楚。如果接收方系统不支持内环,那就只能提前在 shp 里做面融合,把内环消掉,这是数据层面的处理,不是转换能解决的。
4.3 批量跑到一半中断,日志显示坐标系缺失
现象:几十个文件跑到第十几个停了,日志里写"prj not found"。原因:部分 shp 文件缺少 .prj 文件,工具在需要坐标转换时无法确定源坐标系。解决:加--skip-empty类似的容错参数不够,要加坐标系缺失时的降级策略,比如--no-prj-passthrough表示无 .prj 时不做转换直接输出原坐标,同时在日志里标记出来,事后人工核对。血泪经验是批量前先扫一遍目录,统计有多少文件缺 .prj,心里有数再跑。
4.4 txt 转 shp 后几何自相交
现象:转出来的面在 GIS 软件里检查报自相交错误。原因:txt 里的坐标点顺序或闭合方式不符合 shp 的面规则,比如首尾点没闭合、点序是顺时针但系统要求逆时针。解决:工具一般有--fix-ring参数自动闭合和纠正方向,但更根本的是在 txt 源头保证坐标串规范。如果源头数据来自多个测绘队,格式不统一是常态,建议转换后统一跑一遍几何修复,别指望转换工具全包。
4.5 字段名截断导致映射失败
现象:txt 转 shp 后,某些字段值为空,字段名变成了奇怪的前缀。原因:.dbf 字段名 10 字符限制,映射表里写的目标名超长被截断,或者映射表里的源字段名与 txt 实际表头有空格、全半角差异。解决:映射表里的目标名严格控制在 10 字符内,源字段名复制粘贴而不是手敲,转换前用--dry-run检查映射匹配情况。这个坑很隐蔽,因为转换不报错,只是默默丢数据,事后核对属性表才发现。
5. 进阶技巧:用校验脚本给批量转换上双保险
批量转换最怕的不是报错,是静默出错——文件生成了,但内容不对。我的习惯是转换完不直接交付,先跑一个校验脚本,把输入 shp 和输出 txt 的关键指标对一遍。下面这个 Python 脚本用常见的地理数据处理库读取两边数据,比对要素数量和坐标范围,能拦住大部分低级错误。
import shapefile # pyshp 库,轻量读取 shp import os def check_one(shp_path, txt_path, tol=1e-4): # 读 shp 要素数和坐标范围 sf = shapefile.Reader(shp_path) n_shp = len(sf) xs, ys = [], [] for shp in sf.shapes(): for x, y in shp.points: xs.append(x); ys.append(y) bbox_shp = (min(xs), min(ys), max(xs), max(ys)) # 读 txt,按分隔符解析坐标列(假设坐标在第 2、3 列) n_txt = 0 xs2, ys2 = [], [] with open(txt_path, encoding="utf-8") as f: next(f) # 跳过表头 for line in f: parts = line.strip().split(",") if len(parts) < 3: continue n_txt += 1 xs2.append(float(parts[1])); ys2.append(float(parts[2])) bbox_txt = (min(xs2), min(ys2), max(xs2), max(ys2)) # 比对要素数和范围 ok = n_shp == n_txt and all( abs(a - b) < tol for a, b in zip(bbox_shp, bbox_txt) ) return ok, n_shp, n_txt, bbox_shp, bbox_txt # 批量校验目录 for f in os.listdir("./input_shp"): if f.endswith(".shp"): name = f[:-4] ok, ns, nt, bs, bt = check_one( f"./input_shp/{f}", f"./output_txt/{name}.txt" ) print(f"{name}: {'OK' if ok else 'MISMATCH'} shp={ns} txt={nt}")脚本逻辑很直白:pyshp 读 shp 的要素数和所有坐标点,算出包围盒;txt 按行解析坐标列,同样算要素数和包围盒;两者数量一致且包围盒各分量差值在容差内就算通过。tol参数控制容差,经纬度数据设 1e-4 足够,投影坐标可以放宽到 1e-2。坐标列的位置按实际 txt 结构调整,脚本里假设是第 2、3 列,如果你的格式不同要改索引。这个脚本不校验属性值,只校验几何层面的完整性,但已经能拦住"文件生成了但要素丢了"这类最危险的问题。
更进一步的做法是把校验脚本挂到转换命令后面,形成"转换—校验—报告"的流水线。批量任务多的时候,我会把校验结果写进一个汇总表,哪些文件通过、哪些不通过、不通过的原因是什么,一目了然。从那以后我每次批量转换都强制走一遍校验,哪怕只转三个文件也不跳过——因为翻车往往就发生在"这次应该没问题"的时候。希望帮到你。
本文还有配套的精品资源,点击获取