
简介2025年全国34个省市自治区道路数据基于OpenStreetMap开源数据深度加工下载时间2025年1月面向GIS开发、城市规划、交通分析等领域人员适用于路网制图、空间统计、路径规划等场景。压缩包共71个文件大小约212MB核心为标准shapefile格式shp/dbf/shx/prj并配套mxd工程文件可在ArcGIS中直接打开和编辑属性字段包含道路类型、分类标准等信息坐标为WGS1984。由于全国数据总量超过8GB上传包内先行提供山东省完整道路数据其余省份可通过txt中百度网盘链接下载同时附带中国行政区、九段线等基础地理矢量文件便于叠加参考。已有77人学习。无论做专题制图、路网分析还是作为研究底图这套整理好的数据都能减少数据清洗和格式转换的时间让项目快速启动。1. 一份能直接用的全国路网从OSM到shapefile的再加工打开压缩包里面不是只有一堆shp还有mxd、dbf、cpg甚至夹杂着网盘上传残留的.baiduyun.uploading.cfg文件。这套数据取材自OpenStreetMap在2025年1月5日的导出经过深度加工后变成以省为单位命名的标准shape文件坐标统一为WGS1984并保留了道路类型、道路名称、单行道、限速等关键属性。随包提供的2025年全国【34个省市自治区】道路数据.mxd可以直接用ArcGIS打开省去重新配图层的步骤。适合GIS开发、交通规划、物流路径分析的人尤其是需要全国路网底图做算法验证的工程师。注意完整数据超过8G当前上传包默认放的是山东省样例其余省份需通过txt中的百度网盘链接自行下载。2. 道路shapefile的属性、坐标系与mxd工程组织方式在动手处理数据之前先要理解这套文件的组织逻辑。shapefile从来不是单个文件而是一组配套文件的集合mxd则是ArcGIS的工程文件记录图层顺序、符号和路径。两者混淆后续排查会非常费力。2.1 先分清shapefile的文件族一个可用的shapefile至少包含四个文件.shp存几何坐标.shx存几何索引.dbf存属性表.prj存坐标系。.cpg文件可选用来标记属性表的编码字符集。以山东省为例山东省.shp、山东省.shx、山东省.dbf、山东省.cpg、山东省.prj五个文件放在一起才构成一套完整的要素类。压缩包里出现的山东省.shp.baiduyun.uploading.cfg和山东省.dbf.baiduyun.uploading.cfg是百度网盘客户端在上传时生成的残留文件不影响实际数据。批量扫描时建议用文件扩展名过滤掉.cfg否则glob会把这些没有几何内容的文件也读进来造成读取失败。2.1.1 用GDAL确认编码和字段结构如果打开dbf属性表发现中文路名乱码多半是.cpg文件缺失。在装有GDAL的机器上可以直接执行ogrinfo -ro -al 山东省.shp | head -20ogrinfo会输出数据源路径、几何类型、投影信息和字段列表。如果输出里没有Name或name字段说明这个文件不是道路要素可能是边界辅助数据。也可以用Python的pyshp读取import shapefile # 读取山东省道路shp打印编码和字段名 sf shapefile.Reader(山东省.shp) print(sf.encoding) print(sf.fields)sf.encoding来自.cpg文件如果没有该文件一般需要手动尝试GBK或UTF-8。2.2 道路属性字段如何从OSM标签转化而来OSM原始道路数据中的标签非常多一条道路可以有几十个键值对。这套资源的核心价值是把highway、name、oneway、maxspeed等关键标签提取出来转成扁平化的字段并做了道路分类加工。下表是常见的字段对应关系shapefile字段OSM标签含义示例namename道路名称经十路highwayhighwayOSM原始道路类型motorway / residentialroad_class加工生成综合分类高速、国道、省道refref路线编号G2 / S102onewayoneway单行方向yes / no / -1maxspeedmaxspeed限速80bridgebridge是否桥梁yes / notunneltunnel是否隧道yes / no注意road_class这类加工字段在不同省份可能叫type或level合并前需要统一。常见做法是保留highway原始值用映射表在代码中转换# 将OSM的highway值映射为中文道路等级 highway_map { motorway: 高速公路, trunk: 国道, primary: 主要道路, secondary: 次要道路, } gdf[road_name] gdf[highway].map(highway_map)这里用map方法做一对一替换。如果highway里有映射表之外的取值替换结果会是NaN需要在实际处理时决定是丢弃还是归到“其他”。2.3 WGS1984坐标系与投影转换数据统一使用WGS1984地理坐标系也就是GPS直接输出的经纬度坐标。这个坐标系适合全国范围拼接但经纬度不是等距单位直接量算距离和面积会产生严重误导。比如在北纬35度附近1经度对应约91公里而在赤道则是111公里。因此做缓冲区、密度分析前必须投影到目标区域适合的投影坐标系。查看当前坐标系用GeoPandasimport geopandas as gpd # 读取道路shp并打印坐标系 gdf gpd.read_file(山东省.shp) print(gdf.crs)输出为EPSG:4326。如果要转成Web墨卡托可以执行gdf gdf.to_crs(epsg3857)适合前端地图叠加。中国区域内做面积、长度统计常用的是Albers等积投影或CGCS2000分带投影。下表列出几个关键EPSG坐标系EPSG适用场景WGS19844326原数据全球叠加Web墨卡托3857Web地图切片WGS 1984 Web Mercator Auxiliary Sphere3857Leaflet/MapboxCGCS2000 3度带4513-4519省市级精确分析to_crs()生成的是新坐标系的副本不会修改原文件确认无误后再另存为shp。2.4 mxd工程文件的价值与路径坑2025年全国【34个省市自治区】道路数据.mxd打开后应该是一张叠加了行政区划、九段线和道路的全国图。mxd内部保存的是每个图层的绝对路径这带来一个典型问题压缩包一旦移动目录重新打开时图层会出现红色感叹号数据源失效。修复方式是逐个图层重新指定shp或者用ArcPy批量替换路径这一操作会在最后一章给出具体代码。3. 处理34省道路数据的实战读取、筛选与批量合并有了前面的基础现在把山东省作为样例跑通流程再扩展到全国34个省级行政区的合并操作。3.1 用GeoPandas读取并校验数据质量读取shp的常规写法是import geopandas as gpd shp ./山东省/山东省.shp gdf gpd.read_file(shp) print(gdf.shape) print(gdf.crs) print(gdf.columns.tolist()) print(gdf[highway].value_counts().head(5))第一个shape输出(要素数, 字段数)。这里的要素是道路段OSM数据中一条长道路会被交叉口切成多段所以要素数量不等于道路数量。第二个crs用于确认坐标系第三个列出全部字段第四个输出highway的前五类数量。如果residential占比过高说明数据偏城区如果motorway数量为0则说明提取时可能做了过滤。全国8G数据一次性用read_file读入在16G内存的机器上很容易卡死。常见做法是用pyogrio只读取前N行验证结构import pyogrio # 只读取前10000行检查字段和几何类型 gdf_small pyogrio.read_dataframe(山东省.shp, rows10000) print(gdf_small.head())rows参数指定读取行数读取速度比GeoPandas默认的GDAL循环快不少适合做大规模数据调研。3.2 在ArcGIS中打开mxd并检查图层双击mxd启动ArcMap如果出现红色感叹号说明数据源路径失效。打开图层属性-源能看到这条数据来自哪个shp。右键图层通过“数据源”重新指向本地shp即可。为了避免这种问题我一般会把mxd放在整个数据包的根目录所有道路shp按省市分文件夹存放这样mxd的相对路径更稳定。换电脑时整个目录一起拷贝大多能自动恢复。也可以用下面的ArcPy脚本列出所有图层的数据源import arcpy mxd_path 2025年全国【34个省市自治区】道路数据.mxd mxd arcpy.mapping.MapDocument(mxd_path) for lyr in arcpy.mapping.ListLayers(mxd): if lyr.supports(DATASOURCE): print(lyr.name, lyr.dataSource)这段代码输出每个图层的名字和shp路径。supports(DATASOURCE)用来过滤没有数据源的图层比如纯制图分组。3.3 按道路类型筛选目标路网在ArcGIS里图层属性-定义查询中输入highway motorway可以只显示高速公路。QGIS中的表达式写法相同。筛选多个类型时用IN更高效highway IN (motorway, trunk)用Python导出子集时代码更灵活# 筛选高速和国道并导出为新的shapefile motorways gdf[gdf[highway].isin([motorway, trunk])] motorways motorways[[name, highway, ref, geometry]] motorways.to_file(高速_国道.shp, encodingutf-8)这里先用isin选中两类道路再提取必要字段写出时指定encodingutf-8避免在ArcMap中以GBK方式打开乱码。如果在ArcToolbox中处理可以在环境选项里把编码设为“系统ANSI”。3.4 批量合并34省道路数据的完整脚本所有省份的shp文件名和目录结构比较一致可以用glob一次性收集。合并前要做三件事过滤网盘残留文件、统一字段名、丢弃无几何要素。下面是一段可复用的脚本import glob import geopandas as gpd import pandas as pd files glob.glob(./各省数据/*/道路/*.shp) frames [] for f in files: try: g gpd.read_file(f, encodingutf-8) # 统一字段名为小写避免concat后出现多个相似列 g.columns [c.lower() for c in g.columns] if geometry not in g.columns: print(f{f} 缺少几何列跳过) continue frames.append(g) except Exception as e: print(f读取失败 {f}: {e}) raw pd.concat(frames, ignore_indexTrue) print(raw.shape)glob的路径模式需要根据实际解压目录调整。encodingutf-8假设所有省的文件都用UTF-8编码如果有乱码则改回gbk试一次。g.columns统一转小写避免不同省份一个叫Name一个叫name导致concat后变成两列。pd.concat合并后如果某个省份多了字段其他省份会自动补为NaN。合并之后建议做一轮几何有效性检查# 合并后清理空几何和自相交问题 raw raw[raw.geometry.notna()] raw raw.buffer(0) print(raw.is_valid.all()) print(raw[highway].isna().sum()) print(len(raw))buffer(0)是修复线自相交的常见方法。如果is_valid.all()返回False可以用raw.loc[~raw.is_valid]定位问题要素再针对性地修复。在批量合并过程中最容易翻车的几个点整理成一张排查表异常现象原因处理方式某些文件读取失败.shp配套文件缺失或多个shp混在一起用ogrinfo确认文件是否有效删除损坏项合并后关键字段为空不同省份字段名不一致统一列名并手动检查高null字段中文路名乱码dbf编码信息丢失切换encodingutf-8与gbk内存占满全国8G数据全量加载分块读取按批次写出gdb或parquet至此全国道路数据已经合并成一张完整的表下一步是让数据在ArcGIS中“画”得好看并验证结果是否可用。4. 用Python和ArcGIS把全国路网“画”规范样式调整与出图验证技巧这一章只讲两个生产中一定会用到的落地技巧一是通过符号化让路网分级显示二是用脚本修复mxd路径并验证数据。4.1 用唯一值符号化道路等级在ArcMap的mxd中右键道路图层选择图层属性-符号系统-类别-唯一值值字段选highway或road_class。建议把motorway设置成1.5pt红色实线trunk设置成1.2pt橙色primary用0.8pt黄色其他低等级道路统一用0.4pt灰色。这样出图后能一眼分出全国路网骨架。这套样式如果要在多个省份间复用可以把图层另存为.lyr文件然后对每个省单独加载。QGIS用户可以保存为.qml用“加载样式”一键应用。4.2 用ArcPy批量替换mxd中的绝对路径mxd中的绝对路径是整个数据包迁移时最大的坑。下面的代码可以把所有图层的数据源从旧盘符切换到新盘符import arcpy, os old_root rD:\data\2025_chn_roads new_root rE:\projects\2025_chn_roads # 遍历需要修复的mxd文件 for mxd_file in [山东省.mxd, 全国.mxd]: mxd arcpy.mapping.MapDocument(mxd_file) for lyr in arcpy.mapping.ListLayers(mxd): if lyr.supports(DATASOURCE): src lyr.dataSource if src.startswith(old_root): new_src src.replace(old_root, new_root) try: # 替换数据源第二个参数必须是SHAPEFILE_WORKSPACE lyr.replaceDataSource( os.path.dirname(new_src), SHAPEFILE_WORKSPACE, os.path.basename(new_src) ) except Exception as e: print(f替换失败 {lyr.name}: {e}) mxd.save()replaceDataSource的三个关键参数分别是新工作空间目录、工作空间类型和文件名。只替换整个目录时务必保持shp文件名不变否则无法准确匹配。4.3 验证合并结果是否覆盖全国合并完成后用三个指标快速判断数据是否可用print(raw.is_valid.all()) print(raw[highway].isna().sum()) print(raw.total_bounds)第一个指标验证几何拓扑第二个统计道路类型缺失数第三个返回数据的外包矩形范围。协调世界时中国陆地的经纬度范围大约为东经73至135度、北纬18至54度。如果total_bounds的数值落在这个范围内基本说明全国路网覆盖完整。最后再补一个实用技巧合并后的全国道路数据想要发布到Web端可以先转成GeoJSON再用tippecanoe切片。但因为WGS1984经纬度在Web墨卡托下会有拉伸发布前务必用gdf.to_crs(epsg3857)做一次投影转换否则在高纬度地区会出现道路错位。本文还有配套的精品资源点击获取