
簡介北京城區道路矢量數據包提供主城區精細化道路網絡Shapefile數據適合GIS開發、規劃與地圖制圖人員直接使用。數據覆蓋主干道、次干道、支路及部分街巷坐標系為WGS84或CGCS2000以.prj為準屬性含道路名稱、等級、方向、車道數等基礎信息可無縫導入ArcGIS、QGIS、SuperMap等平臺進行疊加分析、拓撲編輯與可視化出圖。壓縮包共22個文件、約8.08MB包括.shp、.shx、.dbf、.prj、.cpg、.sbn、.sbx及.shp.xml等完整Shapefile組件并附有道路預覽圖、Python輔助腳本和說明文件便于快速核驗數據范圍與批量處理。目前已有66人學習下載適用于交通規劃、路徑分析、城市建模等場景免去從零采集、配準與格式轉換的繁瑣流程拿到即可投入項目使用。 做城市交通分析、寫前端可視化demo最常找的就是道路矢量數據尤其是拿一個現成的城區道路矢量包直接開工比從OSM上下載、裁剪、校正、清洗要省太多時間。這次我整理的是北京城區道路矢量數據包包含Shapefile全套文件屬于那種典型的拿到就能用的GIS數據資源。你可能會覺得道路數據到處都是但真到項目里就會發現全國級別的路網太粗街道級別的手工矢量化又累到懷疑人生。這篇博文不賣關子直接講清楚這份數據包里裝了什么、用QGIS和ArcGIS怎么打開、以及我在實戰中遇到過的三個最典型的坑希望幫你少走彎路。1. 找一份能用的城區道路數據為什么這么難1.1 我們真正需要的路網數據長什么樣在做可達性分析、路網密度評估、地圖標注項目時需要的道路數據至少要滿足三個條件范圍聚焦到城市內部不用帶著全國幾十萬公里的低分辨率線屬性里有道路等級、名稱這樣的基礎字段能分類渲染也為后續分析留個底坐標系相對標準至少能被QGIS或ArcGIS正確識別跟在線底圖疊加時不至于偏到隔壁街區。這三條看似簡單放到真實數據獲取場景里卻往往一條都不沾邊。1.2 現成數據的三大尷尬先說全國級公開道路數據的問題。這類數據覆蓋廣但到城市里基本只剩下高速和幾條主干道城中村、支路、內部路完全缺失。對于北京城區這種粒度打開一看全是斷頭路和網格狀的粗線條做不了細致分析。第二個尷尬是坐標系混用。同一張圖里有些數據是WGS84經緯度有些是GCJ-02也就是俗稱的火星坐標有些還是投影坐標你把它疊加到在線底圖上肉眼看到的就是道路懸空、錯位幾十米。這種情況排查起來非常費時間因為問題往往不在數據本身而是缺少正確的.prj信息。第三個尷尬是屬性字段過于環保。數據里只有幾何線條沒有名稱、沒有等級想快速渲染一個快速路紅色、主干道橙色、支路灰色的圖例都沒辦法。CSV表里好歹還有ID你拿到的路網可能連ID都沒有。所以有人寧可自己從遙感影像上重新數字化一小塊區域也不想去清理一份大而全的爛數據。1.3 這份數據包能幫你省掉哪部分工作所以我平時找數據會優先找像北京城區道路這樣的矢量數據包范圍已經切到城區道路要素相對完整附帶Shapefile全套文件。拿到之后最該感謝的不是那根彎彎曲曲的線而是背后已經做好的坐標對齊和屬性分層這恰好是DIY數據時最耗時、最瑣碎的兩個環節。它不能替代你的業務分析但能讓你在十分鐘內把精力從清數據切換到做分析省下的那幾天時間足夠你做完兩版方案了。2. 打開壓縮包前先弄懂Shapefile文件組2.1 缺一不可的三個主文件很多第一次接觸的人會誤以為Shapefile就是一個.shp文件其實它是一整套文件組。最低限度得有三個文件同時存在否則任何GIS軟件都無法正常打開.shp記錄要素的幾何形狀線、面、點的坐標全在這里。.shx形狀索引記錄每個幾何對象在.shp里的位置相當于書的目錄頁。.dbf要素屬性表一行對應一條要素道路名稱、等級、長度都放在這。這三個文件是三位一體的。有人圖省事只拷貝了其中的.shp給別人對方打開就是無法讀取看似玄學其實就是缺了另外兩個。我建議分發數據時別只發一個壓縮包了事至少把.shp、.shx、.dbf三個主文件放在同一個文件夾再打包上傳。2.2 那些可選的輔助文件到底管什么除了三個主文件Shapefile還會有不少輔助文件大家看到一長串同名文件不要慌.prj坐標系定義。這是我最先檢查的文件它能告訴你數據用的是WGS84、CGCS2000還是別的坐標系底圖偏移的坑有一半跟它有關。.cpg字符編碼聲明。dbf屬性表里的中文能否正確顯示就看它是否寫了UTF-8或GBK。沒有這個文件亂碼概率直線上升。.sbn / .sbx空間索引一般由ArcGIS生成查詢速度快一些缺失不影響打開。.shp.xml元數據文件記錄了數據來源、更新時間等信息QGIS和ArcGIS都能讀。.qix部分軟件用的四叉樹索引可忽略。我用一張表給你列出來哪些必須有、哪些可以不管文件后綴作用缺失后果.shp幾何坐標無法打開.shx幾何索引無法打開或讀取緩慢.dbf屬性數據無法打開幾何和屬性斷鏈.prj坐標系定義軟件按默認坐標系處理可能整體偏移.cpg字符編碼中文屬性可能亂碼.sbn / .sbx空間索引無影響.shp.xml元數據無影響如果你收到的壓縮包缺少.prj趕緊先手動判斷坐標系如果缺少.cpg中文屬性亂碼時優先懷疑它。這兩點下面會展開講。2.3 為什么一個道路要素被拆成那么多文件這點經常被剛入門的同學問到。之所以不做一個單一文件是因為Shapefile是在上世紀90年代形成的格式標準當時為了兼容不同軟件把幾何、索引、屬性分開存儲。好處是GIS軟件可以按需讀取要畫圖就只讀.shp要做屬性查詢就只讀.dbf。代價是文件一多就容易搞丟而且.dbf沿用了老式dBASE格式字段名最長只有10個字符。所以你在屬性表里看到的classnamelength這種簡潔字段名不是設計者懶是格式上限擺在那里。如果覺得文件組管理麻煩我個人會順手把數據轉成GeoPackage或GeoJSON再分發單文件一個搞定也算是對Shapefile老格式的一種現代化補充。但作為通用交付格式Shapefile仍然是大多數建模軟件和平臺默認支持的老大哥所以收到一整套Shapefile時先檢查再使用就好。3. 數據包內容解剖幾何、字段與坐標系3.1 要素類型與道路分級邏輯這份北京城區道路數據核心要素是道路中心線也就是用一系列線段表達每條道路的空間走向。中心線本身沒有寬度但在路網分析里它是最方便的形式路徑規劃、拓撲分析、長度統計全部基于它。道路等級是這類數據最關鍵的分層邏輯通常會區分快速路、主干道、次干道、支路有的還會區分內部路、步行道等。道路分級為什么重要因為級別本質上是道路功能與通行能力的壓縮表達。在做路網密度分析時如果不區分等級直接把所有線加在一起支路和高速同為一條線結果毫無意義。在做路徑規劃時不同等級通常對應著不同的通行速度權重快速路可以給較高的速度支路則要保守一些。拿到數據后先看一眼等級字段的取值分布能省掉后面大量清洗工作。3.2 屬性字段的設計思路打開屬性表你會看到每個要素一行記錄典型字段包括name道路名稱比如長安街北四環中路有些數據還會把別名一起維護。class / type / kind道路等級。不同來源常用的字段名不一樣看取值分布就能猜出大概。length幾何長度。如果用的是經緯度坐標這個長度單位是度要先投影到米制坐標系再統計才靠譜。id每個要素的唯一編號做關聯和調試時很有用。有的版本還會帶oneway單行線、speed限速、bridge是否橋梁等字段。字段命名不一樣很正常這跟生產方使用的源數據有關。我建議拿到數據后先執行一行print(gdf.head())或直接看屬性表把各字段的口徑摸一遍別急著分析否則字段定義搞錯統計結果就全錯了。舉例來說有的數據用中文表頭道路等級而不是class雖然QGIS里看沒問題但對后續Python腳本不友好處理時順手改一下就行。3.3 坐標系和投影決定了它能不能跟底圖對齊坐標系是這個數據包里面最需要較真的部分。常見情況有兩種一種是WGS84或CGCS2000地理坐標系單位是度直接用QGIS打開沒問題跟在線瓦片底圖疊加時只要開啟動態重投影即可另一種是北京本地或全國范圍的投影坐標系單位是米適合做面積、長度計算但跟在線底圖疊加時要先統一到同一套坐標系。這里有個比較隱秘的問題如果你這份數據是通過互聯網地圖抓取或處理得到的坐標可能是GCJ-02加密坐標。它跟公開GPS坐標相差幾十到幾百米直接用會導致路網和建筑底圖錯位。判斷方法很簡單把數據疊加到WGS84底圖上如果整體偏移非常均勻且明顯而單獨看數據本身又是連續的那基本就是坐標系不統一不是數據損壞。這種情況下需要用成熟的坐標轉換庫做逐點糾偏再統一輸出新文件。4. QGIS和ArcGIS里的加載與可視化實操4.1 在QGIS里加載并做分級渲染QGIS加載Shapefile非常簡單打開軟件直接把.shp文件拖進圖層窗口或者用圖層→添加圖層→添加矢量圖層選擇文件。加載完建議先雙擊圖層名打開屬性窗口看源選項卡里顯示的坐標系是否跟.prj一致再看一下要素數量確認不是空圖層。默認樣式只能顯示一層灰色線如果你希望按道路等級分類右鍵圖層→屬性→符號化選擇分類Categorized值選等級字段點擊分類按鈕QGIS會自動給每個級別分配顏色。然后手動調整色帶快速路用深紅、主干道用橙黃、支路用淺灰一張能放進報告里的道路分級圖就出來了。4.2 在ArcGIS里定義投影和查詢統計ArcGIS用戶的操作略有不同。在目錄面板里連接文件所在文件夾把.shp拖入地圖窗口即可。如果圖層右鍵屬性里源選項卡的坐標系顯示為未知或不正確可以在數據管理工具→投影和變換→定義投影里手動指定正確的坐標系并生成一個帶正確.prj的新文件。查詢統計方面ArcGIS Pro可以直接右鍵圖層→屬性表按等級字段做分組統計也可以打開分析工具→統計工具→頻數生成每個等級的道路條數和長度匯總。這個功能最適合快速摸清數據底子。4.3 一條命令統計各等級道路長度如果你習慣用PythonGeoPandas是我最推薦的路網處理方式幾行代碼就能把數據情況摸清import geopandas as gpd gdf gpd.read_file(beijing_road.shp, encodingutf-8) print(gdf.head()) print(gdf[class].value_counts())要統計不同等級道路總長度先判斷坐標系。如果是經緯度先投影到適合北京的米制坐標系再計算。北京經度大約在116度附近UTM 50N的覆蓋范圍是114度到120度正好合適gdf_metric gdf.to_crs(EPSG:32650) # WGS84 UTM 50N gdf_metric[length_km] gdf_metric.geometry.length / 1000 print(gdf_metric.groupby(class)[length_km].sum().sort_values(ascendingFalse))注意這里用哪個UTM分帶要以數據的實際覆蓋范圍為準如果數據橫跨多個分帶建議轉成全國統一的分帶投影再做統計。這個統計結果可以直接支撐報告里的路網規模對比也能作為后續可達性分析的基礎輸入。5. 踩過的三個坑亂碼、空白圖層、整體偏移5.1 屬性表中文亂碼的定位與修復第一次打開數據包有朋友反饋屬性表里中文全變成了問號。這種亂碼大多是編碼不一致導致的。dbf屬性表在Windows舊環境里常見GBK編碼而QGIS在沒有.cpg文件時默認按UTF-8讀取于是中文就亂掉。排查思路分三步先看壓縮包里有沒有.cpg文件里面寫的是UTF-8還是GBK再看屬性表的實際編碼可以在QGIS圖層屬性→源→數據源編碼里嘗試改為GBK或GB2312如果顯示正常說明就是編碼設置問題最后若確實沒有.cpg我建議用ogr2ogr把文件轉成干凈版本ogr2ogr -f ESRI Shapefile beijing_road_utf8.shp beijing_road.shp -lco ENCODINGUTF-8命令行執行后重新加載亂碼問題基本就沒了。這個坑不算深但一旦碰上一個下午的時間可能就這么耗進去。5.2 圖層加載后不顯示的排查鏈路另一個讓我抓狂過的問題是文件加載成功了但地圖窗口空白一片數據線看不見。一次是因為只拿到了一個.shp文件.shx和.dbf缺失軟件雖然沒直接報錯卻無法讀取有效幾何另一次是因為坐標系識別錯誤導致圖層被定位到了完全無關的區域。我的排查順序是這樣先看圖層屬性→源→要素范圍如果范圍數值明顯離譜基本就是坐標系問題如果范圍正常但畫面仍空白檢查是不是矢量幾何為空或損壞可以用修復幾何工具處理如果一切正常就按CtrlShiftD縮放到全圖范圍。還有一種情況是道路數據本身沒問題但當前你給圖層設置的符號顏色在底圖上看不清把線粗設到1mm再刷新一下往往就消失了。5.3 疊加在線底圖時整體偏移的處理如果你把數據疊加到在線地圖上發現道路整體向某個方向平移了幾十到幾百米而且偏移量在整個城區范圍內都很均勻那大概率不是數據損壞而是坐標系不一致。WGS84和GCJ-02之間大約有幾十到幾百米的偏差肉眼能分辨出來。處理上先看.prj確認當前坐標系再把底圖也統一到一個標準下如果數據是WGS84底圖也用WGS84如果數據是GCJ-02需要通過坐標轉換把每個點糾偏到WGS84再輸出為新Shapefile。轉換時不要自己在代碼里手工加固定偏移不同區域偏移量是有差別的要使用成熟的坐標轉換方法。糾偏完成后再疊加一次偏差基本就消失了。6. 我的數據預處理習慣和后續擴展思路6.1 拿到數據后我會先做的三件事第一件事備份原包。展開字段分析和坐標轉換前先復制原始壓縮包避免后續操作把原始文件改壞了又沒法恢復。第二件事統一用Python讀取一次生成一個數據體檢報告要素條數、字段列表、坐標系、幾何類型、范圍、等級分布記錄在項目readme里寫代碼時能少踩一堆空值和類型坑。第三件事把坐標系統一到項目主坐標系。近兩年的項目我一般定成CGCS2000經緯度發布到Web端再轉WGS84做長度統計時再投影到UTM這種存地理、算投影的做法比較省心。這三件事做完路網數據才算可用狀態。很多人拿到一份數據就直接做分析結果分析做到一半發現數據范圍缺了某塊城區或者屬性里有一半道路沒有等級只能回頭補數據。預先體檢雖然多花二十分鐘但后面省的時間絕對不止二十分鐘。6.2 把路網數據用起來的幾個方向處理好的路網數據用處比想象中廣。最基礎的是出圖分級渲染后疊加上POI、建筑輪廓或者小區分布就是一張挺有說服力的專題圖。進階一點可以把它放進PostGIS用PostGIS的路徑規劃擴展做最短路徑、服務區分析特別適合做配送范圍、應急響應一類的場景。再往后你可以基于這一份路網結合路況數據或移動軌跡數據計算擁堵指數、做干線通行效率對比這就屬于交通大數據分析的正規玩法了。前端展示的話我會把Shapefile轉成GeoJSON再交給Leaflet或MapLibre渲染文件體積小、瀏覽器解析快。轉換工具最簡單的是QGIS右鍵導出也可以用GeoPandas的to_file方法gdf_4326 gdf.to_crs(EPSG:4326) gdf_4326.to_file(beijing_road.geojson, driverGeoJSON)這樣前端只要加載一個GeoJSON文件就能在地圖上交互展示道路等級和名稱了。如果只是做一個靜態匯報頁面這個方案比在線瓦片服務輕量得多。最后再提醒一句數據版權這種事平時沒人管項目上線被追起來非常麻煩。像這種道路矢量包如果是個人學習和研究用基本沒問題真要用于商業項目最好確認來源授權或者從開放數據平臺同步一份可商用版本。我自己現在維護數據的習慣是每一次工程都記錄數據來源、坐標系、清洗日期和版本號寧可多寫一行說明也不要過半年回來自己看不懂。這套操作看起來不起眼但在項目交底和后期維護時要少跟人解釋無數遍。本文還有配套的精品資源點擊獲取