鐵路矢量數(shù)據(jù)處理全流程:從7z解壓到緩沖分析)
簡(jiǎn)介2024年全國(guó)鐵路含高鐵、地鐵矢量數(shù)據(jù)集是一份面向GIS分析、交通規(guī)劃、地圖制圖與科研教學(xué)人員的基礎(chǔ)空間數(shù)據(jù)包覆蓋全國(guó)范圍內(nèi)鐵路、地鐵、有軌電車(chē)、窄軌鐵路、單軌鐵路、輕軌及纜索鐵道等主要軌道類(lèi)型。壓縮包內(nèi)共48個(gè)文件以Shapefile體系的shp、dbf、shx、prj、cpg等文件為主體其中shp保存幾何圖形dbf保存屬性字段prj定義投影坐標(biāo)cpg聲明字符集并附帶sbn/sbx空間索引與xml元數(shù)據(jù)整體63.35MB采用7z格式壓縮便于下載。文件命名清晰各圖層同名前綴便于識(shí)別與批量處理。數(shù)據(jù)按不同制式拆分為多個(gè)獨(dú)立圖層可單獨(dú)或全量加載直接用于QGIS、ArcGIS等主流平臺(tái)完成疊加分析、專(zhuān)題渲染與路網(wǎng)建模也能為基礎(chǔ)底圖分析、軌道站點(diǎn)分布研究或GIS教學(xué)練習(xí)提供支撐。已有847人學(xué)習(xí)使用適合城鄉(xiāng)規(guī)劃、智慧交通、應(yīng)急管理等領(lǐng)域進(jìn)行軌道網(wǎng)絡(luò)底圖建設(shè)與空間分析實(shí)踐。 最近要在全國(guó)范圍內(nèi)做鐵路線網(wǎng)分析朋友丟過(guò)來(lái)一個(gè)包名字就叫“2024年全國(guó)鐵路鐵路、高鐵、地鐵矢量數(shù)據(jù)集.7z”。搞GIS的人都懂找數(shù)據(jù)往往比處理數(shù)據(jù)更磨人尤其是鐵路這種線要素散落在各種平臺(tái)里的版本不是坐標(biāo)系對(duì)不上就是屬性字段缺胳膊少腿。這個(gè)壓縮包光看文件名就很對(duì)胃口鐵路、高鐵、地鐵三類(lèi)線網(wǎng)歸攏到一份矢量數(shù)據(jù)集里還用了7z壓縮。我借這個(gè)機(jī)會(huì)把拿到這類(lèi)數(shù)據(jù)后從解壓、清洗、轉(zhuǎn)換到落地的完整鏈路復(fù)盤(pán)一遍給同樣要做路網(wǎng)可視化、緩沖分析和交通建模的朋友做個(gè)參考。1. 先把這個(gè)壓縮包里的東西聊透鐵路、高鐵、地鐵為什么該分三層1.1 矢量數(shù)據(jù)的“線”到底是什么矢量數(shù)據(jù)不像柵格那樣是一張張圖片它本質(zhì)上是帶坐標(biāo)的幾何對(duì)象集合。鐵路數(shù)據(jù)在矢量里通常表現(xiàn)為“線要素”每個(gè)線要素由一串坐標(biāo)點(diǎn)連成代表一段實(shí)際的鐵軌走向車(chē)站則往往是“點(diǎn)要素”用于標(biāo)注站點(diǎn)位置如果你要做站點(diǎn)輻射范圍可以再生成“面要素”。這套數(shù)據(jù)把鐵路、高鐵、地鐵拆成三層是很合理的組織方式。因?yàn)檫@三類(lèi)線路的運(yùn)行體系、速度等級(jí)、主管邏輯都不一樣普速鐵路是客貨混跑、站距大高鐵設(shè)計(jì)時(shí)速高、線路更平直地鐵屬于城市內(nèi)部軌道交通站距短、線網(wǎng)密集。畫(huà)全國(guó)圖時(shí)這三層分開(kāi)才能按不同顏色、不同線寬去表達(dá)。如果混在同一個(gè)圖層里光是數(shù)據(jù)篩選就夠折騰半天。我拿到過(guò)的同類(lèi)數(shù)據(jù)包里一般核心要素會(huì)包含線路名稱(chēng)、線路級(jí)別、運(yùn)營(yíng)狀態(tài)、里程、起終點(diǎn)等屬性。具體到這份2024年的包打開(kāi)后大概率能看到按shp、GeoJSON、GeoPackage等常見(jiàn)矢量格式分好的目錄方便不同工具鏈直接使用。1.2 7z 出現(xiàn)在文件名里不只是為了省幾個(gè)MB很多人對(duì)7z壓縮格式的第一反應(yīng)是“能解壓就行”其實(shí)對(duì)地理數(shù)據(jù)來(lái)說(shuō)壓縮格式的選擇很關(guān)鍵。鐵路線網(wǎng)是全國(guó)范圍的線路要素非常多原始Shapefile一套下來(lái)經(jīng)常是幾百M(fèi)B到GB級(jí)。7z比zip有更高的壓縮率尤其對(duì)屬性表這種大量重復(fù)文本壓出來(lái)的體積優(yōu)勢(shì)非常明顯。更實(shí)用的一點(diǎn)是7z支持分卷壓縮、加密、多線程解壓適合大文件傳輸和長(zhǎng)期歸檔。如果發(fā)布方把全國(guó)鐵路網(wǎng)壓成7z說(shuō)明它是按“數(shù)據(jù)資產(chǎn)”而不是“臨時(shí)文件”來(lái)管理的。這也提醒我們拿到包之后別解壓完就把原始?jí)嚎s包刪了留著它相當(dāng)于給項(xiàng)目留了個(gè)可復(fù)驗(yàn)的基線版本。1.3 2024 這個(gè)時(shí)間點(diǎn)決定了數(shù)據(jù)能用在哪類(lèi)場(chǎng)景文件名里的年份是這批數(shù)據(jù)最重要的元信息。鐵路建設(shè)是動(dòng)態(tài)過(guò)程每年都有新線路開(kāi)通2024版數(shù)據(jù)反映的是截至當(dāng)年某個(gè)時(shí)間點(diǎn)的線網(wǎng)狀態(tài)。很多數(shù)據(jù)包會(huì)在屬性表里用“運(yùn)營(yíng)/在建/規(guī)劃”這類(lèi)狀態(tài)字段來(lái)區(qū)分線路使用前一定要先看一眼狀態(tài)字段否則很容易把在建線路當(dāng)成已運(yùn)營(yíng)線路畫(huà)圖做出錯(cuò)誤結(jié)論。如果你是做現(xiàn)狀分析比如路網(wǎng)密度、車(chē)站覆蓋、區(qū)域可達(dá)性2024年版本基本夠用如果你要做未來(lái)規(guī)劃推演就得再疊加規(guī)劃線路或自行補(bǔ)充新開(kāi)通線路。我習(xí)慣把這類(lèi)數(shù)據(jù)當(dāng)作底圖基線再手動(dòng)追加更新后面會(huì)專(zhuān)門(mén)講這個(gè)事。2. Windows 11 下解壓 7z裝工具、改緩存、命令行三件事一次搞定2.1 官方 7-Zip 和“增強(qiáng)版”到底選哪個(gè)Windows 11 自帶zip解壓但遇到7z擴(kuò)展名就抓瞎了必須裝第三方工具。最穩(wěn)妥的是官方7-Zip開(kāi)源免費(fèi)、支持全系列壓縮格式、多線程解壓速度快。平時(shí)解壓數(shù)據(jù)、打包歸檔官方版足夠用。近幾年還出現(xiàn)了一些“增強(qiáng)版”比如NanaZip、7-Zip-Zstd這類(lèi)衍生版本。它們主打Windows 11的右鍵菜單集成、新壓縮算法Zstd、Brotli和更現(xiàn)代的設(shè)置界面確實(shí)比官方版好看一些。如果你只是解壓別人發(fā)的包我建議直接上官方版穩(wěn)定不生事。如果自己是大批量數(shù)據(jù)打包發(fā)布方想試更高的壓縮率可以再研究增強(qiáng)版里的Zstd算法但要注意接收方不一定能解壓新算法格式兼容性需要提前確認(rèn)。裝的時(shí)候留意官方網(wǎng)站或應(yīng)用商店渠道這類(lèi)工具太熱門(mén)容易被第三方下載站捆綁安裝亂七八糟的東西。裝完右鍵一個(gè).7z文件菜單里能看到“解壓到當(dāng)前文件夾”或“解壓到指定目錄”選項(xiàng)選后者可以避免文件散落一地。2.2 解壓時(shí) C 盤(pán)空間莫名告急的根因這是熱搜里“7z c盤(pán)占用”最常見(jiàn)的來(lái)源。很多人明明把壓縮包放在D盤(pán)解壓目標(biāo)也選在D盤(pán)但C盤(pán)可用空間卻在嘩嘩往下掉最后解壓到一半報(bào)磁盤(pán)空間不足。根因在于7-Zip解壓大文件時(shí)會(huì)在系統(tǒng)臨時(shí)目錄%TEMP%默認(rèn)就在C盤(pán)寫(xiě)入臨時(shí)緩存。全國(guó)鐵路矢量數(shù)據(jù)解壓后的體量可能比壓縮包大好幾倍臨時(shí)文件一寫(xiě)C盤(pán)就爆了。解決辦法有兩個(gè)方向。第一修改7-Zip的臨時(shí)目錄打開(kāi)7-Zip文件管理器在“工具-選項(xiàng)”里把臨時(shí)文件路徑指到剩余空間最大的數(shù)據(jù)盤(pán)。第二如果只用命令行解壓不完全走圖形界面緩存命令本身可以直接把輸出目錄指定到隔壁盤(pán)。還要提醒一句解壓之前先看一眼解壓后的預(yù)估體積用右鍵-屬性查看壓縮包信息并估算展開(kāi)大小很多解壓失敗其實(shí)是目標(biāo)盤(pán)空間沒(méi)留夠。2.3 命令行解壓才是批量場(chǎng)景的正解圖形界面解壓?jiǎn)蝹€(gè)文件很直觀但遇到批量數(shù)據(jù)包或者你在遠(yuǎn)程服務(wù)器上操作命令行效率就完全不一樣。核心命令是# 將打包文件解壓到 D:\rail_data 目錄并保留壓縮包內(nèi)的目錄結(jié)構(gòu) 7z x 2024年全國(guó)鐵路鐵路、高鐵、地鐵矢量數(shù)據(jù)集.7z -oD:\rail_data -y注意上面用的是x而不是e。7z e會(huì)把所有文件解到同一個(gè)目錄容易丟失子文件夾結(jié)構(gòu)7z x會(huì)保留包內(nèi)目錄層級(jí)對(duì)多格式數(shù)據(jù)集特別重要。批量解壓可以寫(xiě)個(gè)簡(jiǎn)單循環(huán)for f in *.7z; do 7z x $f -odata/${f%.7z} -y done拿到壓縮包后我建議先跑一遍完整性測(cè)試再解壓7z t 2024年全國(guó)鐵路鐵路、高鐵、地鐵矢量數(shù)據(jù)集.7z這條命令不會(huì)解出文件只校驗(yàn)分卷和校驗(yàn)碼能提前暴露下載損壞的問(wèn)題。千萬(wàn)別跳過(guò)這一步全國(guó)級(jí)大文件在網(wǎng)絡(luò)傳輸中壞一兩個(gè)字節(jié)很常見(jiàn)等數(shù)據(jù)都展開(kāi)了一半再報(bào)CRC錯(cuò)誤重新下載的成本更高。3. 從壓縮包到能畫(huà)的圖層格式、坐標(biāo)系、屬性表逐個(gè)過(guò)關(guān)3.1 Shapefile、GeoJSON、GeoPackage 選哪個(gè)當(dāng)主力壓縮包里如果同時(shí)提供了多種格式很多人會(huì)糾結(jié)到底用哪個(gè)。我直接給結(jié)論沒(méi)有特殊要求時(shí)優(yōu)先用GeoPackage擴(kuò)展名通常為.gpkg。三者的差異用一張表看得很清楚格式文件組織優(yōu)缺點(diǎn)推薦場(chǎng)景Shapefile一個(gè)要素由.shp、.dbf、.shx等多個(gè)文件組成兼容性最強(qiáng)但字段名長(zhǎng)度受限、屬性編碼容易亂老工具鏈、ArcGIS互操作GeoJSON單文件、純文本W(wǎng)eb友好直接進(jìn)瀏覽器和在線地圖但體積大、加載慢Leaflet、MapBox、前端可視化GeoPackage單文件、基于SQLite體積適中支持空間索引、屬性查詢一個(gè)文件裝全量數(shù)據(jù)QGIS、Python、移動(dòng)端、長(zhǎng)期歸檔我處理全國(guó)路網(wǎng)數(shù)據(jù)時(shí)會(huì)先用GeoPackage做分析和清洗最后需要給前端的時(shí)候再導(dǎo)出GeoJSON。這樣既有性能又有兼容性。3.2 線路“對(duì)不上底圖”多半是坐標(biāo)系在作怪鐵路數(shù)據(jù)最常見(jiàn)的翻車(chē)現(xiàn)場(chǎng)是圖層疊加到在線底圖上線路整體平移了幾百米或者角度不對(duì)。這基本可以斷定是坐標(biāo)系不一致。國(guó)內(nèi)鐵路矢量數(shù)據(jù)常見(jiàn)兩種坐標(biāo)系CGCS2000EPSG:4490和WGS84EPSG:4326。兩者在地圖尺度上差異很小疊加常規(guī)底圖問(wèn)題不大。真正的坑在于如果你用的在線底圖是高德、騰訊這類(lèi)平臺(tái)它們默認(rèn)是GCJ-02坐標(biāo)系也就是俗稱(chēng)的“火星坐標(biāo)系”而數(shù)據(jù)集里很可能是WGS84或CGCS2000。兩套坐標(biāo)系在城市區(qū)域可以偏移幾百米鐵路線看起來(lái)就像從樓頂上穿過(guò)去。檢查坐標(biāo)系最直接的辦法在QGIS里加載圖層右鍵圖層選“屬性-信息”看CRS描述命令行可以用ogrinfo或gdalsrsinfo查看。如果確需轉(zhuǎn)換用GDAL的ogr2ogr即可# 把數(shù)據(jù)統(tǒng)一到 WGS84 經(jīng)緯度坐標(biāo) ogr2ogr -t_srs EPSG:4326 output.shp input.shp如果是要發(fā)布到Web地圖目標(biāo)坐標(biāo)系通常選Web墨卡托EPSG:3857但注意這會(huì)影響后續(xù)的距離計(jì)算算里程或緩沖區(qū)時(shí)要換回等距投影或經(jīng)緯度坐標(biāo)。3.3 讀懂屬性表才知道哪些線路能畫(huà)上去解壓完成后別急著畫(huà)圖先打開(kāi)屬性表摸一遍字段。這類(lèi)鐵路數(shù)據(jù)包里常見(jiàn)的屬性字段至少包括name或line_name線路名稱(chēng)type或level線路等級(jí)比如高鐵、普速、地鐵status運(yùn)營(yíng)狀態(tài)標(biāo)識(shí)已運(yùn)營(yíng)、在建還是規(guī)劃speed設(shè)計(jì)時(shí)速便于分級(jí)配色mileage或length線路里程用Python里的GeoPandas讀屬性表做快速體檢很方便import geopandas as gpd gdf gpd.read_file(path/to/rail_data.gpkg, layerhigh_speed) print(gdf.head()) print(gdf[status].value_counts()) print(gdf.crs)這一步能快速發(fā)現(xiàn)字段缺失、空值或者狀態(tài)值不規(guī)范的問(wèn)題。比如有的包把“已運(yùn)營(yíng)”寫(xiě)成“運(yùn)營(yíng)”、有的寫(xiě)成“開(kāi)通”需要統(tǒng)一成一套規(guī)范字典再做分析。數(shù)據(jù)清洗的習(xí)慣最好從第一天就建立后面調(diào)用多少次都不慌。4. 讓鐵路數(shù)據(jù)真正跑起來(lái)可視化、緩沖區(qū)、路網(wǎng)建模三板斧4.1 畫(huà)一張全國(guó)高鐵網(wǎng)先要把地鐵線踢出去拿到數(shù)據(jù)的第一個(gè)念頭通常是畫(huà)圖看看整體長(zhǎng)什么樣。這個(gè)想法沒(méi)問(wèn)題但要注意如果你把地鐵線和干線鐵路一次性全畫(huà)出來(lái)全國(guó)視角下地鐵線路會(huì)縮成一團(tuán)密集到根本看不清。正確的做法是按圖層分級(jí)。國(guó)鐵干線用全國(guó)視角高鐵線用粗線、主線色普速線用細(xì)線、輔色地鐵數(shù)據(jù)只在切到城市尺度時(shí)才顯示。QGIS里可以按圖層內(nèi)置的type字段做分類(lèi)樣式Python繪圖則建議篩選后分圖層繪制。如果你習(xí)慣用代碼快速出圖GeoPandas加Matplotlib是組合import geopandas as gpd import matplotlib.pyplot as plt rail gpd.read_file(path/to/rail_data.gpkg) fig, ax plt.subplots(figsize(16, 10)) rail[rail[type] high_speed].plot(axax, color#d62728, linewidth0.8) rail[rail[type] normal].plot(axax, color#2c3e50, linewidth0.4) ax.set_axis_off() plt.show()注意如果你用在線底圖要先確保數(shù)據(jù)坐標(biāo)系和底圖一致否則出現(xiàn)偏移時(shí)畫(huà)出來(lái)的全國(guó)圖是“虛”的好看但不能用于空間判斷。4.2 用緩沖區(qū)分析量化“鐵路沿線”的輻射范圍鐵路網(wǎng)不只是拿來(lái)畫(huà)線更常用的是做沿線輻射分析。比如高鐵站周邊5公里、鐵路沿線兩側(cè)10公里范圍內(nèi)覆蓋了多少城區(qū)、人口或產(chǎn)業(yè)用地這類(lèi)分析全靠緩沖區(qū)。做緩沖區(qū)最容易錯(cuò)的點(diǎn)是投影。直接在經(jīng)緯度坐標(biāo)系里做Buffer距離單位是度不是米算出來(lái)的結(jié)果毫無(wú)意義。正確做法是先把數(shù)據(jù)轉(zhuǎn)成適合該區(qū)域的等距投影比如在很多區(qū)域分析中會(huì)用橫軸墨卡托或阿爾伯斯等面積投影再按米生成緩沖區(qū)# 先投影到以米為單位的坐標(biāo)系統(tǒng) rail_proj rail.to_crs(EPSG:3857) buffered rail_proj.geometry.buffer(5000) # 如果需要后續(xù)面積統(tǒng)計(jì)再轉(zhuǎn)回合適的等積投影 area_gdf gpd.GeoDataFrame(geometrybuffered, crsEPSG:3857).to_crs(EPSG:32650) print(area_gdf.geometry.area.sum() / 1e6, 平方公里)全國(guó)尺度做這種分析數(shù)據(jù)量大緩沖后幾何體更復(fù)雜建議先按線路等級(jí)過(guò)濾再做矢量切片或柵格化否則內(nèi)存容易撐不住。這個(gè)坑我踩過(guò)不止一次。4.3 把線網(wǎng)變成圖結(jié)構(gòu)才能做連通性和路徑分析鐵路網(wǎng)本質(zhì)是一個(gè)圖結(jié)構(gòu)站點(diǎn)是節(jié)點(diǎn)線路是邊。但如果直接拿原始線要素做網(wǎng)絡(luò)分析基本會(huì)失敗因?yàn)樵际噶坷镆粭l長(zhǎng)線路可能是幾何上連續(xù)的一條線段中間沒(méi)有站點(diǎn)節(jié)點(diǎn)無(wú)法直接算“A站到B站經(jīng)過(guò)哪些線路”。要把它變成可計(jì)算的網(wǎng)絡(luò)需要經(jīng)歷兩個(gè)關(guān)鍵步驟線轉(zhuǎn)節(jié)點(diǎn)、線段打斷。也就是把線要素之間的交點(diǎn)、線要素上對(duì)應(yīng)站點(diǎn)的位置全部轉(zhuǎn)成節(jié)點(diǎn)然后把線段切成相鄰節(jié)點(diǎn)之間的邊。這一步用QGIS的“要素轉(zhuǎn)點(diǎn)”加“打斷線相交線”可以做更自動(dòng)化的方案是PostGIS里pgr_createTopology或Python里的shapely配合networkx自己構(gòu)建。構(gòu)建圖模型后能做的事情很多判斷兩個(gè)城市之間是否連通、計(jì)算最短路徑、統(tǒng)計(jì)路網(wǎng)密度、識(shí)別斷頭路。高鐵和地鐵是兩套獨(dú)立系統(tǒng)建模時(shí)建議分開(kāi)建圖再通過(guò)換乘站點(diǎn)建立“換乘邊”連接這樣更貼近真實(shí)出行邏輯。5. 這幾點(diǎn)坑我替你踩過(guò)了剩下的你自己注意5.1 壓縮包校驗(yàn)、中文亂碼、斷線合并解壓這塊最大的坑就是壓縮包損壞。鐵路矢量數(shù)據(jù)普遍上百M(fèi)B從網(wǎng)盤(pán)或FTP下載網(wǎng)絡(luò)波動(dòng)很容易導(dǎo)致數(shù)據(jù)不完整。癥狀是解壓到某一個(gè)圖層的時(shí)候突然報(bào)CRC錯(cuò)誤。別急著罵工具先用7z t測(cè)試一遍壓縮包確認(rèn)是哪個(gè)分卷出了問(wèn)題。如果發(fā)布方做了恢復(fù)記錄可以用7z r嘗試修復(fù)否則老老實(shí)實(shí)重新下載。第二個(gè)坑是中文亂碼。很多老式Shapefile的.dbf屬性表默認(rèn)編碼不是UTF-8在QGIS里打開(kāi)姓名、線路名稱(chēng)可能全是亂碼。解決方法是在加載時(shí)手動(dòng)指定編碼或者在Python里用encoding參數(shù)強(qiáng)制讀取。GeoPackage編碼問(wèn)題少很多這也是我推薦優(yōu)先用GeoPackage的原因之一。第三個(gè)坑是線路斷線。全國(guó)鐵路數(shù)據(jù)會(huì)被行政邊界或圖幅切分成大量小線要素看起來(lái)是同一條線路幾何上卻是幾十段。做網(wǎng)絡(luò)分析前一定要先按線路名稱(chēng)做融合Dissolve否則算出來(lái)的路網(wǎng)密度和連通性全是錯(cuò)的。融合時(shí)注意多部件線要素的處理融合完再用MultiPart to SinglePart拆分確保每條線路一個(gè)要素。5.2 數(shù)據(jù)的新鮮度比壓縮率更重要壓得再小、格式再整齊的數(shù)據(jù)如果發(fā)布后沒(méi)人持續(xù)更新價(jià)值也會(huì)逐漸縮水。鐵路建設(shè)節(jié)奏快2024年的版本反映的是2024年的線網(wǎng)狀態(tài)等到了下一年可能就缺了好幾條新線路。我現(xiàn)在的做法是把這類(lèi)數(shù)據(jù)當(dāng)作“基線底圖”定期維護(hù)一個(gè)本地增量更新層。每有新線路正式運(yùn)營(yíng)就在增量圖層里畫(huà)一筆屬性表記錄開(kāi)通日期和數(shù)據(jù)來(lái)源。項(xiàng)目里使用的時(shí)候基底下沉增量疊加既能追溯到原始版本也不丟最新?tīng)顟B(tài)。另外還是要多嘴一句這類(lèi)社區(qū)整理的開(kāi)源數(shù)據(jù)集整體質(zhì)量適合做趨勢(shì)研判、方案展示和前期分析如果項(xiàng)目用來(lái)做線路設(shè)計(jì)、征地拆遷這類(lèi)精度敏感工作務(wù)必用權(quán)威發(fā)布資料復(fù)核重要節(jié)點(diǎn)最好到實(shí)地核對(duì)。數(shù)據(jù)是工具別被工具帶偏了。我每次處理全國(guó)級(jí)矢量數(shù)據(jù)最后都會(huì)習(xí)慣性留一份“處理記錄”寫(xiě)明坐標(biāo)系怎么轉(zhuǎn)的、哪些字段被清洗過(guò)、斷線有沒(méi)有融合。下次再拿到更新版本時(shí)按同樣流程跑一遍半小時(shí)內(nèi)就能交付一份可用數(shù)據(jù)這種爽感只有被亂數(shù)據(jù)折磨過(guò)的人才懂。本文還有配套的精品資源點(diǎn)擊獲取