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