道級道路矢量數據:從解壓到網絡分析的完整處理指南)
簡介面向GIS分析、地圖制圖與交通規(guī)劃從業(yè)者這份數據包提供臺灣省最新分級道路矢量精確到鄉(xiāng)道層級。內容覆蓋城市一級至四級道路以及高速、國道、省道、縣道、鄉(xiāng)道等行政等級路網并匯入OSM來源的鐵路與各類道路線數據共16種矢量類型彼此間既有重復又形成互補便于進行交叉驗證與路網考究。壓縮包為RAR格式約43.63MB以矢量線文件為主適用于道路分級制圖、路網對比、空間分析及地圖出版等場景。已有463人學習下載可幫助使用者系統(tǒng)梳理臺灣地區(qū)各級道路體系無論需要宏觀道路骨架還是基層鄉(xiāng)道路線都能從中提取相應圖層是開展地理數據研究與可視化時具有參考價值的實用資料。1. 拿到一份“精確到鄉(xiāng)道”的臺灣省道路矢量包先別急著解壓分析做省域路網分析的人第一痛點是底圖精度。地圖廠商的全國路網到了鄉(xiāng)鎮(zhèn)一級往往只剩一條主干道而一份“臺灣省道路數據最新分級精確到鄉(xiāng)道矢量數據.rar”這樣的數據包正好補上這個斷層它把道路按行政等級和功能等級拆到了鄉(xiāng)道以矢量數據封裝解壓就能進 GIS。這篇筆記不考證這份數據出自哪里、作者是誰只講拿到這種路網包之后怎么驗貨、導入、清洗并用它做網絡分析。適合 GIS 工程師、規(guī)劃分析師以及做物流路徑、交管路網計算的人。沒有這份包也沒關系這套處理流程本身就是收省級路網數據的通用做法。2. 解壓與盤點校驗 rar 包的完整性、處理密碼與認清單個圖層2.1 用 rar 分發(fā)路網數據壓縮率、分卷與密碼是三個現實理由做路網分發(fā)的人選擇 rar 而不是 zip通常不是圖它界面好看而是三個實際需求。第一是壓縮率。shapefile 的 .dbf 屬性表里往往存大量中文字段鄉(xiāng)村道路名稱、路面材質、竣工年份這類文本重復度很高rar 的 solid 壓縮模式能比 zip 再壓掉不少體積。一個省級路網解壓后幾個 GB壓縮包可能只有三分之一這對網盤分發(fā)和郵件附件都友好得多。第二是分卷。臺灣全省的路網數據尤其是帶拓撲關系的 GeoPackage 或 File Geodatabase單文件經常超過 2GB。rar 可以按指定大小切分卷早期的網絡存儲和光碟分發(fā)都依賴這個能力所以很多老工程包至今仍沿用 rar 分卷的發(fā)布習慣。解壓時只要把第一個 .part1.rar 拖進解壓工具它會自動找后續(xù)分卷單獨拿中間某個分卷出來是解不開的。第三是密碼。這類數據包通常帶一個輕度保護的只讀密碼主要防止別人改包重傳而不是真的防破解。網上有人搜 rar 密碼移除、advanced rar password recovery 這類工具我的觀點很直接先找發(fā)布方要密碼別一上來就暴力破解。路網數據包的密碼大多是發(fā)布方統(tǒng)一設置的短口令暴力破解確實能出來但幾個 GB 的分卷包跑一輪要幾小時而且很容易損壞 solid 壓縮的校驗結構屬于典型的后悔藥比病還貴。真聯系不上發(fā)布方再考慮用工具處理但前提是做好原包備份。2.2 解壓前先做完整性校驗rar t 與 7z t 的參數差異拿到包直接雙擊解壓是新手常見操作但我的習慣是解壓之前先跑一遍完整性測試。rar 包的 solid 壓縮特性決定了中段一個分卷損壞后面所有文件都可能解不出來而很多路網包在網盤里躺了幾年中間字節(jié)壞沒壞只有測過才知道。Windows 下裝了 WinRAR 或 7-Zip 后命令行里可以直接調 rar 或 7z 做測試。Linux 服務器上我一般用 unar 或 p7zip命令如下# 測試 rar 包完整性的標準做法不釋放任何文件 rar t 臺灣省道路數據最新分級精確到鄉(xiāng)道矢量數據.rar # 7-Zip 的測試命令路徑帶中文時引號不能省 7z t 臺灣省道路數據最新分級精確到鄉(xiāng)道矢量數據.rar # macOS/Linux 下若只裝了 p7zip用 7z 同款命令若裝了 unar 則更簡單 lsar 臺灣省道路數據最新分級精確到鄉(xiāng)道矢量數據.rarrar t和7z t的區(qū)別在于rar 工具對自家格式的校驗更嚴格會逐塊檢查 CRC7z 對 rar 的兼容性足夠好但遇到分卷路徑有中文或文件名亂碼時更容易報錯。lsar只列目錄不校驗適合先看包內結構真正解壓用unar更穩(wěn)它對中文編碼的識別比 p7zip 好。提示解壓后建議保留原 rar 包不要因為磁盤緊張就刪掉。后續(xù)某個圖層字段讀不出來、坐標系對不上時你很可能需要回原包重新解壓一份干凈數據而不是在已經動過手腳的副本上找問題。2.3 解壓后的數據盤點文件清單、擴展名與圖層命名核對解壓完成后先別急著拖進 GIS用文件管理器或命令行把目錄結構過一遍。常見做法是這類工程包要么直接放一堆 .shp 伴生文件要么分好 road 和 rail 等子目錄頂層通常帶一個發(fā)布說明 txt 或元數據 xml。第一次拿到包我一般按下表逐項核對檢查項預期內容異常信號頂層目錄結構按道路等級或行政區(qū)分文件夾所有圖層亂堆在根目錄說明包被二次打包過.shp 伴生文件每個 shp 至少帶 .shx、.dbf、.prj缺 .prj 是最致命的坐標系會變成未知字段編碼文件中文路名需要 .cpg 或 release note 注明編碼沒有 .cpgdbf 里的中文大概率亂碼圖層命名含 class、level、grade 中任意一個詞只有 line、road 這種籠統(tǒng)命名分級字段可能在屬性里版本信息發(fā)布說明或屬性表里有 update_date文件名寫 2024屬性表里日期字段全是 2018這里有個容易翻車的細節(jié)shapefile 的 .shp 只是幾何文件真正的屬性存在 .dbf 里空間索引在 .shx坐標系在 .prj。很多人只拷貝 .shp 發(fā)給同事結果對方打開只有圖形沒有屬性這就是把 shapefile 當單文件用的典型黑匣子操作。如果解壓出來是 File Geodatabase.gdb 文件夾或 GeoPackage.gpkg 單文件反而省心坐標系、字段名、屬性類型都封在內部不需要陪生文件。但 .gdb 要注意版本兼容ArcGIS 10.x 創(chuàng)建的庫QGIS 3.28 以上版本才能穩(wěn)定讀取老版本 QGIS 打開容易只顯示空圖層。3. 把道路矢量數據讀進 GIS區(qū)分包內格式、確認坐標系、定位分級字段3.1 認出包里是 shapefile 還是 geodatabase擴展名之外還要看伴生文件解壓后第一個動作是問這包數據到底是什么格式不要只看擴展名shapefile 是“多文件集合”真正判斷依據是里面有沒有 .dbf 和 .shx。我的檢查命令很簡單# 列出目錄下所有文件按擴展名統(tǒng)計 ls -la | awk {print $NF} | sed s/.*\.// | sort | uniq -c # 如果看到 .gdb 目錄用 ogrinfo 確認它是有效的地理數據庫 ogrinfo --format FileGDBogrinfo --format的輸出會告訴你當前 GDAL 版本是否編譯了 FileGDB 驅動。很多 Linux 發(fā)行版默認 GDAL 不帶 FileGDB 插件這時候 .gdb 目錄明明在ogrinfo卻讀不出任何圖層。解決方案是裝gdal-filegdb擴展包或者讓發(fā)布方轉一份 GeoPackage。遇到擴展名是 .tabMapInfo、.dwgCAD、.mdbAccess也不要慌ogrinfo都能讀但處理邏輯完全不同。CAD 數據要留意里程樁號在文字對象里不是屬性字段MapInfo 的 .tab 配 .map 和 .dat漏一個文件就缺屬性。3.2 坐標系是第一道門檻TWD97、TWD67 與 WGS84 的換算場景臺灣省路網數據最常見的坐標陷阱是把 TWD67 當成 TWD97 用。兩者都是臺灣地區(qū)常用的投影基準但橢球參數不同平面上能差出幾十米如果你的底圖是 WGS84 的影像或 OSM 路網錯位會更明顯。判斷坐標系最直接的方法是讀 .prj 文件或用 ogrinfo 輸出現有坐標系# 只看數據集概要不展開幾何 ogrinfo -so -al 臺灣省道路_鄉(xiāng)道.shp輸出里的EXTENT、Geometry和Coordinate System三段最有價值。Coordinate System 如果顯示unknown或亂碼說明 .prj 缺失或文本編碼壞了。常見的正確結果是 TWD97 / TM2 zone 121EPSG:3826 這類 TM 分帶投影或者 WGS 84EPSG:4326。如果顯示成 TWD67那后續(xù)疊加影像時就需要做一次投影轉換# 把 TWD67 轉成 WGS84 地理坐標輸出為新文件 ogr2ogr -t_srs EPSG:4326 臺灣省道路_wgs84.shp 臺灣省道路_原始.shp提示轉換后務必抽查幾條道路與在線影像上對應的交叉口做目視比對。投影轉換不是數學題原始數據本身可能就有局部偏移轉換只是消除系統(tǒng)性誤差不解決數據采集時的漂移。3.3 用 ogrinfo 快速讀取字段找到那條“道路分級”字段標題說“分級精確到鄉(xiāng)道”那分級信息到底存在哪常見位置有三處字段名叫CLASS或ROAD_CLASS字段值是“高速”“國道”“省道”“縣道”“鄉(xiāng)道”或者字段叫F_LEVEL、KIND存的是數字等級碼 1 到 6再或者幾何本身按圖層分好了名字里帶 town、village。用 ogrinfo 看字段名和取值分布比在 GIS 里點開屬性表快得多# 列出所有字段名和字段類型 ogrinfo -so -al 臺灣省道路_鄉(xiāng)道.shp | grep -A 20 Layer name # 看分級字段到底有哪些取值 ogrinfo -dialect sqlite -sql SELECT ROAD_CLASS, COUNT(*) FROM 臺灣省道路_鄉(xiāng)道 GROUP BY ROAD_CLASS 臺灣省道路_鄉(xiāng)道.shp注意第二條命令用到了 SQLite dialect這是 GDAL 內嵌的 SQL 引擎支持 GROUP BY處理幾十萬條線段的屬性統(tǒng)計很順手。如果沒有分組統(tǒng)計你根本不知道這個字段里有幾個類目、有沒有拼寫變體比如“鄉(xiāng)道”和“鄉(xiāng)鎮(zhèn)道路”并存的情況。這一步沒做后面按分級渲染圖層一定會出亂子。4. 把鄉(xiāng)道精度跑起來按分級字段切分圖層與網絡分析前處理4.1 用 ogr2ogr 按字段篩選輸出高速、省道、縣道、鄉(xiāng)道分層落地很多人在 GIS 里用“按屬性選擇 導出”來拆圖層數據量小沒問題省級路網幾十萬條線就很拖沓。我習慣在命令行用 ogr2ogr 按字段值篩選輸出速度和內存占用都比 GUI 可靠# 只輸出鄉(xiāng)道寫入獨立 shapefile ogr2ogr -where ROAD_CLASS 鄉(xiāng)道 鄉(xiāng)道.shp 臺灣省道路_全量.shp # 同時輸出縣道和鄉(xiāng)道SQL 語法里用 OR 連接 ogr2ogr -where ROAD_CLASS IN (縣道, 鄉(xiāng)道) 縣道鄉(xiāng)道.shp 臺灣省道路_全量.shp-where后面的條件走的是 SQL WHERE字符串值必須帶單引號字段名大小寫要和屬性表一致否則 GDAL 靜默地篩不出任何數據——它不報錯只是輸出一個空圖層。這個空結果可以直接用ogrinfo -so -al 輸出的文件看Feature Count驗證數量為 0 就回頭查字段名。拆層之后不要刪原文件拆出來的子集只是工作副本。后續(xù)做網絡分析、制圖綜合、發(fā)布服務都應該從全量數據派生避免在子集上反復編輯把原始拓撲搞壞。4.2 分級渲染與制圖表達讓鄉(xiāng)道在底圖上“看得見”數據進圖之后第一件事不是分析而是把分級渲染做出來用眼睛檢查數據是不是真的合理。在 QGIS 里右鍵圖層 → 屬性 → 符號化 → 按分類選擇 ROAD_CLASS 字段讓軟件自動生成類目。但自動生成的配色順序通常是亂序我手動調整成一套由粗到細的表達分級線寬配色表達目的高速 / 快速3.2 mm橙色帶深色描邊骨架級道路最先被看見國道 / 省道2.0 mm黃色區(qū)域級干線引導視線縣道1.2 mm白色鄉(xiāng)鎮(zhèn)間聯系道路鄉(xiāng)道0.7 mm淺灰最細一級縮放時逐漸顯現這套方案的邏輯是縮放到省域時灰線自然隱到背景放大到鄉(xiāng)鎮(zhèn)時鄉(xiāng)道浮現與縣道形成層級關系。分級渲染不是畫著好看它直接決定了人工檢查數據的效率——鄉(xiāng)道斷沒斷、縣道接沒接一眼能看出來。4.3 網絡分析前必做的拓撲處理打斷相交線與消除懸掛點路網數據從測繪部門出來往往天然帶拓撲但網上流傳的 re-projected、re-signed 版本常把拓撲破壞掉。典型問題就是兩條路十字交叉交點處沒有公共節(jié)點路徑計算不會自動“拐彎”。做網絡分析之前我統(tǒng)一做一遍相交線打斷# 調用 GRASS 的 v.clean 對線圖層做 break 處理 v.clean input道路_全量 output道路_打斷 toolbreak --overwritetoolbreak會在所有線段相交處強行打斷不打散屬性但會在打斷點復制屬性記錄。打斷后還要檢查懸掛點dangle一條鄉(xiāng)道畫到一半沒有接上任何道路在圖層里肉眼看著像是一條完整的路但網絡分析里它就是死胡同。QGIS 的拓撲檢查器可以高亮懸掛點命令行里用 v.clean 的snap加rmdangle可以批量修一部分但真正復雜的斷頭路還是要人工補線。這里有個血淚經驗打斷操作做完原數據的“道路名稱”字段會被復制到所有打斷后的子線段后續(xù)做屬性統(tǒng)計時一條長路被統(tǒng)計成好幾段里程匯總直接翻倍。所以打斷后的圖層只用于網絡分析不要用于里程統(tǒng)計里程統(tǒng)計要在打斷前用原始連續(xù)線段做。5. 路網矢量數據避坑手冊拿到“最新”分級數據后的五個翻車點5.1 翻車點一標題寫著“最新”屬性表里的數據卻早了三五年現象文件名標注“最新”打開屬性表按日期字段排序發(fā)現大部分路段的更新日期停留在五年前甚至字段里根本沒有日期。原因很多網傳包是“底圖舊 局部新”的縫合產物。發(fā)布者把新開通的快速路加進了舊路網卻忘了同步更新整庫的元數據或者原數據方只在局部范圍做過 revision其他區(qū)域沿用的是更老的采集成果。解決把數據包里的發(fā)布說明 txt 先讀完再對update_date、MODIFY_DATE這類字段做 GROUP BY 統(tǒng)計看日期分布是否集中在一個合理年份區(qū)間。如果日期字段缺失抽幾條近年新開通的路段比如新的跨河橋、高架延伸段和影像比對幾何是否存在。標題的“最新”只能代表打包時間不代表數據內容時間。5.2 翻車點二坐標系投影串了和影像底圖錯位幾十米現象把路網疊加到在線影像或 OSM 底圖上道路與影像明顯平移短則二三十米長則上百米且偏移方向全圖一致。原因元數據里寫的是 TWD97實際 .prj 文件丟失GIS 軟件按默認的 WGS84 去猜或者數據原本是 TWD67發(fā)布者只改了元數據沒轉坐標導致系統(tǒng)性錯位。解決先查 .prj 文件和 ogrinfo 輸出的坐標系再向發(fā)布方索要明確的 EPSG 編號。手頭拿不到權威答復時拿幾個明顯特征點大型路口、河流橋位與影像比對如果偏移方向穩(wěn)定嘗試用 ogr2ogr 在 TWD67 與 TWD97 之間互相轉換轉完再疊一次看錯位是否收斂。多試兩輪比猜一個坐標系盲轉更靠譜。5.3 翻車點三鄉(xiāng)道路段的起終點沒打斷網絡分析里程偏短現象用 Network Analyst 或 pgRouting 算兩點間最短路徑結果里程明顯短于實際駕車距離或者路線在交叉口“飛過去”不拐彎。原因線圖層沒有在相交處打上節(jié)點。數據是各鄉(xiāng)獨立測繪后拼接的相鄰鄉(xiāng)鎮(zhèn)的道路眼睜睜在行政邊界處交錯而過拓撲上卻各不相干。解決跑任何網絡分析之前先在副本上執(zhí)行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 建一個完整字段名的副本再把原值拷過去。這個工作繁瑣但必須做因為分級字段名不統(tǒng)一后續(xù)所有腳本都得為它寫兼容分支。注意亂碼問題不要在 GIS 里手工一個一個改幾十萬條記錄改不完。統(tǒng)一走命令行轉編碼保留一份修復腳本以后拿到同源數據直接重跑。5.5 翻車點五道路分級字段口徑不一致高速和快速混在一起現象屬性表里ROAD_CLASS字段既有“高速公路”又有“快速路”“城市快速”還有些記錄是空值目視圖上快速路和高速畫一樣粗。原因多源數據庫拼接時不同機構對分級標準理解不一致。有些把快速路的等級字段填成高速有些干脆漏填。解決先用GROUP BY ROAD_CLASS列出全部取值把能識別的類目整理成一張映射表比如“高速”和“高速公路”歸為 motorway 級別“快速”“城市快速”歸為 trunk 級別空值則看幾何特征補判。最穩(wěn)妥的做法是寧可把存疑路段降一級也不要高估路網容量——下游做應急路徑分析時把一條縣道當快速路用后果比低估嚴重得多。6. 用路段統(tǒng)計與最短路徑抽查驗證這套鄉(xiāng)道路網的成色驗證路網數據有三個習慣性動作先按分級統(tǒng)計路段數和里程再和公開路網抽小塊對比里程量級最后做一次真實起終點的最短路徑抽查。這套流程跑完數據能不能用基本就有結論了。先用 python 讀屬性做分級統(tǒng)計這是最快的“體檢”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 分帶編號。統(tǒng)計出來后和發(fā)布說明里的里程數對比偏差超過 10% 就要懷疑拓撲是否被改過。再做一次路徑抽查選一個“鄉(xiāng)鎮(zhèn)政府 → 最近高速入口”的實驗可以直接用 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 對幾十萬條邊的數據會吃內存跑不動就先用縣道以上級別抽子集只驗證分級和拓撲邏輯而不追求全量。路徑跑出來后和地圖導航的距離、時間做人工對比如果路徑走向合理、里程誤差在可接受范圍內這份鄉(xiāng)道數據就可以放心交給下游做區(qū)域分析。我的習慣是拿到任何一份路網包先不做分析而是按上面三步跑一遍把每級道路的里程、斷頭路數量、典型路徑耗時記在筆記里。這三組數字就是對這包數據的“成色判斷”。網絡分析領域的很多返工都源于一開始沒花這幾分鐘驗貨等到下游模型跑完才發(fā)現路網斷了幾百處后悔藥都找不到。希望這份處理流程幫你在“最新”兩個字之外真正摸清數據的底。本文還有配套的精品資源點擊獲取