做了这些年GIS数据处理,最让我头疼的需求之一,就是中国铁路网矢量shp数据。几乎每隔一阵子就有同事、客户或群里的人问:有没有现成的铁路网shp能直接下载?有没有免费又靠谱的?说实话,市面上很多所谓"免费资源",要么是几年前的过期数据,要么是东拼西凑、坐标错乱、字段混乱的残次品。拿这种东西做项目,轻则返工重画,重则影响分析结论。这篇文章我把中国铁路网矢量数据从获取、处理到真实项目应用的全过程讲透,全文基于我自己实际做过的项目经验,没有付费购买任何所谓"内部数据",渠道都是公开合法能复现的。
1. 为什么中国铁路网矢量数据这么抢手:先搞清楚一份shp里装的是什么
1.1 一份铁路网shp到底包含哪些信息
很多朋友第一次接触shp,以为跟Excel一样,双击打开就是一个表格。实际上shp全称叫Shapefile,是一种矢量数据格式,它天生不是一个单独的文件,而是由多个配套文件组成的。最核心的是三个文件:.shp存几何形状,.shx存索引,.dbf存属性表。只要少了其中一个,数据就废了。另外还可能附带.prj(坐标系文件)、.cpg(编码文件)等,这些是锦上添花,没有的话数据也能用,但坐标系容易错。
在中国铁路网这份shp数据里,一条铁路线在几何上通常是一个Polyline(线要素)或由多个线段组成的MultiPolyline。属性表里的常见字段包括:线路名称(比如京广高铁、陇海铁路)、线路类型(高速铁路、普速铁路、城际铁路、货运专线)、运营状态(运营中、在建、规划中)、所属路局、复线或单线等。你可以把shp想象成一个三维的Excel:每一行是一条铁路,每一列是一个属性,而几何信息则记录了这条铁路在地球上的真实走向。
我从实际项目里拿这份数据来做什么?常见的是做国土空间规划里的交通图层叠加、物流园选址评估、铁路沿线噪声或生态影响缓冲区分析。还有一种特别典型的用法是配合人口栅格数据,计算"铁路沿线1公里范围内覆盖了多少常住人口",这种分析如果没有一份坐标准确的矢量铁路线,根本做不起来。
1.2 千万别忽略坐标系:这里藏着最大的坑
坐标系是shp数据的第一道关卡,我见过太多人在这一步翻车。中国境内做数据,最常见的是三种坐标系:WGS84是GPS设备和OSM数据的默认坐标,CGCS2000是国家大地坐标系(国内测绘成果标准),GCJ02是常见互联网地图的加密坐标。
一份铁路网shp拿在手里,第一件事就是看它的.prj文件里写的是什么。如果是WGS84,经纬度单位可以直接拿去和OSM底图套;如果是CGCS2000,通常还要配套一个投影坐标系,比如高斯-克吕格投影,单位是米,这时就不能直接叠加到经纬度底图上。之前有同行拿了一份"精修版铁路网全国shp",坐标单位是米,硬是塞进WGS84的工程里,结果所有线路全部挤在地图左下角一个点附近,查了半天才发现是投影没定义清楚。
另外要提醒的是:如果数据本身是GCJ02加密坐标,但你的工程底图是WGS84,叠加后会偏移几十到几百米。铁路线这种长条形要素偏移了,后续缓冲区分析基本全废。所以拿到数据第一步,用在线地图对照几条熟悉的高铁线路走向,偏差超过百米,就要立刻怀疑坐标系不统一。
2. 免费且靠谱的数据获取途径:别再到处求人发"内部包"
2.1 先用OpenStreetMap和Geofabrik:全球最稳定的免费源
真正免费又持续更新的铁路网矢量数据,首选OpenStreetMap(OSM)。虽然这是众包编辑的地图数据,但中国铁路网这部分经过多年修正,主线、高铁、普速基本都全,尤其是国家干线,完整性相当高。
实际下载操作很简单:访问Geofabrik的下载站,在Asia分类下找到China条目,下载china-latest-free.shp.zip。解压后会看到几十个shp文件,其中铁路相关的通常是gis_osm_railways_free_1.shp(旧版命名)或新版输出里的gis_osm_transport_a_free_1.shp。直接拖进QGIS就能用。
这个渠道的优势是更新快、免费、无需注册。缺点是属性表里的字段是英文的,比如fclass字段会区分railway、subway、light_rail等类型,需要自己稍微翻译处理一下。需要注意的是,OSM里中国高铁线会标为railway,但支线、专用线可能不完整,做全国尺度分析够用,做县级精细项目需要补充校验。
2.2 国家基础地理信息中心:权威底图数据
如果项目对数据权威性要求高,比如要报审、要走正式流程,那还是得用国家基础地理信息中心发布的基础地理数据。他们提供1:100万公众版基础地理信息数据,里面包含铁路要素层,坐标系是CGCS2000或WGS84,权威性拉满。
不过天下没有零成本的饭,这个渠道需要注册账号,部分数据要在线申请审核,不是扫码就下。好处是拿到手的数据非常规范:字段结构完整、拓扑关系清楚、没有OSM那种"同一股道被画成两半"的情况。对我个人而言,凡是涉及政府规划、环评、可研的项目,我宁可多花两天走申请流程,也要用这套正规数据打底。纯个人学习或技术验证,用OSM就够了。
2.3 其他可能用到的来源:科研机构与开放数据平台
除了上面两个主力渠道,国内不少高校和科研机构也公开过一些历史版本的铁路网矢量数据。比如部分数据科学竞赛平台会放出带线路等级、通车时间等关键信息的铁路线shp,这种数据用于研究和练手非常有价值。但使用前一定要看数据说明里有没有时间戳,有些公开资源停更在2016年甚至更早,京张高铁、成贵高铁这种近年开通的线路完全没有,做现状分析会出大问题。
更实用的组合思路:拿甘普基础地理信息里的铁路层做骨架,再用OSM最新数据补充近年新开通线路,最后用铁总公开的线路开通新闻做属性校验。这个流程虽然费点事,但产出的铁路网矢量数据,质量和时效性都远超那些打包卖钱的二手数据。
2.4 数据使用边界:版权与引用规范一定要清楚
这里要特别提醒一句:即便数据是"免费下载"的,不等于可以随意转卖。OSM的数据遵循ODbL开放数据库许可协议,要求使用者在分发时保留署名并相同方式共享;国家基础地理信息中心的数据也有明确使用协议,部分用途需要审查。
我见过有人把OSM下载的铁路数据简单改个字段名就当"自产数据"卖,这种在法律上有风险,在行业里也很败口碑。正确做法是:项目内部做分析可以随便用,但公开发布成果时要在图件说明里注明数据来源,比如"铁路线基于OpenStreetMap贡献者数据"或"要素来源:国家基础地理信息中心公众版数据"。这一行字不丢人,反而能让成果经得起追问。
3. 数据到手后的第一道工序:在GIS软件中正确打开与预处理
3.1 QGIS快速上手:从拖拽shp到看懂要素
我个人的习惯是用QGIS,免费开源、跨平台、插件生态强,不需要操心盗版授权问题。拿到解压后的shp,最快的方式是直接从文件管理器里把.shp文件拖进QGIS窗口。如果没有反应,就点菜单栏的"图层 > 添加图层 > 添加矢量图层",选择文件即可。
打开之后,建议立刻做三件事:第一,右键图层打开属性表,扫一眼字段和要素数量;第二,打开图层面板的属性,查看坐标系;第三,把底图换成在线卫星图或OSM标准底图,目视检查铁路走向是否贴合真实地形。我遇到过一个数据包,属性表里写着"全国铁路网",打开一看只有两千多个要素,而正常全国铁路线要素少说有几万个,这就是切片导出时的疏漏,不检查直接用,后面统计一定对不上。
3.2 ArcGIS与ArcGIS Pro的操作要点
如果单位用的是ArcGIS,流程也差不多。ArcMap里可以点击工具栏的加号加载shp;ArcGIS Pro里直接通过"添加数据"按钮或把shp拖进目录视图。ArcGIS有个老毛病:对UTF-8编码的dbf支持不好,中文属性很容易乱码,而OSM下载的shp属性表多为UTF-8,这时ArcMap打开属性表可能看到乱码。
解决办法是优先用ArcGIS Pro,它对编码兼容性好很多。如果只能ArcMap,可以先用QGIS对dbf做一次编码转换,另存一份GBK或系统默认编码的shp,再拿到ArcMap里用。这一招在我实际工作中屡试不爽,省了很多乱码带来的烦躁。
3.3 投影设置:决定后续分析成败的十分钟
打开数据后,务必在图层属性里确认坐标参考系。OSM铁路数据的原生坐标系是EPSG:4326(WGS84),可以直接用,但如果你要计算线路长度,经纬度坐标是算不准确的,必须转到投影坐标系下才能算。国内常用的投影方案是CGCS2000 / Gauss-Kruger zone,或者UTM 50N(不同经度范围选不同分带)。全国尺度的分析,直接投影成Albers等积投影,面积和长度误差相对均衡。
这里有个极易踩的坑:很多人以为在ArcGIS或QGIS里右键"设置CRS"就等于做了投影,其实那只是重新标注坐标系,并没有改变数据本身。正确的做法是用"矢量通用工具 > 重投影图层"(QGIS)或"Project > Define Projection后继续Project"(ArcGIS)这样带坐标转换的计算工具,才能真正把数据从经纬度变成米制投影。不做这一步,后续测量长度结果差十万八千里。
4. 实际项目中最常用的六个处理环节:从裁剪到拓扑检查
4.1 按省界或研究区裁剪:千万别用目测裁剪
铁路网是全国数据,做项目通常只需要某个区域。很多新手直接用"选择要素"工具画个框就删,这种粗暴剪裁对分析无所谓,但做成果图时很容易把跨省铁路上半截断在半路,看起来非常业余。
规范操作是准备一份精确的省界线或研究区边界shp,然后用QGIS的"裁剪"工具:矢量菜单 > 地理处理工具 > 裁剪。输入图层是铁路网,叠加图层是边界,点击运行即可。等叠加图层会沿边界把铁路线截断,保留边界内部的要素。注意:裁剪后的线要素属性表仍保留原始字段,区域外的要素被裁掉,但横穿研究区的线路会被切成两段,如果后续做网络分析,要先用"按位置合并"或者"修复几何"处理。
实际项目中我往往会做两层:先全国范围不裁,另存一份;再用研究区边界裁剪一份。因为很多分析会涉及研究区外围铁路对内部的辐射影响,甲方经常会问"我们这块地方,周边铁路网络是否支撑物流配送",这时外围的铁路数据就派上用场了。
4.2 属性表清洗:筛出你需要的高铁或普速线
OSM铁路数据里fclass字段可能包含railway、subway、tram等,直接用全要素做专题图会显得混乱。真实项目中我通常会在属性表里新建一个"线路类型"文本字段,用字段计算器把中文类型赋进去,然后按类型分类符号化。
例如表达式可以写成:
CASE WHEN fclass = 'railway' AND name LIKE '%高铁%' THEN '高速铁路' WHEN fclass = 'railway' THEN '普速铁路' WHEN fclass = 'subway' THEN '地铁' ELSE '其他' END这样生成的图例清晰,汇报时领导也能一眼看明白。操作里有个小经验:筛选线路名称时,先注意数据里中文名是否带"线"字,比如"京广高速铁路"和"京广线"是两条不同的要素,前者代表高铁走廊,后者代表老京广普速线,别把它们合并到同一个分类里。
4.3 shp转KML/KMZ:手机上也能离线看图
项目现场踏勘时,把铁路网数据导到手机离线地图里是最实用的一招。QGIS里右键图层,选择导出 > 保存要素为,格式选Keyhole Markup Language [KML],确定即可。导出前务必确认坐标系是WGS84,否则KML打开后位置会偏移。
ArcGIS用户可以用"图层转KML"工具,它会在图例里自动生成图标样式。导出后把KML文件放到手机的地图应用里,配合离线卫星图看现场非常舒服。我出去跑外业时,手机里就常驻一份重点区域的铁路网KML,开着定位地图往现场一站,铁轨走向和我们的分析图层对应得上,方便得很。
4.4 DWG转shp:从CAD图纸里抢救铁路线
不少单位提供的铁路线源数据是CAD的DWG文件,尤其是铁路设计院出来的图纸。DWG转shp我踩过不少坑。首先要明确一点:CAD里一条铁路线可能是一个复杂多段线(PLINE),也可能分解成了多条独立线段,直接转shp后拓扑关系会很乱。
我的建议:先在CAD里把所有铁路线要素归到同一个图层,用"炸开"命令把多段线打散成单线,然后清理重复线,另存为DXF格式(DXF兼容性比DWG好)。QGIS里通过"工程 > 导入图层 > 从DXF导入",导入后选中需要的线层,右键另存为shp即可。导入前注意设置正确的坐标系,CAD图纸通常没有投影信息,要根据图纸上的坐标来判断是CGCS2000还是地方坐标系。这一步马虎不得,图纸坐标判断错了,转出来的shp基本没法用。
4.5 Excel点转shp:把车站点表变成空间数据
除了铁路线,车站坐标也是高频需求。手上的Excel表格如果包含经度、纬度两列(例如"站点名称、经度、纬度、所属线路"),QGIS里点击"图层 > 添加图层 > 添加分隔文本图层",文件格式选CSV,指定X字段为经度、Y字段为纬度,几何类型选点,坐标系先选EPSG:4326。导入后右键导出为shp,再用"按位置连接属性"把站点点和铁路线关联起来,可以快速算出每个站点落在哪条铁路上。
ArcGIS用户则用"添加XY数据",但注意ArcMap中X对应经度、Y对应纬度,千万别填反。我见过有同事把经度和纬度写反,所有点全落到海里,这种错误靠目测就能立刻发现,但总有人忽略。
4.6 拓扑检查与修复:给数据"体检"
铁路网数据最影响后续分析的问题是拓扑错误,比如断线、悬挂点、重复线段。如果一份数据有大量断头,做路径分析时线路根本连不起来,做缓冲区时边界也会出现奇怪的毛刺。
QGIS里可以安装Topology Checker插件,规则选"不能有悬挂点"(dangles),运行后红色标记会标出所有断头位置。逐条排查修复很耗时间,但值得做。常见的修复方法:用编辑工具里的"节点工具"把断头的端点拖拽到相邻线上,或者用"捕捉"功能自动吸附。ArcGIS用户则要借助Geodatabase的拓扑规则,把shp导入要素数据集后创建拓扑,再按规则修复。
以我的经验,OSM下载的全国铁路数据拓扑质量还算可以,但经过周边路网数据合并后拓扑问题就多了。每次做完整合底图,我至少会花一个小时跑拓扑检查,才能放心拿去做分析。
5. 实操中的典型问题与排查技巧:把踩过的坑全摆出来
5.1 坐标系错乱的经典症状
最典型的现象是:数据加载后跑到非洲或海里去了,或者全部挤在地图左下角。这通常意味着坐标系定义与真实坐标单位不匹配。排查思路是:先看属性表里是否有坐标数值字段,比如X、Y列,如果是6位或7位数字,大概率是米制投影;如果是两位小数,大概率是度。
另一种症状是铁路线和底图对不上,偏差几十米到几百米,这是GCJ02与WGS84偏差造成的。处理办法是先确认数据原始坐标系,用QGIS的"矢量通用 > 重投影图层"转成WGS84,如果偏差依旧存在,再考虑做加密坐标纠偏。不过纠偏工作很容易引入更大的误差,我的建议是能不用就不做,直接用原始坐标系匹配底图数据。
5.2 线段断裂和拓扑连接问题
当你看属性表里一条京沪高铁实际被拆成七八段要素时,不要急着合并,先想清楚这些段之间是否真的断开。如果是相邻的小间隔,可以用"修复几何工具"里的"合并线段"功能;如果间隔较大,可能是原始数据采集时断开的。需要先把两端用捕捉工具和编辑工具手动接上,再合并要素。
合并多段线还有一个常见需求:把同一属性的多条线段合并成一条MultiLineString。QGIS里用"矢量 > 数据处理工具 > 合并要素",按字段属性分组,比如按线路名称分组,就能把碎片化的线归并为一条完整线路。
5.3 属性乱码:思路清楚了十分钟解决
中文属性乱码在ArcMap里最常见,原因基本是dbf文件使用UTF-8编码而ArcMap默认识别为GBK。在QGIS里打开shp时,会弹出一个编码选择框,下拉选UTF-8就能正常显示。如果QGIS没有自动识别,也可以在图层属性 > 数据源 > 编码方式那里手动指定。ArcGIS Pro的兼容性比ArcMap好,但仍可能遇到乱码,这时可以先用QGIS把shp另存为GBK编码,再用ArcGIS打开。
如果dbf里的字段名也乱,比如出现ÐÕÃû之类的,就要用Notepad++打开dbf文件的二进制区域排查,或者直接用QGIS重命名字段后另存。
5.4 shp加载失败的常见原因速查
shp加载失败的坑大多是基本功问题,值得放在排查列表里:只拷贝了.shp文件,没带.shx和.dbf,软件报"文件损坏";文件路径中包含中文或空格,某些老版本软件解析失败;解压时压缩包损坏或文件截断;shp超过2GB限制,老工具打不开。解决方法很简单:确认三个核心文件都在同一目录,路径尽量用英文,超过2GB就转成GeoPackage格式再继续处理。
下面这张表是我常用的排查清单,分享出来能帮人省时间。
| 症状 | 可能原因 | 快速排查方法 |
|---|---|---|
| 数据加载到地图外 | 坐标系定义或投影错误 | 查看.prj,重投影后再加载 |
| 属性表中文乱码 | 编码不匹配 | QGIS中切换编码为UTF-8或GBK |
| 铁路线显示不连续 | 拓扑断裂或捕捉不成功 | 打开Topology Checker检查悬挂点 |
| 数据只有点没有线 | 误选了节点数据 | 查看属性表fclass字段确认几何类型 |
| 合并后要素数量不对 | 属性分组字段选错 | 按线路名称字段重新分组合并 |
6. 进阶技巧:让铁路网数据发挥更大的分析价值
6.1 缓冲区与矢量场:一张图看懂铁路的辐射能力
铁路数据最实用的进阶玩法,是用缓冲区分析表达铁路的辐射范围。QGIS里用"矢量 > 地理处理工具 > 缓冲区",设置半径比如1000米(根据项目尺度调整),生成的Polygon就是铁路沿线辐射带。把这些面叠加到土地利用或人口格网上,可以统计出哪个市、哪个区被铁路辐射覆盖的面积最大。
我做过一个物流园选址项目,就是用铁路网缓冲区和产业园区数据做叠加,半天就筛选出三个潜力地块。注意缓冲区半径的选择要讲道理:城市拥堵路段取500米,城际出行节点取2公里,没有绝对标准,要跟项目需求结合。
有人提到"矢量场"这个热词,放在GIS语境里通常指用矢量字段表达方向与强度。铁路网数据里,可以让线要素的线宽映射到线路等级或日开行对数,这样出图时高速铁路一眼就能被识别出来,比单纯用一种颜色的线强得多。
6.2 用表达式快速实现标注与筛选
QGIS的表达式是真正拉开效率差距的功能。比如我想在图上标注"线路名称+运营状态",写到表达式栏:
name || '(' || status || ')'这样画布上的每个标注都显示成"京广高速铁路(运营中)",不用提前拼接字段。配合"基于规则"的样式,还能按不同状态显示不同颜色:运营中实线、在建虚线、规划中细点线。这套表达式的玩法在ArcGIS里类似,Arcade或者Python都能实现,但QGIS的表达式对话框更直观,适合新手快速上手。
6.3 多源数据合并与网格切分:把零碎数据拼成一张网
如果坐标处理过程没问题,却下载了分省或分块的铁路数据,就需要合并。QGIS里用"矢量 > 数据处理工具 > 合并矢量图层",把多个shp统一到同一个坐标系后合并,再按线路名称字段做一次融合,得到一张干净的全国铁路网。
反过来,如果你要把一个大区域的铁路数据按规则网格切分,用"生成网格"工具创建渔网格,再执行"裁剪"操作,就能得到按网格分块的铁路图,方便按瓦片出图或分批导出。这个流程对应到"渔网分割"这个关键词,我每次做全国尺度的分幅出图都会用到。
6.4 把铁路网数据做成3D展示
如果项目汇报需要三维立体效果,QGIS中把铁路线shp的每个折点提取出来,叠加DEM高程数据,用"线要素转3D"功能,可以让铁路线沿地形起伏显示。配合生成的三维模型,导入到Blender或Cesium等工具中,表现力直接上一个档次。shp转3DTiles的流程也可以走通:先在QGIS里把线要素转成GeoJSON,再用cesiumlab等工具切片成3DTiles,Web端加载非常流畅。这种展示最大的意义在于,能让外行人一眼看懂铁路与地形的关系。
7. 写在最后:我的几条真实建议
最后再把实操中沉淀下来的体会分享给你。第一,别迷信"一键下载全国数据"这类懒人包,数据印在硬盘里的时间是固定的,大部分二手包停留在几年前,新开的线路全都没有。与其到处求人发资源,不如花半小时把OSM和国家平台这两条正规渠道跑通。第二,拿到数据后别急着出图,先花十分钟检查坐标系和拓扑,这两步能挡掉八成后期返工。第三,属性表和编码规范一定要在一开始就整理好,等图都做完了再改字段名,你会在标注和统计环节哭出来。
铁路网矢量shp这类数据,本质是给分析提供底座的。很多人花大把时间下载、转换,真正做分析的时间反而被压缩了。如果你按照我上面这套流程走一遍,前面多花半天,后面至少省两天。这份数据资源的核心价值,不在文件本身,而在你拿到之后能快速把它变成决策依据。希望这篇经验总结对你有用。