ARTICLE DETAIL

资讯详情

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

台湾省乡道级道路矢量数据:从解压到网络分析的完整处理指南

台湾省乡道级道路矢量数据:从解压到网络分析的完整处理指南 简介面向GIS分析、地图制图与交通规划从业者这份数据包提供台湾省最新分级道路矢量精确到乡道层级。内容覆盖城市一级至四级道路以及高速、国道、省道、县道、乡道等行政等级路网并汇入OSM来源的铁路与各类道路线数据共16种矢量类型彼此间既有重复又形成互补便于进行交叉验证与路网考究。压缩包为RAR格式约43.63MB以矢量线文件为主适用于道路分级制图、路网对比、空间分析及地图出版等场景。已有463人学习下载可帮助使用者系统梳理台湾地区各级道路体系无论需要宏观道路骨架还是基层乡道路线都能从中提取相应图层是开展地理数据研究与可视化时具有参考价值的实用资料。1. 拿到一份“精确到乡道”的台湾省道路矢量包先别急着解压分析做省域路网分析的人第一痛点是底图精度。地图厂商的全国路网到了乡镇一级往往只剩一条主干道而一份“台湾省道路数据最新分级精确到乡道矢量数据.rar”这样的数据包正好补上这个断层它把道路按行政等级和功能等级拆到了乡道以矢量数据封装解压就能进 GIS。这篇笔记不考证这份数据出自哪里、作者是谁只讲拿到这种路网包之后怎么验货、导入、清洗并用它做网络分析。适合 GIS 工程师、规划分析师以及做物流路径、交管路网计算的人。没有这份包也没关系这套处理流程本身就是收省级路网数据的通用做法。2. 解压与盘点校验 rar 包的完整性、处理密码与认清单个图层2.1 用 rar 分发路网数据压缩率、分卷与密码是三个现实理由做路网分发的人选择 rar 而不是 zip通常不是图它界面好看而是三个实际需求。第一是压缩率。shapefile 的 .dbf 属性表里往往存大量中文字段乡村道路名称、路面材质、竣工年份这类文本重复度很高rar 的 solid 压缩模式能比 zip 再压掉不少体积。一个省级路网解压后几个 GB压缩包可能只有三分之一这对网盘分发和邮件附件都友好得多。第二是分卷。台湾全省的路网数据尤其是带拓扑关系的 GeoPackage 或 File Geodatabase单文件经常超过 2GB。rar 可以按指定大小切分卷早期的网络存储和光碟分发都依赖这个能力所以很多老工程包至今仍沿用 rar 分卷的发布习惯。解压时只要把第一个 .part1.rar 拖进解压工具它会自动找后续分卷单独拿中间某个分卷出来是解不开的。第三是密码。这类数据包通常带一个轻度保护的只读密码主要防止别人改包重传而不是真的防破解。网上有人搜 rar 密码移除、advanced rar password recovery 这类工具我的观点很直接先找发布方要密码别一上来就暴力破解。路网数据包的密码大多是发布方统一设置的短口令暴力破解确实能出来但几个 GB 的分卷包跑一轮要几小时而且很容易损坏 solid 压缩的校验结构属于典型的后悔药比病还贵。真联系不上发布方再考虑用工具处理但前提是做好原包备份。2.2 解压前先做完整性校验rar t 与 7z t 的参数差异拿到包直接双击解压是新手常见操作但我的习惯是解压之前先跑一遍完整性测试。rar 包的 solid 压缩特性决定了中段一个分卷损坏后面所有文件都可能解不出来而很多路网包在网盘里躺了几年中间字节坏没坏只有测过才知道。Windows 下装了 WinRAR 或 7-Zip 后命令行里可以直接调 rar 或 7z 做测试。Linux 服务器上我一般用 unar 或 p7zip命令如下# 测试 rar 包完整性的标准做法不释放任何文件 rar t 台湾省道路数据最新分级精确到乡道矢量数据.rar # 7-Zip 的测试命令路径带中文时引号不能省 7z t 台湾省道路数据最新分级精确到乡道矢量数据.rar # macOS/Linux 下若只装了 p7zip用 7z 同款命令若装了 unar 则更简单 lsar 台湾省道路数据最新分级精确到乡道矢量数据.rarrar t和7z t的区别在于rar 工具对自家格式的校验更严格会逐块检查 CRC7z 对 rar 的兼容性足够好但遇到分卷路径有中文或文件名乱码时更容易报错。lsar只列目录不校验适合先看包内结构真正解压用unar更稳它对中文编码的识别比 p7zip 好。提示解压后建议保留原 rar 包不要因为磁盘紧张就删掉。后续某个图层字段读不出来、坐标系对不上时你很可能需要回原包重新解压一份干净数据而不是在已经动过手脚的副本上找问题。2.3 解压后的数据盘点文件清单、扩展名与图层命名核对解压完成后先别急着拖进 GIS用文件管理器或命令行把目录结构过一遍。常见做法是这类工程包要么直接放一堆 .shp 伴生文件要么分好 road 和 rail 等子目录顶层通常带一个发布说明 txt 或元数据 xml。第一次拿到包我一般按下表逐项核对检查项预期内容异常信号顶层目录结构按道路等级或行政区分文件夹所有图层乱堆在根目录说明包被二次打包过.shp 伴生文件每个 shp 至少带 .shx、.dbf、.prj缺 .prj 是最致命的坐标系会变成未知字段编码文件中文路名需要 .cpg 或 release note 注明编码没有 .cpgdbf 里的中文大概率乱码图层命名含 class、level、grade 中任意一个词只有 line、road 这种笼统命名分级字段可能在属性里版本信息发布说明或属性表里有 update_date文件名写 2024属性表里日期字段全是 2018这里有个容易翻车的细节shapefile 的 .shp 只是几何文件真正的属性存在 .dbf 里空间索引在 .shx坐标系在 .prj。很多人只拷贝 .shp 发给同事结果对方打开只有图形没有属性这就是把 shapefile 当单文件用的典型黑匣子操作。如果解压出来是 File Geodatabase.gdb 文件夹或 GeoPackage.gpkg 单文件反而省心坐标系、字段名、属性类型都封在内部不需要陪生文件。但 .gdb 要注意版本兼容ArcGIS 10.x 创建的库QGIS 3.28 以上版本才能稳定读取老版本 QGIS 打开容易只显示空图层。3. 把道路矢量数据读进 GIS区分包内格式、确认坐标系、定位分级字段3.1 认出包里是 shapefile 还是 geodatabase扩展名之外还要看伴生文件解压后第一个动作是问这包数据到底是什么格式不要只看扩展名shapefile 是“多文件集合”真正判断依据是里面有没有 .dbf 和 .shx。我的检查命令很简单# 列出目录下所有文件按扩展名统计 ls -la | awk {print $NF} | sed s/.*\.// | sort | uniq -c # 如果看到 .gdb 目录用 ogrinfo 确认它是有效的地理数据库 ogrinfo --format FileGDBogrinfo --format的输出会告诉你当前 GDAL 版本是否编译了 FileGDB 驱动。很多 Linux 发行版默认 GDAL 不带 FileGDB 插件这时候 .gdb 目录明明在ogrinfo却读不出任何图层。解决方案是装gdal-filegdb扩展包或者让发布方转一份 GeoPackage。遇到扩展名是 .tabMapInfo、.dwgCAD、.mdbAccess也不要慌ogrinfo都能读但处理逻辑完全不同。CAD 数据要留意里程桩号在文字对象里不是属性字段MapInfo 的 .tab 配 .map 和 .dat漏一个文件就缺属性。3.2 坐标系是第一道门槛TWD97、TWD67 与 WGS84 的换算场景台湾省路网数据最常见的坐标陷阱是把 TWD67 当成 TWD97 用。两者都是台湾地区常用的投影基准但椭球参数不同平面上能差出几十米如果你的底图是 WGS84 的影像或 OSM 路网错位会更明显。判断坐标系最直接的方法是读 .prj 文件或用 ogrinfo 输出现有坐标系# 只看数据集概要不展开几何 ogrinfo -so -al 台湾省道路_乡道.shp输出里的EXTENT、Geometry和Coordinate System三段最有价值。Coordinate System 如果显示unknown或乱码说明 .prj 缺失或文本编码坏了。常见的正确结果是 TWD97 / TM2 zone 121EPSG:3826 这类 TM 分带投影或者 WGS 84EPSG:4326。如果显示成 TWD67那后续叠加影像时就需要做一次投影转换# 把 TWD67 转成 WGS84 地理坐标输出为新文件 ogr2ogr -t_srs EPSG:4326 台湾省道路_wgs84.shp 台湾省道路_原始.shp提示转换后务必抽查几条道路与在线影像上对应的交叉口做目视比对。投影转换不是数学题原始数据本身可能就有局部偏移转换只是消除系统性误差不解决数据采集时的漂移。3.3 用 ogrinfo 快速读取字段找到那条“道路分级”字段标题说“分级精确到乡道”那分级信息到底存在哪常见位置有三处字段名叫CLASS或ROAD_CLASS字段值是“高速”“国道”“省道”“县道”“乡道”或者字段叫F_LEVEL、KIND存的是数字等级码 1 到 6再或者几何本身按图层分好了名字里带 town、village。用 ogrinfo 看字段名和取值分布比在 GIS 里点开属性表快得多# 列出所有字段名和字段类型 ogrinfo -so -al 台湾省道路_乡道.shp | grep -A 20 Layer name # 看分级字段到底有哪些取值 ogrinfo -dialect sqlite -sql SELECT ROAD_CLASS, COUNT(*) FROM 台湾省道路_乡道 GROUP BY ROAD_CLASS 台湾省道路_乡道.shp注意第二条命令用到了 SQLite dialect这是 GDAL 内嵌的 SQL 引擎支持 GROUP BY处理几十万条线段的属性统计很顺手。如果没有分组统计你根本不知道这个字段里有几个类目、有没有拼写变体比如“乡道”和“乡镇道路”并存的情况。这一步没做后面按分级渲染图层一定会出乱子。4. 把乡道精度跑起来按分级字段切分图层与网络分析前处理4.1 用 ogr2ogr 按字段筛选输出高速、省道、县道、乡道分层落地很多人在 GIS 里用“按属性选择 导出”来拆图层数据量小没问题省级路网几十万条线就很拖沓。我习惯在命令行用 ogr2ogr 按字段值筛选输出速度和内存占用都比 GUI 可靠# 只输出乡道写入独立 shapefile ogr2ogr -where ROAD_CLASS 乡道 乡道.shp 台湾省道路_全量.shp # 同时输出县道和乡道SQL 语法里用 OR 连接 ogr2ogr -where ROAD_CLASS IN (县道, 乡道) 县道乡道.shp 台湾省道路_全量.shp-where后面的条件走的是 SQL WHERE字符串值必须带单引号字段名大小写要和属性表一致否则 GDAL 静默地筛不出任何数据——它不报错只是输出一个空图层。这个空结果可以直接用ogrinfo -so -al 输出的文件看Feature Count验证数量为 0 就回头查字段名。拆层之后不要删原文件拆出来的子集只是工作副本。后续做网络分析、制图综合、发布服务都应该从全量数据派生避免在子集上反复编辑把原始拓扑搞坏。4.2 分级渲染与制图表达让乡道在底图上“看得见”数据进图之后第一件事不是分析而是把分级渲染做出来用眼睛检查数据是不是真的合理。在 QGIS 里右键图层 → 属性 → 符号化 → 按分类选择 ROAD_CLASS 字段让软件自动生成类目。但自动生成的配色顺序通常是乱序我手动调整成一套由粗到细的表达分级线宽配色表达目的高速 / 快速3.2 mm橙色带深色描边骨架级道路最先被看见国道 / 省道2.0 mm黄色区域级干线引导视线县道1.2 mm白色乡镇间联系道路乡道0.7 mm浅灰最细一级缩放时逐渐显现这套方案的逻辑是缩放到省域时灰线自然隐到背景放大到乡镇时乡道浮现与县道形成层级关系。分级渲染不是画着好看它直接决定了人工检查数据的效率——乡道断没断、县道接没接一眼能看出来。4.3 网络分析前必做的拓扑处理打断相交线与消除悬挂点路网数据从测绘部门出来往往天然带拓扑但网上流传的 re-projected、re-signed 版本常把拓扑破坏掉。典型问题就是两条路十字交叉交点处没有公共节点路径计算不会自动“拐弯”。做网络分析之前我统一做一遍相交线打断# 调用 GRASS 的 v.clean 对线图层做 break 处理 v.clean input道路_全量 output道路_打断 toolbreak --overwritetoolbreak会在所有线段相交处强行打断不打散属性但会在打断点复制属性记录。打断后还要检查悬挂点dangle一条乡道画到一半没有接上任何道路在图层里肉眼看着像是一条完整的路但网络分析里它就是死胡同。QGIS 的拓扑检查器可以高亮悬挂点命令行里用 v.clean 的snap加rmdangle可以批量修一部分但真正复杂的断头路还是要人工补线。这里有个血泪经验打断操作做完原数据的“道路名称”字段会被复制到所有打断后的子线段后续做属性统计时一条长路被统计成好几段里程汇总直接翻倍。所以打断后的图层只用于网络分析不要用于里程统计里程统计要在打断前用原始连续线段做。5. 路网矢量数据避坑手册拿到“最新”分级数据后的五个翻车点5.1 翻车点一标题写着“最新”属性表里的数据却早了三五年现象文件名标注“最新”打开属性表按日期字段排序发现大部分路段的更新日期停留在五年前甚至字段里根本没有日期。原因很多网传包是“底图旧 局部新”的缝合产物。发布者把新开通的快速路加进了旧路网却忘了同步更新整库的元数据或者原数据方只在局部范围做过 revision其他区域沿用的是更老的采集成果。解决把数据包里的发布说明 txt 先读完再对update_date、MODIFY_DATE这类字段做 GROUP BY 统计看日期分布是否集中在一个合理年份区间。如果日期字段缺失抽几条近年新开通的路段比如新的跨河桥、高架延伸段和影像比对几何是否存在。标题的“最新”只能代表打包时间不代表数据内容时间。5.2 翻车点二坐标系投影串了和影像底图错位几十米现象把路网叠加到在线影像或 OSM 底图上道路与影像明显平移短则二三十米长则上百米且偏移方向全图一致。原因元数据里写的是 TWD97实际 .prj 文件丢失GIS 软件按默认的 WGS84 去猜或者数据原本是 TWD67发布者只改了元数据没转坐标导致系统性错位。解决先查 .prj 文件和 ogrinfo 输出的坐标系再向发布方索要明确的 EPSG 编号。手头拿不到权威答复时拿几个明显特征点大型路口、河流桥位与影像比对如果偏移方向稳定尝试用 ogr2ogr 在 TWD67 与 TWD97 之间互相转换转完再叠一次看错位是否收敛。多试两轮比猜一个坐标系盲转更靠谱。5.3 翻车点三乡道路段的起终点没打断网络分析里程偏短现象用 Network Analyst 或 pgRouting 算两点间最短路径结果里程明显短于实际驾车距离或者路线在交叉口“飞过去”不拐弯。原因线图层没有在相交处打上节点。数据是各乡独立测绘后拼接的相邻乡镇的道路眼睁睁在行政边界处交错而过拓扑上却各不相干。解决跑任何网络分析之前先在副本上执行v.clean toolbreak再用 QGIS 拓扑检查器查 dangle。补齐断点后重建网络数据集重新算一遍路径抽样对比。这一步不做后面所有路径里程的分析结果都是不可信的。5.4 翻车点四字段名被截断或属性乱码分级信息读不出来现象分层字段名显示成ROAD_CLAS这种少一个字母的样子路名字段里全是“???”或方块。原因shapefile 的 dbf 协议字段名最多 10 个字符常见于数据源为 File Geodatabase 再转出的情况原始字段ROAD_CLASSIFICATION被硬截断乱码则是 .cpg 编码声明缺失GDAL 默认按 UTF-8 读而源数据是 Big5 或 GBK。解决先看 .cpg 文件是否存在存在的话内容应该类似UTF-8或Big5没有 .cpg 就尝试用ogr2ogr -lco ENCODINGBIG5转写一遍看路名是否恢复。字段名截断解决不了除非重新用 ogrinfo 建一个完整字段名的副本再把原值拷过去。这个工作繁琐但必须做因为分级字段名不统一后续所有脚本都得为它写兼容分支。注意乱码问题不要在 GIS 里手工一个一个改几十万条记录改不完。统一走命令行转编码保留一份修复脚本以后拿到同源数据直接重跑。5.5 翻车点五道路分级字段口径不一致高速和快速混在一起现象属性表里ROAD_CLASS字段既有“高速公路”又有“快速路”“城市快速”还有些记录是空值目视图上快速路和高速画一样粗。原因多源数据库拼接时不同机构对分级标准理解不一致。有些把快速路的等级字段填成高速有些干脆漏填。解决先用GROUP BY ROAD_CLASS列出全部取值把能识别的类目整理成一张映射表比如“高速”和“高速公路”归为 motorway 级别“快速”“城市快速”归为 trunk 级别空值则看几何特征补判。最稳妥的做法是宁可把存疑路段降一级也不要高估路网容量——下游做应急路径分析时把一条县道当快速路用后果比低估严重得多。6. 用路段统计与最短路径抽查验证这套乡道路网的成色验证路网数据有三个习惯性动作先按分级统计路段数和里程再和公开路网抽小块对比里程量级最后做一次真实起终点的最短路径抽查。这套流程跑完数据能不能用基本就有结论了。先用 python 读属性做分级统计这是最快的“体检”import geopandas as gpd gdf gpd.read_file(台湾省道路_全量.shp) # 投影到 TWD97 TM 分带单位换算成米避免用经纬度算长度 gdf gdf.to_crs(EPSG:3826) gdf[length_km] gdf.geometry.length / 1000 stats gdf.groupby(ROAD_CLASS)[length_km].agg([count, sum]) print(stats)EPSG:3826是 TWD97 在中央经线 121 度处的 TM 投影长度计算单位是米。如果你手里的数据坐标系是 TWD67对应换成 TWD67 的 TM 分带编号。统计出来后和发布说明里的里程数对比偏差超过 10% 就要怀疑拓扑是否被改过。再做一次路径抽查选一个“乡镇政府 → 最近高速入口”的实验可以直接用 networkx 在抽取的道路中心线上算import networkx as nx G nx.Graph() for _, row in gdf.iterrows(): geom row.geometry if geom.geom_type ! LineString: continue pts list(geom.coords) for i in range(len(pts) - 1): # 把每一小段作为边长度作为权重 G.add_edge(pts[i], pts[i1], weightrow[length_km]) path nx.shortest_path(G, source起点坐标, target终点坐标, weightweight)networkx 对几十万条边的数据会吃内存跑不动就先用县道以上级别抽子集只验证分级和拓扑逻辑而不追求全量。路径跑出来后和地图导航的距离、时间做人工对比如果路径走向合理、里程误差在可接受范围内这份乡道数据就可以放心交给下游做区域分析。我的习惯是拿到任何一份路网包先不做分析而是按上面三步跑一遍把每级道路的里程、断头路数量、典型路径耗时记在笔记里。这三组数字就是对这包数据的“成色判断”。网络分析领域的很多返工都源于一开始没花这几分钟验货等到下游模型跑完才发现路网断了几百处后悔药都找不到。希望这份处理流程帮你在“最新”两个字之外真正摸清数据的底。本文还有配套的精品资源点击获取
返回列表