ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

2024全国地铁线路shp包:解压、清洗、转3DTiles全流程

2024全国地铁线路shp包:解压、清洗、转3DTiles全流程 简介2024年全国地铁线路矢量数据shp格式是一份可直接用于 GIS 项目的全国地铁线网空间数据集面向城市规划、交通管理、地理信息分析人员及学习 QGIS/ArcGIS 的读者可支撑城市交通规划、站点覆盖评估、人流模拟与应急疏散路线分析有效解决地铁线路空间数据获取难、结构不统一的问题。压缩包内共 9 个文件核心为 2024_metro.shp 矢量图层并配套存储几何索引的 shx、属性数据的 dbf、定义坐标系的 prj 以及空间索引 sbn/sbx 等文件总大小约 3.59MB格式完整便于直接打开与编辑。数据按线路组织为矢量图层无级缩放仍能保持清晰可在专业 GIS 软件中进行叠加分析、缓冲区分析和网络分析帮助完成选址、影响范围评估等实际任务。已有 682 人学习下载。借助 readme 可快速了解字段含义直接获取全国各城市线路走向、站点位置与线路长度等关键信息为专题制图、规划评估和运营研究提供准确基础数据。1. 一份2024年全国地铁线路shp包到底能用来做什么交通分析做到一半发现数据不对是每个GIS从业者都经历过的血泪。你在某个数据站下载了“2024年全国地铁线路矢量数据shp格式.zip”解压出来一堆.shp、.shx、.dbf、.prj文件导入ArcGIS或QGIS想象中全国线网图马上呈现——结果要么线网对不上底图要么属性表全是乱码要么线路断成一截一截。这篇笔记把这包数据的完整使用链路拆开讲shp文件家族到底是什么坐标系和属性表怎么查怎么用QGIS和命令行把数据变成能出图、能统计、能转KML和3DTiles的成果以及最常踩的五个坑。适合手里刚好有这个包、想做全国或城市级线网分析的GIS工程师、规划口研究人员也适合照着流程入门的新手。2. 拆开zip看数据底细shp不是一个文件是五个文件组队上班很多人在第一步就理解错了。shp不是某个单一文件而是ESRI Shapefile格式的一组文件的总称压缩包里解出来通常有好几个同名不同扩展名的文件缺一个都可能打不开。2.1 shp文件家族.shp/.shx/.dbf/.prj/.cpg各管哪一段一个完整的Shapefile至少包含三个文件扩展名作用缺失后果.shp几何数据本身点/线/面的坐标串一切无从谈起.shx几何索引帮助软件快速定位部分软件直接拒绝打开.dbf属性表dBASE格式线路名、城市、状态都在这里只剩几何没有任何字段.prj坐标系和投影描述软件默认按未知坐标系处理叠加必偏移.cpgdbf的字符编码声明中文属性表乱码概率大增.sbn/.sbx空间索引可选不影响读取只影响速度这也是为什么这类数据必须以zip形式分发的原因shp不能单文件传输各个配套文件在网盘和邮件系统里很容易被漏掉zip把整组文件打包还能做完整性校验。顺便说一句网上那些“dwg转shp在线转换”的工具转出来的shp往往只有几何没有像样的属性表因为CAD的图层和块定义本身就不带结构化的字段信息。所以我一般建议要做正经线网分析优先找已经整理好的shp发布包而不是自己拿CAD去转。2.2 读.prj判断坐标系地理坐标还是投影坐标打开zip里那个.prj文件用记事本就能看这是判断整包数据是否可用的第一道关卡。文本里出现GEOGCS[WGS 84]说明是WGS84地理坐标系单位是度这就是GPS原始数据最常见的坐标。出现GEOGCS[China Geodetic Coordinate System 2000]或CGCS2000这是国家大地坐标系国内公开数据最常用和WGS84在平面叠加时误差通常小于1米。出现PROJCS说明是投影坐标系单位是米。常见的有UTM分带、Albers等积投影、各城市独立坐标系。全国尺度的地铁线路shp最常见是WGS84或者CGCS2000的经纬度坐标。如果你手里的压缩包解出来压根没有.prj文件后面的叠加工作会非常痛苦第5章里我会专门说怎么补救。2.3 属性表字段命名混乱才是常态打开.dbf之前先做好心理准备。不同来源的地铁数据字段命名差异极大有的叫name、city有的叫line_name、LINE还有直接上拼音的xianlu、didian。我见过一个包字段名叫A、B、C没有任何说明文档只能靠抽样看值猜含义。所以拿到包之后第一件事不是急着出图而是把字段普查一遍有几个字段、分别是什么类型、抽样看几个值。这个动作我在第3章会给可复现的Python代码。属性表里值得重点关注的字段通常是线路名称、所属城市、线路状态运营/在建/规划、开通年份、长度字段。但注意很多第三方整理的数据包里根本没有长度字段长度要靠几何计算而且计算口径还分“轨道里程”和“运营里程”——这两个数在官方统计里差别很大。理解到这一层你就明白为什么同一份shp有人算出全国8000公里有人算出来7000公里争半天其实说的不是一回事。3. 从压缩包到可分析图层解压、编码、坐标系检查三条线数据落到硬盘上到真正能叠加分析中间至少有三道检查压缩包本身能不能完整解出来、shp加载后几何和字段对不对、坐标系能不能和底图叠加。这一章按顺序走一遍。3.1 解压前先做完整性校验zip伪加密怎么识别先别急着右键“全部解压缩”。命令行先测一遍压缩包unzip -t metro_2024.zip-t参数是test模式逐条校验每个文件的CRC校验值。输出如果所有条目都是OK再正常解压。zip本来就带CRC校验解压报错不是小事可能是文件头损坏也可能是伪加密。什么叫zip伪加密有些数据站为了防采集把zip的加密标志位改成“已加密”但数据本体根本没加密。表现是你用7-Zip或WinRAR解压弹窗要求输入密码输入空密码又解不开但用unzip -t测试CRC是好的文件列表也能正常显示。遇到这种情况判断思路是先确认数据是从正规渠道拿到的公开数据再考虑修标记。解决方式不是去用什么“zip密码移除”破解工具而是用一个只改标记位的小工具把文件头的通用位bit0清掉数据流本身没加密改完就能正常解压。修完后记得重新打包一次避免后续同事拿到又在同一处卡住。3.2 用QGIS做第一轮加载北京、上海的线是否在正确位置解压完成后打开QGIS菜单“图层 → 添加图层 → 添加矢量图层”选到那个.shp文件。编码那里如果属性表有中文先按UTF-8试乱码就换GBK。加载之后第一件事是看整体范围。新建一个临时图层加载在线底图比如OSM或者ArcGIS在线影像把shp叠上去快速判断几件事线网有没有跑到海里、国界外——如果存在大面积离谱位置坐标系或数据本身有问题北京、上海、广州这些大城市的线路是否落在城区范围内各城市线网是否连成片还是断成一截一截。这一步肉眼检查比任何自动化检查都快。我处理过一份“2024年全国地铁线路”数据加载后发现成都的线网整体偏移了约200米原因是该来源把部分城市独自使用的城市坐标系当成WGS84写进了prj。肉眼扫一遍底图就能发现硬等后续空间分析才暴露就晚了。3.3 用Python批量普查几何、字段和范围肉眼检查完再用脚本把整包数据的状态量化记录下来。用GDAL/OGR的Python绑定不需要安装完整ArcGISfrom osgeo import ogr path rD:\gisdata\metro_2024.shp ds ogr.Open(path) if ds is None: raise IOError(shp读取失败——检查同目录的.shx/.dbf/.prj是否齐全) lyr ds.GetLayer(0) # 几何类型与要素数量 geom_type lyr.GetGeomType() print(几何类型:, ogr.GeometryTypeToName(geom_type)) print(要素数量:, lyr.GetFeatureCount()) # 字段普查 defn lyr.GetLayerDefn() for i in range(defn.GetFieldCount()): fld defn.GetFieldDefn(i) print(f字段[{i}] {fld.GetName()} ({fld.GetTypeName()})) # 空间范围判断是经纬度还是投影坐标 ext lyr.GetExtent() print(空间范围: minX%.6f minY%.6f maxX%.6f maxY%.6f % ext)这段代码分三部分几何类型决定了后续转KML和转3DTiles的路线LineString和MultiLineString的处理方式不一样尤其MultiLineString是真正常见的地铁线路存储方式——一条实际运行线在shp里往往被拆成多段字段普查告诉你属性表里有什么可用信息空间范围则直接暴露坐标系类型——数值在70到135、18到54之间基本是经纬度数值在几十万级别一定是投影坐标米。ogr.Open返回None时优先怀疑三个配套文件不齐。有些软件在缺.shx时会自动重建但OGR这种行为不一定可靠最好把zip里所有文件解全再跑脚本。4. 把线路shp做成成果转KML、转3DTiles、转Excel统计数据检查通过之后就到了实际产出环节。不同场景需要不同格式这一章按“桌面出图、Web三维、表格统计”三条线给方案。4.1 字段清洗与坐标系统一ogr2ogr的常用参数无论后面转成什么先统一到WGS84经纬度并把字段名改成英文小写、去掉空格。这一步用ogr2ogr一条命令完成ogr2ogr -f ESRI Shapefile -t_srs EPSG:4326 \ -select name,city,status \ -lco ENCODINGUTF-8 \ metro_2024_clean.shp metro_2024.shp-t_srs EPSG:4326把一切坐标统一到WGS84经纬度这是后面所有转换能成功的前提-select只保留三个关键字段避免.dbf字段过多影响性能-lco ENCODINGUTF-8给输出的.dbf写UTF-8编码声明解决中文乱码。如果字段名里有空格或者特殊字符OGR会自动做转义但建议你源文件先手工把字段名调好再跑。4.2 用ogr2ogr把shp转KMLKML强制WGS84的坑Google Earth、GIS云平台、各类Web地图常用KML。KML规范要求坐标必须是WGS84经纬度所以哪怕shp已经是CGCS2000且和WGS84误差不大也不能直接转必须显式指定坐标系ogr2ogr -f KML -dsco NameFieldname \ metro_2024.kml metro_2024_clean.shp这里-dsco NameFieldname指定用属性字段name作为KML里每个地物的名称Google Earth里显示的就是线路名否则清一色全是要素编号没法看。还有一个容易被忽略的点如果原始shp是投影坐标而你没做4.1的统一这一步转出来的KML会整体飘到错误位置——因为KML驱动不会替你猜坐标系它把你给的数值直接当成经纬度输出。转完之后一定要在Google Earth或者QGIS里打开KML看一眼再交付。ArcGIS里做“shp转KML”工具和ogr2ogr走的逻辑一样都是强制套WGS84所以步骤里最关键的还是先统一坐标。4.3 用CesiumLab把shp转3DTiles给Cesium和超图场景用Cesium、超图这类三维地球平台不直接吃shp要转成3DTiles。常见做法用CesiumLab这类免费桌面工具步骤是导入4.1输出的metro_2024_clean.shp坐标系选WGS84即EPSG:4326选择输出为3DTiles数据格式选b3dm或i3dm。线路数据一般用i3dm实例化模型文件体积小渲染快高度模式选贴地或者按“距地面高度”给一个固定值——地铁线网如果直接压在地表在三维场景里会和建筑、地形穿插观感很差生成后在Cesium里加载tileset.json检查线是否贴合底图。踩过的一个参数坑3DTiles对线数据的宽度不敏感很多人在CesiumLab里把线宽放大到10生成后还是细成一条线。实际上线宽要在前端渲染时设置Cesium的Polyline宽度属性只对PolylineGeometry有效3DTiles里要改用lineWidth材质或者干脆用管线模型代替。如果只是为了做宏观线网展示建议不要过分追求线宽把颜色和透明度调好更有辨识度。4.4 属性表转CSV与Excel统计长度口径怎么算属性表统计这件事绕开dbf直接转CSV是最省事的ogr2ogr -f CSV metro_2024.csv metro_2024_clean.shp \ -lco GEOMETRYAS_XY但注意AS_XY只能输出每个要素的起点和终点坐标多段线中间节点全部丢失。如果只想统计“每城市有多少条线路、总里程大概多少”不需要完整坐标这个方式最快。把CSV用Excel打开数据透视表一拉就出结果。如果要做按城市的里程统计而且要求长度接近工程口径用GeoPandas更直接import geopandas as gpd gdf gpd.read_file(metro_2024_clean.shp, encodingutf-8) gdf gdf.to_crs(epsg3857) # 转到网络墨卡托单位为米 gdf[length_km] gdf.geometry.length / 1000 stat gdf.groupby(city)[length_km].sum().sort_values(ascendingFalse) print(stat.head(10))to_crs(3857)是常见做法但平面长度在墨卡托投影下会有变形中国中纬度地区误差尚可接受。要做更严谨的里程统计应该用Albers等积投影或者每个城市自己的UTM分带。另外务必区分shp几何算出来的是“线路几何长度”官方发布的“运营里程”包含站前折返线、车辆段出入线等附属线路两者天然存在差异差10%以内都算正常不要一算对不上就怀疑数据坏了。5. 全国地铁数据最常见的5个坑从zip伪加密到坐标系偏移这套数据我前前后后处理过好几个来源的版本真正称得上“翻车点”的其实就那几个集中写在这里每一条都是“现象 → 原因 → 解决”。5.1 zip伪加密解不开不输入密码而是改标记位现象解压时弹窗要求密码输入空密码或常见密码都失败但用7-Zip能正常看到压缩包内文件列表。原因发布方用zip伪加密保护数据文件头通用位标记置位数据本身没加密。解决先在7-Zip里点“测试压缩包”如果测试结果完好但要求密码大概率是伪加密。找“zip伪加密修复”类小工具把通用位标记bit0清掉改完重新打包时选“存储”模式避免二次压缩带来不必要的体积膨胀。5.2 打不开shp缺了.shx/.dbf先用shapechk诊断现象QGIS提示“无效数据源”ArcGIS提示“无法打开”但.shp文件明明在。原因下载时zip里文件不全或者解压工具跳过了扩展名小写的大写同名文件。解决先对照压缩包文件清单确查.shx和.dbf都在同目录、同主文件名。文件确实损坏时用ESRI官方命令行工具shapechk检测用法是进入shp所在目录执行shapechk metro_2024.shp它会输出哪些块缺失、哪些记录损坏。对轻微损坏多数情况重新导出一次能救回来但别指望它修复被截断的.dbf。5.3 属性表全是乱码dbf的GBK/UTF-8之争现象图形能显示线路名却是“????”或一堆乱字符。原因dbf的文本字段编码和软件预设不一致。国内数据多用GBK/GB2312QGIS新版默认UTF-8。解决QGIS里在数据源设置里把编码从UTF-8改成GBK试试ArcGIS里则要在“连接”时指定代码页。更彻底的解法是用第4章的命令加上-lco ENCODINGUTF-8重新输出一份这样任何软件打开都不乱码。同时检查有没有.cpg文件它记录了dbf编码有它的话QGIS会自动识别乱码概率大幅下降。5.4 叠加在线底图就偏移prj确实和坐标系对不上现象shp单独看正常叠加OSM或影像底图后整体往某个方向平移几十到几百米。原因压缩包里prj描述的是A坐标系实际几何可能是B坐标系——或者更糟根本没有prj软件按默认WGS84处理。解决先手工核查prj内容再对比几个标志性点。如果确定几何坐标值与WGS84近似但略偏可以直接-t_srs EPSG:4326强制转换如果偏差明显多半是CGCS2000与WGS84互转产生累计误差对地铁这种城市级数据影响不大。真正无解的是某城市自定义坐标系又没有转换参数那就只保留该城市单独处理。5.5 线路看着完整、数据算不对几何方向与自相交现象地图上线路连得整整齐齐一算总里程比官方少8%或者做缓冲分析时某些线路出现异常宽度。原因shp里的LineString不保证方向一致一条实际线路被拆成几十个要素首尾顺序也没有按运行方向统一另外部分要素存在自相交或重复节点长度计算会被重复段污染。解决先做一次几何修复QGIS里用“修复几何”工具GRASS的v.clean也可以然后按属性字段排序后每隔几条线抽查坐标串确认方向一致性。做里程统计时把长度小于500米的碎段单独列出看是否合理这些碎段往往是换乘线或折返线算不算进总里程直接决定统计口径。6. 十分钟验证一套数据能不能信用交叉口径和空间结构收官数据做完了不等于能交付。我现在的习惯是出任何成果之前先花十分钟做一轮交叉验证把不可信的数据挡在交付之前。6.1 用官方运营里程做交叉核对从各城市交通运输局年度报告或统计公报里找到“城市轨道交通运营里程”一类公开数字和自己算的结果对比。比例差控制在正负10%以内算合理差超过15%就要回头查是不是字段筛选把“在建”线路也算进去了或者几何断裂导致面积和长度大量缺失。这一步不需要代码Excel里做个差值百分比就行。6.2 用渔网分割做线网密度验证验证空间分布是否合理可以建一个渔网格分别统计每个网格内的线网长度看结果是否符合直觉——高密度区域应当集中在市中心郊区网格长度趋近于零。QGIS里“渔网分割”工具直接生成规则格网shp再和线路做空间连接按网格ID汇总长度。如果某个非城市区域的网格长度异常高多半是某条线路被错误分配了城市属性或者几何串到了别的城市边界里。这套“解压 → 普查 → 清洗 → 转换 → 交叉验证”的流程前后不到半天能把一个来源不明的shp包变成可信的成果。遇到来源不清楚的地铁数据我现在第一反应不是马上出图而是先跑一遍第3章的字段普查脚本——数据质量决定了后续所有分析的上限这一步省下的时间后面全都会在返工里补回来。希望帮到你。本文还有配套的精品资源点击获取
返回列表