拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

shp与txt互转工具详解:坐标系统、批量转换与土地报备实战

shp与txt互转工具详解:坐标系统、批量转换与土地报备实战 干项目报备、做内业整理的朋友对这两样东西肯定不陌生外业RTK导回来的txt坐标文件以及报备系统里非要要你传的shp图层。项目一多麻烦就来了。二十多亩地的实测边界导出来是几百行“点号、X、Y”报备平台却只认shp面好不容易把面做出来界址点坐标表又要逐项按固定表头出txt。只要没有一套顺手的“shp与txt互转工具”坐标批量转换这件事就能把人磨到半夜。这篇文章就围绕这类坐标转换软件说说工具怎么选、原理是什么、实际项目里怎么用以及我在勘测定界、土地报备、多格式交付这些场景里踩过哪些坑。1. 土地报备里的shp与txt到底是个什么关系1.1 报备系统要的两类“坐标产物”我做过的报备项目合格的数据包往往包含两类东西一类是图形文件通常就是shp面图层用来表示项目红线、地类图斑、勘测定界范围另一类是坐标表格很多环节直接要求txt格式的界址点坐标表有的地方虽然放宽到Excel和csv但表头、字段顺序一样卡得很死。shp和txt描述的是同一块地却是两种完全不同的数据结构。shp是空间数据格式除了图形本身还带着属性表txt只是纯文本一行一行就是坐标点。新手最容易犯的错就是把txt直接改后缀名变成shp以为格式转换是换个名字就行。实际上shp不是单文件而是一组文件的集合图形信息在.shp里属性在.dbf里空间索引在.shx里坐标系统在.prj里。txt改后缀改不出这套结构。报备系统的逻辑其实很好理解系统要shp是为了在底图上直接看到地块位置、边界、面积系统要txt是为了生成可供核对、存档、打印的界址点坐标表。图片负责“看得见”文本负责“算得清”两者缺一不可。而所谓“互转工具”本质就是在两种形态之间按规则搬运坐标。1.2 同一条地块边界的N种活法实际项目里格式乱象比你想的还多。外业用RTK或全站仪采集导出来的通常是txt或dat地形图很多时候拿回来的是dwg如果要把地块放到天地图或者手机地图上核对又需要kml而正式报备又要shp。所以热词里才会有“dwg转shp”“ArcGIS里shp转kml”“天地图坐标拾取”这些搜索需求。表面上看是在转各种格式回头看其实都是同一份坐标集合在不同软件之间换壳。今天我在这块地边界上采了100个点第二天需要报备就得从txt转成shp过两天领导要看现场位置又得从shp转成kml最终提交界址点表再从shp导出txt。有了批量互转工具一次整理多端交付这一套流程能压得很短。2. 坐标转换工具的核心原理与选型思路2.1 格式只是外壳坐标系统才是内核要理解坐标转换我一般用档案袋来打比方。shp像是一个带透明封面的档案袋里面除了实体的几何信息还要挂一张属性表txt像是写在便签纸上的一串地址。转换工具的工作不是把便签复印件塞进档案袋而是先读懂“地址”再按照档案袋的规则重新填写。这里面最容易被忽略的是坐标系统。坐标系统就是数据的“度量衡”。同样一个点在WGS84经纬度坐标下是“113.26, 39.84”这种小数值在CGCS2000高斯投影坐标下可能是“504231.12, 3345678.90”这种七位数。如果转换工具不关心坐标系只是把数字原样搬到shp里很可能出现图形飞到了地图外面这类问题。这也是衡量一个转换工具是否专业的关键能不能设置源坐标系和目标坐标系支持不支持常用的国家坐标系统。2.2 三类坐标转换方案怎么挑市面上做坐标转换和格式转换的方案大致分三类。先上一张对比表方便按你自己的场景挑方案类型代表方式批量能力坐标系统设置上手难度适合场景大型GIS平台ArcGIS、QGIS需建模型或用工具箱多次执行完整但步骤前置中等偏上单项目精处理、成果校核独立批处理工具shp与txt互转类小软件强界面化一键批量视工具而定好的工具很完整低土地报备批量生产、日常内业命令行/GDALogr2ogr等强适合脚本化跑批通过参数指定中重复性极高的固定流程自写脚本PythonGeoPandas/PyShp灵活复用性好完全可控偏高个性化需求、二次开发我自己现在的习惯是“两手抓”日常报备赶时间用界面化的批量工具把txt按地块分组转shp、再把shp导出报备格式txt两三步点完遇到特殊字段、特殊表头就改用Python脚本自己控制每一步。两条腿走路才能应对各种奇怪需求。2.3 坐标系这个参数千万不能跳过很多转换工具界面一打开第一个让你选的往往就是坐标系。别嫌麻烦跳过去。报备地块坐标常见的坑有几种一外业仪器默认输出WGS84经纬度报备系统却要CGCS2000高斯投影坐标二txt里把X、Y顺序写反转出来图形横竖颠倒三度数转成坐标时没分清“度分秒”和“十进制度”。我的经验是无论用什么工具拿到txt先看前几组数据。如果坐标值在73到135之间、3到54之间多半是经纬度如果出现500123.45、3345678.90这种数字就是高斯投影平面坐标。只有先判断对数据“原本是什么坐标系”才能在转换工具里设置正确的源坐标系。源设置错了后面做得再快都是白费。3. 实操流程一txt坐标点批量转成shp面3.1 先把txt模板立规矩批量转换好不好使很大程度取决于txt模板规不规范。我做项目时会提前准备一个标准模板让外业同事按这个格式导出地块编号,点号,X,Y,属性 A01,1,501234.120,3345678.900,建设用地 A01,2,501345.670,3345790.120,建设用地 A01,3,501456.230,3345890.450,建设用地 A02,1,502111.000,3445678.000,耕地 A02,2,502222.330,3445789.000,耕地几点注意表头字段名不要用空格、中文括号、点号等特殊字符分隔符要么统一英文逗号要么统一Tab别混着用文件编码优先UTF-8老式外业设备导出GBK也常见工具里要有对应选项X、Y字段对应的数值单位要标明是米还是度分秒。如果txt是从CAD或测量软件里导出来的可能没有地块编号这一列。这种情况就要在转换工具里按块段条件分组或者先在外面用Excel补一列把属于同一个闭合地块的点编上同样的编号。分组搞不清楚转换出来的shp就会变成一个乱点集而不是一个面。3.2 界面化批量工具的标准操作步骤假设你手头有一个界面化的shp与txt互转工具操作流程大概是这样的第一步导入txt文件。大多数工具会弹出字段映射界面你把表头里面的“地块编号”“点号”“X”“Y”分别拖到对应位置即可不认识的字段可以先忽略。第二步设置转换参数。这一步最关键源坐标系选“CGCS2000 高斯投影”目标坐标系跟着报备要求走文件分隔符选“英文逗号”勾选“按地块编号分组生成面要素”和“自动闭合环”。自动闭合的意思是当最后一个点连回第一个点时自动成环否则工具生成线或者点不生成面。第三步数据预览。别急着下一步先看看图形是否正常。正常地块的形状应该和实地边界大致吻合如果图形扭曲、翻转、跑位立刻回去检查X、Y映射顺序和坐标系。第四步执行导出。选择shp输出路径和文件名。好的工具还会同时生成一个坐标表txt或Excel正好用来做报备附件。我特别提醒一句shp输出后不要只拷一个.shp文件走人。shp是成组的.shp、.dbf、.shx、.prj都要一起拷贝缺了.prj下一个接手的人不知道坐标系很容易出事故。3.3 不想装图形界面给你一套能改的Python脚本如果你熟悉命令行或者想把这套流程做成自动化可以试试基于pyshp写脚本。先装依赖pip install pyshp下面这段脚本会把txt按“地块编号”分组每组点自动闭合生成一个面图层。编码用了UTF-8如果txt是GBK你自己改成encodinggbk。import shapefile import csv from collections import OrderedDict def read_txt(txt_path): groups OrderedDict() with open(txt_path, encodingutf-8-sig) as f: reader csv.DictReader(f) for row in reader: key row[地块编号] groups.setdefault(key, []).append( (float(row[X]), float(row[Y])) ) return groups def txt_to_polygon(txt_path, shp_path): groups read_txt(txt_path) w shapefile.Writer(shp_path, shapeTypeshapefile.POLYGON) w.field(block_id, C, 30) for key, points in groups.items(): ring points [points[0]] # 自动闭合 w.poly([ring]) w.record(key) w.close() if __name__ __main__: txt_to_polygon(input.txt, output.shp)如果你想输出的是点shp而不是面shp只要把shapeType换成shapefile.POINT循环里逐点写入就行。脚本虽小却是最容易带来质变的以后外业发来新txt直接跑一遍秒出shp不用每次都打开软件点半天。注意pyshp对中文字段名支持比较复杂所以我上面字段名用了block_id。实际项目如果需要中文属性建议用GeoPandas或者GDAL它们对UTF-8字段处理友好得多。3.4 转完必须做的三个验证转换完成不等于工作完成我每次都会做三件事缺一不可。第一看面积。用QGIS或ArcGIS打开shp查看每个面的面积。如果某个地块面积是0或者小到离谱多半是自动闭合出了问题或者点组没有正确分组。第二看坐标范围。把图缩放到全图确认地块落在项目所在地的正常位置而不是飘到海上或者异国他乡。第三看属性表。确认dbf属性表里地块编号、面积等字段是完整的没有大面积空值或乱码。这三关过了数据才敢交出去。4. 实操流程二shp导出报备坐标txt与多格式交付4.1 从shp面图层提取界址点坐标表反方向的转换很多工具里叫“shp转txt”或“导出界址点坐标表”。流程上你先加载或选择一个shp图层然后设置导出模板。报备系统常见的txt格式是这样的地块编号,点号,X,Y A01,1,501234.120,3345678.900 A01,2,501345.670,3345790.120这里有个细节很多报备表要求按顺时针或逆时针连续编号起算点也有指定。普通工具如果不提供起始点和方向设置导出的点序基本按shp节点原始顺序可能会被审查人员打回来。我处理这类需求一般先用工具把起算点参数设置好如果工具不支持就直接用Python脚本生成坐标文本代码如下import shapefile def shp_to_txt(shp_path, txt_path): sf shapefile.Reader(shp_path) with open(txt_path, w, encodingutf-8) as f: f.write(地块编号,点号,X,Y\n) for i, shp in enumerate(sf.iterShapes(), start1): pts shp.points if len(pts) 1 and pts[0] pts[-1]: pts pts[:-1] # 去掉闭合重复点 for pno, (x, y) in enumerate(pts, start1): f.write(f{i},{pno},{x:.3f},{y:.3f}\n) if __name__ __main__: shp_to_txt(output.shp, coord_table.txt)这段代码会把每个面要素的节点全部导出来。遇到复杂多边形、带洞或岛的地块报告里通常只需要外边界你在脚本里要做一步筛选保留面积最大的外环就行。这个筛选逻辑很值得花时间写进自己的工具里很多报备项目就卡在这。4.2 “一键导出多种格式”到底是怎么实现的你可能经常看到软件宣传“支持多种格式一键导出”其实它们内部一般是一个标准化的数据管线和多个输出插件。大体思路是读取txt、shp、dwg等输入解析成统一的内存结构比如“点列表”“环列表”“属性表”然后再根据目标格式规则写出去。这样加一种新格式只需要新增一个输出器不用推翻重写。了解这个原理对你挑选工具很有帮助。判断一个工具是否好用先看它“导入格式多不多”再看它“导出格式全不全”。如果一个工具导出选项除了txt和shp还有kml、geojson、csv那就意味着你在一次数据整理后可以同时满足报备、看图、共享三个需求。比如天地图或手机地图看地块只需要KML数据交换给geojson更合适给领导填表csv或Excel最直观。如果你用GDALshp转kml其实一条命令就搞定ogr2ogr -f KML output.kml input.shp -t_srs EPSG:4326 ogr2ogr -f GeoJSON output.geojson input.shp -t_srs EPSG:4326KML和GeoJSON底层都要求经纬度坐标所以导入前必须把投影坐标转成EPSG:4326。这也是我在前面反复强调坐标系统的原因任何一次格式转换坐标系对了后面才有可比性。4.3 prj文件丢了、编码乱了怎么救实际交付时最吓人的情况是打开shp后发现没有.prj文件或者说prj文件里的坐标系信息和实际坐标对不上。shp一旦失去坐标系描述软件就不知道该怎么处理。这时候要靠转换工具手动指定源坐标系把txt原始采集系统或历史坐标系统的信息补上。编码问题则发生在dbf属性和txt文本上。老单位给的统计数据或外业软件导出的txt很可能不是UTF-8而是GBK。你在转换工具里选错编码或者用文本编辑器直接改出来的中文就是一堆乱码。我建议凡是给报备系统的shp属性编码尽量按系统要求来自己内部用的txt统一存成UTF-8读取时如果乱码再换GBK试一次基本能定位问题。5. 常见问题与排查经验速查5.1 问题汇总表整理一下我这些年最常遇到的问题做成一个速查表现象可能原因处理方法转换后的图形飞到海外或地图外X、Y颠倒或把经纬度当投影坐标查看坐标值范围调整字段映射或坐标系面积和实测结果对不上用经纬度度数值当投影坐标计算面积转为高斯投影坐标系后再算面积生成面不闭合txt缺少闭合点工具未开启自动闭合开启自动闭合功能或脚本里加上首点点序乱成一团外业采集未按地块分组点顺序混乱按时间或点号排序设置起算点方向中文属性乱码编码不一致在UTF-8和GBK之间切换去掉BOM头属性字段丢失转换时没做字段映射导入时逐字段指定映射关系面积计算为0要素类型是点或线不是面检查是否按分组生成闭合多边形5.2 “多边形飞到天边”的经典场景这是新手翻车率最高的场景。外业发来一个txt里面数字是“113.2678, 39.8456”你却按照投影坐标来处理shp里被写到东坐标几十万的位置图形自然飞得没有影了。反过来也一样把投影坐标“504231.123, 3345678.900”当经纬度处理也会出错。我的排查方法很简单看数值大小和正负。中国境内经纬度坐标经度在73到135之间纬度在3到54之间投影坐标则通常是六七位数的东、北坐标。拿到txt我先用Excel或文本编辑器筛选最大值最小值心里有个数再进转换工具设置。如果X、Y映射反了图形会左右或上下翻倒和实地对不上这个也要在预览图里仔细看。5.3 界址点点序乱怎么才能按顺序输出shp面图层的节点顺序有时候能直接从txt转shp时保留下来有时候则是乱的。报备系统对界址点表的要求通常是按顺序连续编号如果点序乱审查会说明细和图形对不上。我在工具里优先看有没有“起算点设置”和“排序方向设置”。没有的话脚本处理时可以先计算多边形的重心再把顶点按重心极角排序。这种算法简单实用但要小心凹多边形情况复杂地块建议还是人工指定起算点别完全交给自动逻辑。5.4 CGCS2000和WGS84为什么对不上怎么处理“wgs1984和cgcs2000坐标对不上”是我在项目里被问得最多的词之一。两种坐标系其实非常接近但并不是完全重合有的地方偏差有几米甚至几十米直接影响报备面积和界址位置。处理方式分两层。第一层如果项目精度要求不高可以粗略平移使用当地已知点在两个坐标系下的差值做一个固定偏移第二层正式土地报备通常要求严格需要通过控制点计算七参数或三参数转换。好的转换工具会给出一套参数设置面板允许输入平移参数、旋转参数、尺度参数千万不要只会勾一个“WGS84转CGCS2000”的按钮就觉得万事大吉。保留好参数和被转换的原始txt一旦审查提出坐标疑问你还能追溯到底用了哪个方案。6. 我实际项目里一直用的作业组合说了这么多理论最后分享一套我自己的固定组合界面化批量工具做日常生产GDAL命令做格式互转Python脚本做特殊表头和坐标参数处理。日常从外业收txt我先复制到固定目录统一格式然后用界面工具按地块编号批量转shp预览确认面积无误后再在同一个工具里导出报备坐标系txt、kml和csv。遇到客户要求DWG成果的时候我不会直接从shp硬转dwg而是先导出DXF再到CAD工具里另存或整理成dwg。这样兼容性最好也好排查图形变形。遇到报备系统的表头变了我一般改Python脚本的输出模板几分钟就能适配不用把整个流程推倒重来。转换工具的终极价值不是省掉“点几下按钮”的功夫而是让整个数据流变得可以重复、可以追溯。项目做多了以后我把txt模板、shp模板、坐标参数、报备表头都固化成了固定文件新同事来了培训半小时就能上手。如果为了某一次报备临时抓个工具硬转转完拿了成果就走下一次又要重新折腾。其实只要把边界坐标这层逻辑吃透shp也好、txt也好、kml也好都只是同一个地块的不同外衣罢了。
返回列表