资讯动态

2024北京市道路路网Shp矢量数据:从下载到处理的GIS实用手册

发布时间:2026/9/10 15:23:09 来源:尧图企业网站定制
简介2024年最新版北京市道路路网矢量数据集完整覆盖全市各级道路以Shp格式封装面向GIS开发、城市规划、交通出行分析等场景可支撑路网拓扑构建、缓冲区分析、路径规划及电子地图底图制作。数据包含道路等级高速、国道、省道、城市道路等、道路名称等关键属性字段支持按等级、名称快速检索筛选数十万条路段统一于WGS1984地理坐标系可直接与无偏移卫星影像、在线地图套合兼容ArcGIS、QGIS及Python空间分析库。资源包共6个文件涵盖主数据文件、几何索引、属性表、投影坐标定义、字符编码说明并附带Python脚本便于将Shp转换为GeoJSON或完成批量处理整体大小约35.95MB目录简洁、导入即用。已有249人学习下载适合需要现成北京市路网数据开展空间统计、专题制图或二次开发的用户。1. 2024北京市道路路网矢量数据Shp为什么值得下载一次做道路密度分析、城市更新评估、外卖配送时效计算第一步都需要一张口径统一的路网底图。2024北京市道路路网矢量数据Shp之所以容易被反复搜索不在于北京城有多少条路而在于“最新版”三个字意味着车辆绕行测试、物流舱位划分和路网增量比对都要拿它当基准。直接把随便一份老旧道路Shp拖进软件很容易放大后发现新建高速没有缩小后发现中心城区道路全部叠加成黑坨。真正能用上这份数据的人可能是GIS开发、数据分析师也可能在写Arcpy脚本但都要先回答三个问题文件是否完整、坐标系是否正确、属性表里有没有可筛选的道路等级。下面把从下载完成到实际应用之间最容易踩平的环节一次讲清。2. 北京市道路路网Shp的文件骨架从文件配套到坐标系下载目录打开后第一眼往往是几十个后缀不同的同名文件不少人只盯着.shp双击结果属性表是空的、坐标系被软件猜错、中文全部乱码。这些问题的根源都在于Shapefile并不是一个单文件格式而是由多个伴生文件共同构成的。理解这套文件配套后面所有处理才不容易翻车。2.1 一个Shp图层依赖的多个文件缺一个就要出问题Shapefile中最核心的是.shp、.shx、.dbf三个文件实际道路数据还会带.prj、.cpg有时还有用于空间索引的.sbn、.sbx。缺少不同文件带来的后果差异很大文件后缀作用缺失影响.shp要素几何坐标软件直接提示无效数据源.shx几何偏移索引部分库无法打开或打开后几何错乱.dbf属性表道路名称、等级、单双向信息全部丢失.prj坐标系定义被默认当作WGS84出现偏移.cpg属性编码声明中文路名显示为乱码.sbn / .sbx空间索引查询变慢不影响基本读取所以收到压缩包后第一件事是检查文件族是否齐整ls -lh 北京市道路路网2024/ | awk {print $NF}这条命令列出目录内所有文件名。如果只看到.shp和.shx而没有.dbf后续做属性筛选就是空谈如果缺.prj你根本不知道这份数据是经纬度还是投影坐标更谈不上“最新版”能不能直接套用。提示压缩包里的文件修改时间不能作为“最新版”的凭证很多发布源重打包时会刷新时间戳真正可信的是.dbf属性表里的更新时间字段。2.2 判断坐标系CGCS2000投影还是经纬度下载包里通常有一份说明文档没有的话就直接读图层元数据。用GDAL自带的ogrinfo读取坐标系ogrinfo -so 北京市道路路网2024.shp 北京市道路路网2024输出里的Layer SRS WKT是判断坐标系最可靠的依据。北京地区的官方道路数据常见两种情况一种是CGCS2000 / 3-degree Gauss-Kruger CM 116E之类的高斯克吕格投影横纵坐标单位是米另一种是WGS 84或CGCS2000经纬度坐标数值在经度114至117、纬度39至41之间。如果这份Shp是投影坐标而你直接拿默认的WGS84去算距离要素之间的长度单位就变成了度得到的“里程”会是一串无意义的数字。要统计路网里程先转成米制投影坐标要叠加在线遥感影像通常还要再转一次 Web 墨卡托。坐标系判断错误是后续所有偏移现象的源头。2.3 属性字段决定你怎么筛选道路等级用Python读取字段结构比在ArcMap里反复翻属性表快得多import fiona with fiona.open(北京市道路路网2024.shp, r) as src: print(src.schema[properties])这段代码会输出字段名和类型类似{kind: str, name: str, oneway: str, updatetime: str}。不同发布源对道路等级的命名不一致常见的有kind、fclass、road_level、type等。根据经验取值经常是常见字段含义常见取值kind道路类别motorway, trunk, primary, secondaryname路名长安街、德胜门外大街oneway单双向Y / Nupdatetime数据时间20240630确认字段名后可以用Fiona按道路等级批量导出。下面这段代码把高速公路和城市快速路单独存成一份快速路Shpimport fiona from shapely.geometry import shape schema {geometry: LineString, properties: {name: str, kind: str}} with fiona.open(快速路.shp, w, driverESRI Shapefile, schemaschema) as dst: with fiona.open(北京市道路路网2024.shp, r) as src: for feat in src: if feat[properties].get(kind) in (motorway, trunk): dst.write({ geometry: shape(feat[geometry]).__geo_interface__, properties: { name: feat[properties].get(name), kind: feat[properties].get(kind) } })写入前先声明输出的schema保证快速路.shp只有name和kind两个字段。注意原文件如果包含MultiLineString用shape(feat[geometry])转成Shapely对象时不会丢失多部件结构Fiona写回时也能保留。按等级筛选比按路名关键词匹配更稳因为“京藏高速”这种数据经常被写成“G6”、“京藏”、“G6京藏高速”多个版本。3. 下载后先体检验证2024最新版路网不是2022改个名“最新版”很容易变成宣传语。有些下载源把旧数据套一个新时间字段就发布文件名里写2024道路要素一个没变。拿到数据后先做一套可量化的体检确认要素量、里程、属性完整性和坐标系描述都符合预期再进入业务。3.1 用ogr和Python统计要素数、路网里程和数据时标先用一句话命令看全局ogrinfo -al -so 北京市道路路网2024.shp | grep -E Feature Count|Extent输出会给出要素总数和四至范围。北京六环内道路路段通常在几万条量级如果只有几千条说明这份数据要么是抽查样本要么坐标系范围不对。范围如果只有十余公里可能是某个区的局部数据不是全市路网。接着统计总里程和路名覆盖率用Python计算import fiona from shapely.geometry import shape total_len 0.0 name_count 0 with fiona.open(北京市道路路网2024.shp, r) as src: for feat in src: geom shape(feat[geometry]) if geom.geom_type MultiLineString: total_len sum(line.length for line in geom.geoms) else: total_len geom.length if feat[properties].get(name): name_count 1 print(f总里程: {total_len:.2f} 米带路名路段数: {name_count})这段代码先判断多部件线类型再累加长度。如果源坐标系是经纬度这里的长度是度必须先用ogr2ogr -t_srs EPSG:3857转成米制投影再统计。路名覆盖率低于60%后续文字标注很容易缺字不能直接出图。检查完这些指标可以列一张简单的体检表检查项方式合理范围要素数ogrinfo -al -so大于1万条路网范围Extent与北京市行政区范围一致总里程Python统计与官方统计量同一量级路名覆盖率属性非空统计高于60%坐标系WKTogrinfo含CGCS2000或WGS843.2 与上一期数据叠加提取新增和消失道路验证“新版是否更新”最直接的办法是拿上一年的路网做空间差集。Geopandas的overlay是现成工具import geopandas as gpd old gpd.read_file(road_2023.shp).to_crs(EPSG:3857) new gpd.read_file(road_2024.shp).to_crs(EPSG:3857) added new.overlay(old, howdifference) removed old.overlay(new, howdifference) print(新增要素:, len(added), 消失要素:, len(removed))线在覆盖求差时会碎成大量短线所以实际项目中不会直接用线差集的结果。常见做法是先给线做单侧1米的缓冲区再求面积差最后按长度过滤new[geom_buf] new.geometry.buffer(1) old[geom_buf] old.geometry.buffer(1) diff new.overlay(old[[geom_buf]], howdifference) added diff[diff.geometry.length 20]这里的buffer(1)把道路线变成宽度2米的窄面差集结果中落入旧路带内的区域被扣除剩余部分就是疑似新建道路。length 20过滤掉拓扑运算产生的碎屑20米阈值可以根据业务调整。如果新增要素大量集中在某条环路或高速延长线并且与官方发布的重点项目吻合那这份数据基本可以认定是真正的增量更新。3.3 拓扑检查和修复去除重复几何和悬挂点路网数据常见的拓扑问题包括重复几何、自相交、悬挂点。先用Geopandas检查无效几何比例import geopandas as gpd gdf gpd.read_file(road_2024.shp) print(无效几何数:, gdf.geometry.is_valid.sum()) gdf[geometry] gdf.geometry.buffer(0) gdf.to_file(road_2024_clean.shp)buffer(0)是经典的无效几何修复手法Shapely在缓冲距离为0时会对自相交部分做重排能解决大部分“折叠线”问题。如果数据要进入PgRouting或PostGIS网络分析还需要处理悬挂点。QGIS的矢量几何工具菜单里有修复几何GRASS的v.clean也支持rmdangle清理悬挂短枝。处理完后再做一次元素个数对比正常清理后要素量只会小幅下降如果下降超过10%要怀疑是裁剪边界把大量道路截断成碎片了。4. 把路网Shp投入使用的常用操作裁剪、合并、投影和格式转换体检通过后路网Shp开始被用到不同场景。最常见的需求是按行政区裁剪、把多个分区合并、转TXT给路测程序、转KML给外业工具。这些操作不值得在ArcMap里来回点鼠标用GDAL命令行和Python可以做成批处理。4.1 用ogr2ogr按区县边界裁剪路网按海淀区边界裁剪出海淀路网ogr2ogr -t_srs EPSG:3857 -clipsrc 海淀区边界.shp 海淀路网.shp 北京市道路路网2024.shp参数含义很直接-clipsrc指定裁剪边界数据源输入文件放在最后输出文件名写在中间。这里带上-t_srs EPSG:3857是让裁剪与坐标转换一步完成。要注意的是裁剪后边界上会留下大量被切断的短线如果只做展示没问题要做距离分析则需要再按最小长度过滤一次。参数含义-clipsrc按边界数据源裁剪-t_srs输出坐标系-lcoShapefile创建选项-overwrite覆盖已存在输出4.2 合并多个Shp并统一字段结构如果下载的是分区路网先用ogrmerge合并ogrmerge -single -o 合并路网.shp 海淀路网.shp 朝阳路网.shp-single表示所有输入图层合并成一个单一图层不加这个参数会生成一个多图层数据源。需要注意Shapefile的字段名最长10个字符源字段如果叫road_classification合并后会被截断成road_clas。更稳妥的做法是先用Fiona统一字段结构再做拼接。字段统一后合并不仅能减少属性丢失还能避免后续SQL查询时找不到列名。4.3 Shp转TXT导出线节点坐标给路测程序路测和轨迹匹配程序通常只认文本坐标不认GIS格式。写一个Fiona脚本把路网里的每个节点输出成一行import fiona from shapely.geometry import shape with fiona.open(北京市道路路网2024.shp, r) as src: with open(road_points.txt, w) as f: f.write(x,y,name,kind\n) for feat in src: props feat[properties] name (props.get(name) or ).replace(,, ).strip() kind props.get(kind) or geom shape(feat[geometry]) lines geom.geoms if geom.geom_type MultiLineString else [geom] for line in lines: for x, y in line.coords: f.write(f{x},{y},{name},{kind}\n)脚本把MultiLineString拆成多条LineString再逐个写坐标。line.coords是带顺序的坐标对包含线要素的端点。名字里的逗号被替换成空格防止生成的CSV或TXT被拆分错位。如果源坐标系是投影坐标表头建议改成x,y而不是lon,lat避免误导下游程序。4.4 Shp批量转KML外业查看和路线比选外业人员更习惯把路网加载到手机地图里看KML是最省事的载体。批量转换用一行循环for f in *.shp; do out${f%.shp}.kml ogr2ogr -f KML $out $f done循环遍历当前目录所有.shp文件然后逐个输出.kml。KML的坐标系固定是WGS84如果源文件是CGCS2000高斯投影需要加-t_srs EPSG:4326否则生成的KML在Google Earth里会偏出几百米。转换后的KML会保留属性字段中文路名一般能正常显示但早期Google Earth对中文标点兼容性一般最好先抽样打开几个文件目视确认。5. 绕开Shp的坑乱码、偏移、放大丢失要素和缺属性很多人在网上反复搜“shp文件”、“道路shp下载和加载”最后发现不是下载不到数据而是数据一打开就出现各种奇怪现象。下面四个坑最常遇到。5.1 属性表中文乱码的三种修复方法乱码大部分是缺少.cpg文件导致编码声明丢失。常见做法是先指定GBK读取看是否正确export SHAPE_ENCODINGGBK ogrinfo -al 北京市道路路网2024.shp | head -20如果乱码变成正常中文再用ogr2ogr转成UTF-8编码的新Shapefileogr2ogr -lco ENCODINGUTF-8 输出.shp 输入.shp-lco ENCODINGUTF-8会把输出文件的.cpg和.dbf写入UTF-8声明这是最干净的处理方式。如果源文件本身属性已经是乱码先设置SHAPE_ENCODINGGBK读取再转换输出不要直接改.dbf内部字节。5.2 道路整体偏离影像坐标系不匹配路网Shp与在线遥感影像叠加后如果整张图偏移几十米甚至数公里几乎都是坐标系未设置或设置错误。在线底图大多使用Web墨卡托 EPSG:3857而道路Shp可能是CGCS2000经纬度或高斯投影。先确认正确的源坐标系再转换ogr2ogr -t_srs EPSG:4490 路网_cgcs2000.shp 路网.shpEPSG:4490就是CGCS2000经纬度坐标。如果偏移仍然存在检查是不是把投影坐标当成了经纬度坐标投影坐标的x和y都在几十万量级而经纬度坐标在39或116量级。看到明显量级异常就不要继续叠加先把坐标系定义修正。5.3 ArcGIS里缩小能显示、放大却消失的图层范围设置这个现象常被误认为是数据损坏。放大后要素消失多数是因为图层被设置了可见比例范围。ArcMap中右键图层打开属性切到“常规”选项卡找到“缩放时显示”区取消“超出范围不再显示”的勾选即可。ArcGIS Pro里同样在图层的“范围”设置中调整滑块或者直接点击“匹配图层范围”。如果取消后仍然丢失检查是否设置了定义查询SQL条件过滤掉了部分路段。再有可能是符号系统里使用了“比例相关”的线宽极细线在放大后被符号级别设置隐藏这种情况在图层符号选择器的“比例范围”中处理。5.4 只有路网线没有路名时怎么补属性有些路网Shp只给了几何不包含路名字段。可以在有路名的参考资料上做空间关联。用PostGIS做一小段距离内的属性回填UPDATE road_2024 r SET name o.name FROM road_with_name o WHERE r.name IS NULL AND ST_DWithin( ST_Transform(r.geom, 3857), ST_Transform(o.geom, 3857), 2 );ST_DWithin计算两个几何在投影坐标系下的距离2米表示两条道路中心线几乎重叠时才匹配。如果多条参考道路重叠在同一条路上更新结果可能不稳定需要先按最近距离做去重。这个操作特别适合用来补齐路名但补完后还要检查是否有错名毕竟重叠共线路段常跨越多条道路。6. 进阶把北京市道路路网Shp压成矢量3D Tiles路网在三维地图里通常不是直接显示线而是要变成有厚度的立体路带。Cesium里加载3D Tiles需要先把Shp转成带三维几何的要素。6.1 给线路加缓冲区再拉伸成体先给道路线建立缓冲区让“线”变成“面”再通过SFCGAL扩展拉伸成体。执行SQL前确保数据库开启了postgis_sfcgal扩展CREATE EXTENSION IF NOT EXISTS postgis_sfcgal; CREATE TABLE road_3d AS SELECT ST_Transform( ST_Extrude( ST_Buffer( ST_Transform((ST_Dump(geom)).geom, 3857), 3 ), 0, 0, 2 ), 4326 ) AS geom, name FROM road_2024_clean;这段SQL先ST_Dump拆开多部件线ST_Transform(..., 3857)转成Web墨卡托米制坐标ST_Buffer(..., 3)生成单侧3米的路带ST_Extrude(..., 0, 0, 2)沿Z轴拉伸2米最后转回4326经纬度。这里的Z值按相对高度处理不做大地水准面转换对道路展示足够。如果PostGIS编译时没有SFCGAL可以退一步只生成三维面ST_Force3D(ST_Buffer(ST_Transform((ST_Dump(geom)).geom, 3857), 3))生成的面在三维场景里只有底面但配上光照也能呈现道路带。6.2 用pg2b3dm导出tileset并在浏览器验证典型转换工具pg2b3dm直接读取PostGIS表命令行类似pg2b3dm -h localhost -U postgres -d beijing_gis -t road_3d -c geom --output ./road_3dtiles参数依次是数据库主机、用户、数据库名、表名和几何列名。输出目录里会生成tileset.json和若干.b3dm瓦片。验证时打开浏览器开发工具看tileset.json请求是否返回200再检查boundingVolume范围与北京路网范围是否一致。Cesium里加载的核心代码只有一段const tileset viewer.scene.primitives.add( new Cesium.Cesium3DTileset({ url: http://localhost:8080/road_3dtiles/tileset.json }) ); viewer.zoomTo(tileset);如果瓦片位置偏到海里多数是在PostGIS表导出时没有把几何转成EPSG:4326如果路带拉伸高度消失检查ST_Extrude是否真的产生了三维几何可以用ST_Zmin和ST_Zmax做单要素抽查。这一步跑通之后整个北京市道路路网就不再只是桌面GIS里的一条线而是可以随三维场景缩放的正式发布图层。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价