简介:内蒙古自治区道路数据最新分级精确到乡道矢量数据,面向GIS开发、城乡规划、交通路网分析等场景,提供一套可作为基础底图的道路数据集。资源共含16种道路矢量图层,覆盖城市一级至四级道路,以及高速、国道、省道、县道、乡道等行政等级道路,同时纳入OSM来源的铁路与道路分类数据,可满足多尺度制图、路径规划、数据比对等用途。压缩包整体约39.26MB,以矢量图层及属性数据为主,按道路类别组织,便于按需调用。目前已有216人学习下载,适合需要精细路网资料的从业者与研究者。通过对比不同来源的道路分级,既能发现重复标注,也可相互补充,是考究路网现状、验证拓扑关系的一份实用资料。
1. 这套内蒙古道路交通数据,解决的是一张图看懂全境路网
做国土空间规划或者交通现状分析的人,大概率遇到过这种尴尬:好不容易要到一份内蒙古全区的路网数据,打开一看国道、省道还算完整,到了县道就开始缺胳膊少腿,乡镇层面的路直接断成碎片。项目汇报时领导问“这个嘎查到底通没通公路”,你盯着屏幕翻来翻去也答不上来。这份“内蒙古自治区道路数据最新分级精确到乡道矢量数据.rar”,核心就是把路网粒度下沉到了乡道这一级,把国道、省道、县道、乡道以及部分村道按行政等级拆清楚、打包好,拿来就能做图层叠加、缓冲区分析或者出图底图。适合正在接内蒙古区域项目的规划院、做农牧区通达性研究的机构,以及需要一套完整道路骨架做SWAT或其它小流域分析前置数据的人。不是用来“看一眼地图”的,是直接进 ArcGIS 或 QGIS 干活用的。
这类数据拿到手,真正的难点不在解压和打开,而在“怎么确认它真的能用”:坐标系是不是 CGCS2000、等级字段里的值是国标还是地方习惯、乡道有没有拓扑错误。后面这些才是坑,也是这篇要讲清楚的东西。
2. 道路分级体系与乡道判定:拿到数据先确认这几点
2.1 道路行政等级与代码:先搞清楚你手里的是哪一路网
中国公路的行政等级是有国标的,数据里“精确到乡道”这句话是否成立,首先要看它的等级字段能不能对上这套体系。按《公路路线标识规则和国道编号》的框架,道路自上而下分为国道、省道、县道、乡道,再往下还有村道和专用公路,行业内通常用拼音首字母当代码:G、S、X、Y,以及 C(村道)和 Z(专用公路)。内蒙古的特殊性在于地广人稀,很多乡道实际承担着村与村之间的主通道功能,等级代码和路面宽度经常不匹配,所以不能单看线宽猜等级。
拿到数据后第一件事不是画图,而是打开属性表,看里面到底有没有等级字段,字段名叫什么。常见命名有“GB_CODE”“ROAD_CLASS”“TECH_GRADE”或者中文“道路等级”,值可能是 G/S/X/Y,也可能是 1/2/3/4 这类数字。如果字段本身存在,直接做唯一值统计就能判断这套数据是不是真的分到了乡道;如果字段缺失,那就要怀疑这份数据的“分级”只是图层拆分,而不是属性分类,两种情况的处理方式完全不同。
这里我一般会在 QGIS 里用 PyQGIS 跑一个快速统计脚本,几秒钟把每个字段值的数量列出来,比肉眼拉属性表靠谱得多:
from qgis.core import QgsVectorLayer layer = QgsVectorLayer("D:/Roads/InnerMongolia.shp", "road", "ogr") field_name = "GB_CODE" stats = {} features = layer.getFeatures() for feat in features: val = feat[field_name] if val is None: val = "NULL" stats[val] = stats.get(val, 0) + 1 for code, cnt in sorted(stats.items(), key=lambda x: x[1], reverse=True): print(f"{code}: {cnt}")字段名按你实际属性表改,代码本身不做任何空间计算,所以图层多大都跑得动。统计结果里如果出现 G、S、X、Y 四类都有,并且 Y 类(乡道)的记录数明显多于 X(县道),说明分级粒度是够的。如果 Y 类极少或者压根没有,那标题里的“精确到乡道”大概率是数据说明写得太乐观,实际只到县道。
2.2 乡道判定:这条路算乡道还是村道,国标和地方习惯有出入
国标定义里,乡道是“乡级行政区域的公路”,连接乡镇政府所在地与所辖行政村之间;村道则是连接行政村与自然村之间的道路。但在内蒙古,很多旗县下辖的苏木乡镇面积很大,一条路从乡镇政府延伸到某个嘎查(行政村),路况和宽度跟村道差不多,按行政等级却是乡道。反过来,有些近年修建的通村硬化路路面宽敞,但行政等级还是村道。
所以你在数据里看到一条线,宽度像乡道但等级字段标着 C(村道),或者标着 Y 但明显是断头路,不要急着认为是数据错。乡道的判定在 GIS 项目里首先看的是行政区划关系和道路属性,其次才是几何形态。一个可复现的检查方法是:把乡镇政府驻地作为点数据,做一次“点在线上”的空间连接,统计每个乡道图层里有多少条路的起点或终点落在乡镇驻地 500 米范围内。如果占比很低,说明这条乡道网络的连通性有问题,后续做路网分析会翻车。
2.3 等级字段缺失时的补救方案:属性补全和空间判断
如果数据打开后发现没有等级字段,或者字段值大量为空,也不是没法补救。常见做法是用行政区划边界做空间叠加:把旗县界、乡镇界加载进来,用路网与乡镇界做相交分析,落在乡镇界内且连接两个乡镇政府的线,优先判定为乡道;只连接村落的线判为村道。这个思路是空间分析层面的替代方案,能解决一部分属性缺失的问题,不能替代人工抽查。
另一种情况是字段存在但值不规范,比如把“乡道”写成“X”(小写)或者“乡道”两个汉字,这种多半是从不同来源的图幅拼接时编码没统一。处理方式是把所有可能的值列出来,写个映射字典统一成 Y,再重新导出。属性值规范化这件事,是后续一切符号化和统计分析的前提,不值得省这几分钟。
3. 把 .rar 变成可用图层:解压、文件组成与坐标系检查
3.1 用命令行解压:先确认编码,再处理密码
标题里的 .rar 后缀意味着你拿到的不是直接能拖进 GIS 的 .shp,第一步是解压。我一般不用图形界面那把“下一步”点到底的玩法,而是先看一眼压缩包里有什么,再决定怎么解。Windows 下用 WinRAR 图形界面能看,但批量处理或遇到文件名乱码时,命令行更稳。
常见状况是:压缩包内有中文文件名,解压出来是乱码,或者干脆提示密码错误。前者是压缩包创建时用了 GBK 编码而解压环境默认 UTF-8 导致的显示乱码,后者是压缩包确实设了密码。密码的问题如果标题或说明里没写,直接用 Advanced RAR Password Recovery 之类工具硬刚基本是玄学,时间成本极高,建议先找来源方要密码,不要浪费时间在这上面。
命令行解压示例:
unrar x -p123456 -o+ InnerMongolia_road.rar ./road_data/参数说明:x表示保留目录结构完整解压,-p123456是密码,实际使用时把密码替换掉,没有密码就不加这个参数;-o+表示覆盖已存在文件时不弹确认提示,批量解压时能减少中断。解压完先ls看一眼目录结构,如果发现解出来一堆乱码文件名,先不要继续,先解决编码问题。Linux 下可以用lsar工具查看压缩包内文件名编码,再决定是否需要在解压时手动指定代码页。
3.2 打开 .shp 前检查文件完整性:4 个附属文件缺一不可
很多人习惯把 .shp 文件当成“一个文件”,解压完直接往 ArcGIS 里拖,拖进去提示“无法打开”或者打开后图层是空的,就开始怀疑数据坏了。实际上 ESRI Shapefile 格式从来不是单文件,它是至少三个文件配合的产物:.shp(几何)、.shx(几何索引)、.dbf(属性表),加上.prj(坐标系描述)。如果数据发布方做得规范,还有.cpg(属性表编码描述)和.sbn/.sbx空间索引文件。
解压完成后先检查这套文件齐不齐,缺.shx的话很多软件根本不认这个图层,缺.dbf则属性表为空,字段全丢。命令行检查最直接:
ls -lh ./road_data/ # 预期的输出里应该有:道路.shp、道路.shx、道路.dbf、道路.prj 这几个核心文件如果发现只有.shp一个文件,说明数据是从某个平台导出的裸几何,属性信息已经丢了,这种数据价值大打折扣。如果文件全,下一步检查.prj里的坐标系内容,这是整个数据能不能用对的关键。
3.3 坐标系是第一道坎:从 .prj 读坐标基准,不要信图层“看起来正常”
内蒙古自治区横跨多个投影分带,东起大兴安岭,西到阿拉善,东西直线距离超过 2000 公里。这个跨度的数据在坐标系处理上是非常容易出问题的。如果数据发布方给的坐标系是西安 80 或者北京 54,而你手上其它基础数据是 CGCS2000,两个图层叠在一起会差几十米甚至上百米,肉眼在 1:10 万比例尺下不明显,一到乡镇尺度的分析就露馅。
.prj文件是文本格式,直接用文本编辑器打开看关键内容:
cat ./road_data/道路.prj里面如果出现GCS_China_Geographic_Coordinate_System_2000或者CGCS2000,说明坐标基准是最新的一套,和国土部门的数据能直接套合。如果出现Xian_1980或Beijing_1954,就要做一步坐标转换,不能直接叠加。还有一种情况:.prj文件里写的是 WGS84(GCS_WGS_1984)。WGS84 和 CGCS2000 在平面坐标上差异通常在米级以内,做乡镇尺度分析可以忽略,但做高精度测量级应用不接受这种误差,要强制转成 CGCS2000。
.prj缺失的情况下,QGIS 会弹出“选择坐标系”窗口,很多人顺手选了个 WGS84,然后发现点位明显对不上——这是典型的坐标系玄学翻车现场。正确做法是先找数据说明文档里有没有写坐标系,找不到再按区域行政中心估算投影带,宁可手动指定也不要默认 WGS84。
4. 把“精确到乡道”落到业务:属性筛选、符号化与坐标转换
4.1 乡道筛选与图层符号化:把路网按等级分层
数据打开后,地图上一堆线挤在一起,国道乡道一个样式,这没法用。要做的是按等级字段做规则符号化,让不同等级的道路从视觉上分开,同时为后续分析准备好分层图层。QGIS 里用规则表达式最方便,不用拆数据也能实现分级显示:
from qgis.core import QgsRuleBasedRenderer, QgsSymbol layer = QgsVectorLayer("D:/Roads/InnerMongolia.shp", "road", "ogr") # 新建规则渲染器,依次匹配各级道路 symbol_g = QgsSymbol.defaultSymbol(layer.geometryType()) symbol_s = QgsSymbol.defaultSymbol(layer.geometryType()) symbol_x = QgsSymbol.defaultSymbol(layer.geometryType()) symbol_y = QgsSymbol.defaultSymbol(layer.geometryType()) rules = [ ("国道", "GB_CODE = 'G'", symbol_g, 0), ("省道", "GB_CODE = 'S'", symbol_s, 1), ("县道", "GB_CODE = 'X'", symbol_x, 2), ("乡道", "GB_CODE = 'Y'", symbol_y, 3), ] renderer = QgsRuleBasedRenderer(rules) layer.setRenderer(renderer) layer.triggerRepaint()这段代码只是把分级规则挂到图层上,不修改原始几何和属性,风险为零。真正干活的时候我会在符号基础上再设置线宽:国道 1.5mm、省道 1.2mm、县道 1.0mm、乡道 0.6mm,打印出图时再按比例尺缩放。这样做的好处是乡道作为最细的一层,在乡镇尺度下不会被国道压住视觉。
4.2 坐标转换到 CGCS2000:内蒙古跨投影带要分开处理
如果前面检查发现坐标系不是 CGCS2000,就需要转换。这里有个内蒙古特有的坑:如果不做投影而只用地理坐标系分析,面积和距离计算全部失真;如果做投影,全自治区数据不能只套一个投影带。内蒙古东西跨度太大,按高斯-克吕格 3 度分带,至少跨 111°E、114°E、117°E、120°E 等多个中央经线带,同一个图层里不同旗县的线可能落在不同的带。
处理思路是把数据按旗县行政区分组,对每个旗县的落带范围单独做投影转换,最后再合并。命令行环境下用 ogr2ogr 最稳:
ogr2ogr -t_srs "EPSG:4547" -a_srs "EPSG:4490" \ -overwrite ./output/road_cgcs2000.shp ./output/road_wgs84.shp-t_srs指定目标坐标系,-a_srs指定源坐标系。EPSG:4547 是 CGCS2000 3 度带高斯投影中央经线 111°E 的常用编码,适用于锡林郭勒盟西部、乌兰察布等经度在 109.5°~112.5° 之间的区域。如果数据主要覆盖赤峰、通辽一带,中央经线应换成 120°E 对应的投影带;包头、鄂尔多斯一带则取 111°E 或 108°E 带。实在拿不准,用 ArcGIS 的投影工具手动填 Central Meridian 参数,比记一堆 EPSG 码更直观。
4.3 导出成果:删字段、限比例尺、输出格式选择
分析和符号化完成后,最终交付给别的项目组或上级单位时,原始数据里那些用不到的字段最好删掉。保留字段项目里有的是中文名,有的是拼音缩写,跨软件流通时中文名容易乱码,我习惯保留一个精简的英文数字字段集:道路编号(road_code)、等级(class_code)、名称(road_name)、长度(length_m)。长度字段如果原数据没有,用 QGIS 的字段计算器算一次:
$length # 注意要在投影坐标下计算,地理坐标下单位是度计算前确认图层已经投影到平面坐标系,否则算出来的长度单位是度,数值完全不可用。导出格式上,如果下游是 ArcGIS 用户就继续用 .shp,是 PostGIS 或其它空间数据库就直接入库。如果只是临时看图和分发,GeoPackage 比 .shp 更省心,一个文件搞定所有图层,不存在附属文件缺失问题。导出时用ogr2ogr -f "GPKG"即可。
5. 内蒙古道路矢量数据避坑:5 个现象、原因与对应解法
5.1 解压后 dbf 属性表是乱码
现象:图层能打开,几何显示正常,但属性表里所有中文内容全是“鍩哄潙”之类的乱码。原因:dbf 文件是用 GBK(代码页 936)编码存储的,而当前 GIS 环境默认按 UTF-8 读取,两者不对应。这在从老旧 GIS 平台导出的数据里太常见了。解决:在 QGIS 图层属性 → 数据源 → 字符编码里手动改成 GBK 或 GB18030,或者给数据补一个.cpg文件,内容写上UTF-8,但前提是数据源确实用 UTF-8 存储。两种情况不要搞混,先判断原始编码再改。
5.2 属性表里没有乡道等级代码
现象:字段齐全,但等级字段的值集中在 G、S 和 X,Y 类几乎为 0。原因:数据发布方可能把乡道和村道合并成了“等外公路”一类,或者分级依据不是行政等级而是技术等级(一级公路到四级公路),乡道在这个分类体系下被拆散了。解决:先看是否有“技术等级”字段,如果它里面出现了“四级公路”且占大头,结合 2.2 节的空间判断方法,从几何上把乡道重新识别出来。注意不能直接按“四级公路=乡道”来一刀切,很多县道也是四级公路。
5.3 数据“最新”但道路走向和现状差了一截
现象:拿乡道数据和卫星影像或者现场 GPS 轨迹对比,发现部分路段明显偏移。原因:一种可能是数据经过了简化(抽稀),控制点少导致线形偏移;另一种可能是近年新修道路尚未更新入库。解决:先给图层叠加卫星影像判断偏移是整体还是局部。整体偏移基本都是坐标系问题,按 3.3 节重新确认;局部偏移就把更新区域的路段选出来,用影像底图做手动修线编辑,别指望全自动匹配。
5.4 乡道网络大量断头,连通性差
现象:沿一条乡道追踪,到某个位置突然断掉,但影像上明显还有路继续往前。原因:原始数据从不同比例尺图源拼接,接边处缝隙未处理;或者乡道只采集了路基完好的部分,土路、砂石路被漏掉。解决:这一步没有后悔药,工程上最稳的方法是用拓扑检查先把所有断点找出来。QGIS 里用拓扑规则“不能有悬空端点”,批量检查后逐个判断:断点另一端确实是路的尽头,就保留;另一端影像上明显有路,就需要把缺失段补画或用另一份数据源拼接。
5.5 同一图层内坐标基准混杂
现象:图层打开后,部分旗县位置的要素互相错位,相邻两个旗县之间出现几十米到几百米的重叠或缝隙。原因:数据拼接时各旗县原始数据来自不同坐标系,发布方简单合并但没有统一坐标基准。解决:按旗县字段拆分图层,逐个读取坐标系,先统一到同一地理坐标系,再统一投影。这一步要在任何分析之前做,否则叠加行政边界后错位肉眼可见。
6. 验证数据可信度:用乡镇驻地点做连通性检查
拿到一套数据,不能因为它叫“最新”就信任它。我习惯做一项低成本但很能说明问题的验证:用乡镇政府驻地做点数据,和乡道图层做距离连接,统计“乡镇驻地 500 米内是否有乡道通过”。内蒙古旗县下面的苏木乡镇分布稀疏,乡道系统理论上应该把所有乡镇驻地串起来,如果某个乡镇驻地和乡道之间超过 500 米,要么是乡道漏采,要么是驻地位置用的是旧行政区划点,两者都需要排查。
操作上,把乡镇驻地点和乡道图层做空间连接,用 QGIS 的“按位置连接属性”工具,目标字段选乡镇名称,连接字段选道路等级,匹配方式选“相交”。连接完成后查一下有多少乡镇没有匹配到任何乡道要素,这个比例超过 5% 就要回头补数据了。验证通过后,这套数据就能放心作为底图或者分析输入。
最后还剩一个使用习惯:交付给其它项目组时,我会把坐标系、数据源时间、已知问题写进一个 README 文本,跟数据放到同一目录下。做这行越久越明白,数据本身永远不完美,但把已知的边界条件交代清楚,比让下一个接手的人重新踩一遍坑要值得多。希望帮到你。
本文还有配套的精品资源,点击获取