简介:面向GIS研究与规划人员的数据集,提供2022年7月发布的内蒙古自治区三级行政区划(省级、地市、区县)及道路网、铁路网矢量数据,覆盖高速公路、国道、省道与铁路线路、站点等要素,可支撑行政区划演变、交通网络连通性、区域经济统计等多类分析。压缩包整体约26.32MB,主要文件类型包括SHP矢量图形、dbf属性表与prj坐标参考文件;SHP存储几何边界,dbf记录行政代码、道路等级等属性,prj定义投影坐标系,加载至ArcGIS或QGIS后即可实现空间查询、专题制图与叠加分析。已有1338人学习下载,内容按行政级别与交通类别分文件组织,结构清晰,便于按需调用。无论是初学GIS的入门者,还是从事城市规划、物流选线或应急管理的专业人员,都能借此快速获得标准基础数据,减少数据预处理时间,聚焦业务分析本身。
1. 内蒙古行政区划SHP数据包:开图之前先想清楚三件事
做 GIS 的人最头疼的往往不是没有数据,而是数据凑不齐:内蒙古行政边界从某个平台导一份,道路网从另一个数据源下载,铁路网又是第三种坐标系,最后叠到一起要么差几公里、要么属性对不上。这套 SHP 资源把省级、地市级、区县级三级行政区划和道路网、公路网放在同一套文件里,版本标注 2022.07,省掉了四处找数据和投影重算的功夫。它是拿来做全区制图底图、空间分析底图和项目前期调研素材的,不是官方发布的权威区划公告,这点心里要有数。无论你是要出一张专题图,还是要按盟市统计道路里程,从这套数据起步,路线是通的。
2. SHP 文件的底细:从一个文件夹看出坐标系、编码和属性结构
2.1 一套 SHP 不是单个文件:缺件的后果各不相同
很多人在拿到资源后直接双击 .shp,能打开就万事大吉,打不开就怀疑数据坏了。其实 SHP 是“多文件配套”格式,文件夹里少了哪个成员,症状完全不同。
| 文件后缀 | 存放内容 | 缺失时的典型表现 |
|---|---|---|
| .shp | 点、线、面的几何坐标 | 图层加载直接报错,无法打开 |
| .shx | 几何与属性之间的空间索引 | 部分软件能打开,但查询和缩放明显卡顿 |
| .dbf | 属性字段与记录值 | 图形正常,属性表打不开或全为空 |
| .prj | 坐标参考描述(WKT) | 无任何报错,软件默认按 WGS84 打开,图层整体偏移 |
| .cpg | 属性文件的编码声明 | 中文属性显示为乱码的常见根源 |
所以拿到压缩包后,我一般先把所有文件解压到单独文件夹,执行一次目录列表,确认 .shp、.shx、.dbf、.prj、.cpg 都在。如果发现 .prj 缺失,先别急着打开,用 2.2 节的方法判断坐标系,否则后面所有叠加和分析都可能建立在错位的基础上。
还要留意文件夹里有没有 .sbn、.sbx 这类可有可无的索引文件。它们不是必须的,但既然存在,说明数据曾经被某些桌面 GIS 软件优化过,保留或删除都不影响主流程,只是别把它们当成额外图层拖进工程。
2.2 坐标系是最大的“黑匣子”:先确认投影再动手
内蒙古跨越二十多个经度,数据包里到底存经纬度还是投影坐标,直接决定后续操作。最稳妥的做法是先用 GDAL 工具查看元信息,而不是在软件里靠肉眼判断。
ogrinfo -al -so ./mng_2022/road.shp | grep -E "PROJCRS|GEOGCRS|EXTENT"这段命令里,-al表示读取全部图层,-so表示只输出概要信息,grep -E "PROJCRS|GEOGCRS|EXTENT"负责筛出坐标系描述和数据范围。如果你在 Windows 命令行环境下没有 grep,把管道改成findstr /R "PROJCRS GEOGCRS EXTENT"效果相同。看到GEOGCS["GCS_WGS_1984"]说明是 WGS84 经纬度;看到PROJCS开头的字段,则是某种投影坐标系,后面会跟带号或中央经线。
如果文件夹里没有 .prj,也有一个快速判断办法:打开要素的范围。内蒙古的经纬度大致落在东经 97 度到东经 126 度、北纬 37 度到北纬 53 度之间,如果坐标值在这个量级,就是经纬度存储。如果坐标出现4,xxx,xxx、5,xxx,xxx这种六七位的大数,说明数据已经被高斯-克吕格投影处理过,需要根据 Y 方向的带号反推中央经线。
这里必须说清楚一个很多人忽略的点:WGS84 和 CGCS2000 在这套数据的尺度下,平面误差通常只有几十厘米到一两米,做 1:100 万全区挂图完全看不出来,但如果你要拿它做用地选址、控制线落图,最好统一到同一基准后再分析。千万不要一个图层用 WGS84、另一个用 CGCS2000,叠图后发现边界和道路总是差那么一截。
2.3 省、地市、区县三级的嵌套关系与字段约定
数据包里行政区划做成三级面图层:省级面、地市面、区县面。这里的“地市”对应盟市层级,“区县”对应旗县区层级,三层之间是严格嵌套关系。点开属性表,常见字段有行政区名称、行政区代码、类型等,代码字段遵循行政区划代码规则:省级两位、地市级四位、区县级六位,后级代码的前缀一定与前级一致。
利用这个规则可以很快验证数据完整性。在 QGIS 中加载三个图层后,用“按位置选择”工具,以区县层选择地市层,检查每个地市是否都能被其下辖旗县完全填满。如果出现某些区县范围超出了对应地市边界,说明原始数据存在拓扑错误,后续统计会跟着出问题。
字段名方面,有些 SHP 是从境外公开数据派生出来的,属性名可能是NAME_1、NAME_2、NL_NAME_2这类格式;国内整理的版本则更倾向name、pac、code。看字段名时不要想当然,先按列排序,数一数每一级有多少条记录,心里就有底了。
2.4 数据时间是 2022.07,不等于现状就是 2022 年 7 月
版本号写 2022.07,只能说明这套数据原始快照的时间点可能是 2022 年 7 月前后,并不意味着官方区划在那个月刚更新过。行政区划调整往往滞后于数据库更新时间,乡镇合并、旗县改名这种操作,可能在发布后几个月才进入公开数据。如果你要写进正式报告,最好再对一遍当时最新公布的区划代码,并且把数据源时间写进文档。
道路网的情况更复杂。道路网图层里的公路网,字段中通常有类别、名称、路面或层级信息,但层级分类各家不一致,有的写“国道、省道、县道、乡道”,有的写“高速公路、一级公路、二级公路”。打开属性表先做一次“值分布”统计,看清楚枚举值再写筛选条件,能省掉后面很多返工。
3. 把道路网和区划叠起来:图层加载、分类提取与里程统计
3.1 加载与分组:把工程目录先理清楚
打开 QGIS,点击图层菜单里的“添加矢量图层”,把五个 SHP 一次性拉进工程,或者直接在浏览器面板中把文件夹拖到画布。拖入后检查图层面板中的顺序:行政区划面在最下面,道路网线在上面。如果发现多层文件同名,QGIS 会自动加序号区分,问题不大。
我习惯把所有输入数据放进“原始数据”分组,所有计算中间结果放进“工作数据”分组,这样最后出图时不会因为图层太多而混乱。尤其是这套数据里既有一级行政面,又有盟市面、区县面,再加上道路网、公路网两个线层,一共五个图层,不分组很容易选错对象。
加载完成后,逐个右键图层打开属性,看“信息源”里的坐标系描述。保证行政区划和道路网统一在一个坐标参考下再继续。如果坐标系不一致,先在工具箱里搜索“重投影”,把线层或面层转换到统一坐标系。这一步不要省略,后面统计里程时的“公里数”完全取决于它。
3.2 按属性分流提取高速公路、国道和铁路
道路网图层通常把所有道路放在同一张表里,用某个字段区分级别。要提取某类道路,先看该字段的取值分布,再写匹配条件。这里给一段 QGIS Python 脚本,可以直接在 Python 控制台运行,按类别筛选并导出为独立 SHP。
from qgis.core import ( QgsProject, QgsVectorFileWriter, QgsFeatureRequest ) roads = QgsProject.instance().mapLayersByName('roads_net_2022')[0] # 先看字段取值,再写表达式;LIKE 中的 % 表示“包含” expr = ("class LIKE '%express%' OR class LIKE '%motorway%' " "OR name LIKE '%高速%'") selected = [f for f in roads.getFeatures(QgsFeatureRequest(expr)) if f.geometry()] roads.select([f.id() for f in selected]) # 只导出选中要素,编码用 UTF-8 QgsVectorFileWriter.writeAsVectorFormat( roads, '/tmp/expressway.shp', 'UTF-8', roads.crs(), 'ESRI Shapefile', onlySelected=True ) print(f'已导出 {len(selected)} 条高速路段')这段脚本的要点在最后几个参数:roads.crs()告诉导出工具沿用源图层的坐标系,保证位置不变;onlySelected=True是核心,不写这个参数会把整张道路网全部导出,等于白做一次选择;UTF-8是属性编码,如果后续发现中文乱码,再考虑改成GBK试试。
匹配表达式里用LIKE '%高速%'而不是= '高速',因为字段里很可能是“G6 高速公路”“某高速连接线”这类带前缀后缀的值,精确匹配会漏数据。先宽后严,等筛选完成看一眼记录数,再决定要不要加条件收紧。
3.3 按盟市政区统计道路总里程:相交而不是裁剪
要统计每一个地市级行政区内的高速里程,不能直接把道路图层裁剪到面图层里,因为“裁剪”会只保留落在边界内的那部分,跨盟市道路被截断后,长度统计会整体偏小。正确做法是用矢量相交工具,让道路线与面边界互相切割,生成一个同时带道路属性和行政区代码的中间图层。
具体操作:在 QGIS 处理工具箱中搜索“相交”,输入层选择道路网,叠加层选择地市行政面,运行后生成新线图层。这个图层里每条线都带上了所在盟市的代码字段。接着打开字段计算器,新增一个len_km字段,公式填$length / 1000,单位就是公里。如果源图层是经纬度坐标系,QGIS 会按椭球计算长度,结果也是米,这点不用担心。
拿到带长度字段的相交结果后,可以用虚拟图层执行一段 SQL,直接按盟市汇总:
SELECT b.name_cn AS admin_name, SUM(l.len_km) AS total_km FROM road_intersect AS l JOIN city_boundary AS b ON b.code = l.adm_code GROUP BY b.name_cn ORDER BY total_km DESC;这段 SQL 里,JOIN关联用的是行政区代码而不是名称,是为了避免两个图层的名称字段一个带空格、一个不带导致匹配失败。GROUP BY按盟市分组,SUM汇总长度,最后按里程倒序排列,一眼就能看出哪条盟市高速里程最长。统计完成后,把结果和图层面板里的原始属性逐项对比,误差超过 5% 就要回头看有没有空几何或重复线段。
3.4 属性筛选的小习惯:先看枚举值,再写表达式
写筛选条件前,我一般先右键图层打开属性表,点击目标字段的“值分布”按钮。这一步成本极低,却能避免最典型的翻车:你以为字段叫name、值是“高速”,实际字段叫type、值是“高速公路”。不看枚举值直接写表达式,得到的结果往往是 0 条记录。
筛选完成后,用内存图层或临时文件保存结果,不要直接覆盖原始图层。原始数据一旦被覆盖,坐标系、属性编码很难原样恢复。后续所有基于该图层的操作都从临时结果重新开始,原始文件一直保留到项目交付。
4. 避坑:这套 SHP 最容易翻车的五个场景
4.1 打开属性表中文全变乱码
现象:属性表里的旗县名称显示成“锟斤拷”“烫烫烫”或者一排问号,完全无法阅读。
原因:SHP 的 .dbf 属性文件通常用 GBK 或 GB2312 编码存储中文,但 QGIS 默认按 UTF-8 解释,两者对不上就乱码。这份数据包虽然带了 .cpg 文件,仍可能因制作工具不同而失效。
解决:在图层面板右键图层,选择“数据源管理器”,把编码强制改为GBK或GB18030,再重新打开属性表。如果改动后正常,建议直接另存一份拷贝,并在导出对话框中明确选择编码为 UTF-8,后续在 QGIS 和 Python 中处理都更省心。导出的新数据如果仍乱码,再检查导出路径下有没有生成对应的 .cpg 文件,没有就手动补一个文本文件,内容写UTF-8。
4.2 行政区划和道路网错位大几百米甚至几公里
现象:道路网整体悬浮在行政边界外侧,或者穿过旗县边界后明显偏出,放大后错位肉眼可见。
原因:两个图层来自不同数据源,一个存的是 WGS84 经纬度,另一个存的是 CGCS2000 投影坐标,或者其中一个带有投影文件而另一个没有。没有统一基准前,图层在画布上只是“看起来在同一位置”,实际坐标参考根本不同。
解决:先按第 2 章方法确认每个图层的坐标系,再用工具箱里的“重投影图层”把所有数据转到同一个坐标参考。如果只是个别图层偏移,检查 .prj 文件是否被误删。曾有某项目里道路网的 .prj 丢失,所有道路被软件默认当作 WGS84 打开,和图斑叠起来偏差接近一公里,补回投影文件后立刻重合。
4.3 省、地市、区县三层边界不重合,放大后到处是细缝
现象:地市级边界和区县级边界在放大到一定比例后出现头发丝一样的缝隙,或者相邻面之间既有重叠又有空隙。
原因:三层数据可能由不同比例尺的底图数字化而来,省界与县界的原始精度不同,拓扑关系没有经过严格一致性处理。这是公开 SHP 数据的通病,不代表数据完全不能用。
解决:出图前先用拓扑检查插件跑一遍“面重叠”和“面空隙”,把明显的拓扑错误记录导出来。如果只是制图用,可以把地市面融合成整体当作底层背景,区县面叠加在上面,缝隙就会被遮住。如果要做面积统计,先用“修复几何”工具清理,再在属性表中计算面积,别直接信任原图面积字段。
4.4 按属性筛选后导出的要素数量少得离谱
现象:明明道路网里应该有几千条国道,筛选后只剩下十几条,统计里程更是少了一个数量级。
原因:写筛选条件时用了错误的字段名,或者字段值是“G6高速”“国道 G110”这类组合字符串,精确匹配自然漏掉大半。还有可能是道路网图层本身只包含某一部分道路,公路网才是完整数据,选错了图层。
解决:打开属性表,查看“值分布”,把所有类别列出来,确认“高速”到底存在哪个字段里。表达式使用LIKE '%高速%'而不是= '高速',匹配结果数再和原始要素数做比例对照。导出完成后立刻数一遍记录数,再统计总长度,两个指标至少有一个明显异常就能当场发现问题。
4.5 跨经度投影导致整张图拉伸变形,完全不能看
现象:把内蒙古全区放到某个投影坐标系后,图幅被拉成狭长条,东侧和西侧的形变程度肉眼可辨,比例尺量算结果也不可信。
原因:内蒙古东西跨二十多个经度,任何单一的高斯-克吕格带或 UTM 带都覆盖不全。强制套用一个投影带,必然导致另一侧被拉伸。如果图层面板里坐标系显示为带号的大数坐标,多半已经踩了这个坑。
解决:常规出图和空间分析尽量用经纬度坐标,直接在 WGS84 或 CGCS2000 经纬度下操作。若需要计算面积或长度并保证精度,选择适合中纬度东西跨度的兰伯特等积投影,而不是用单一带号的高斯投影。整套数据内部所有图层先统一到同一投影,再开始量算,统计结果才有可比性。
5. 出图与交付:让这套 SHP 真正进得了报告
5.1 符号化顺序:面在下,线在中,标注在上
行政区划面图层放在最底层,填充色用浅黄或浅灰;盟市边界比区县边界粗一圈,用不同透明度区分层级。道路线放在行政区之上,高速用红色宽线,国省道用橙色或黄色,铁路用黑白相间的虚实线。标注全部放在最后,区县名称用八号字,道路名称尽量沿道路走向弯曲放置,避免压盖。
线型宽度不要全图一成不变。在 QGIS 图层属性里把线宽单位设为“毫米”,用“基于属性”的符号化方式,按道路等级区分粗细,这样缩放时视觉比例更稳定。标注字体统一用黑体或思源黑体,避免宋体在密级较低的地图截图里看不清。
5.2 布局要素:经纬网、比例尺和指北针要成套出现
出图时新建打印布局,添加一幅主图,范围框选到内蒙古全区。布局里加经纬网网格线,间隔可以设成 3 度,标注度数字体用六号。比例尺选择双间隔千分尺或单段线比例尺,数值调整到整数。
指北针放在图面右上角,比例尺放在左下角,图名放顶部居中。图例最好单独一列,把道路层级和行政区层级顺序罗列清楚。图例项名称直接沿用属性表中的中文名称,如果字段里混着英文代码,先在图层属性里修改显示名称,不要在图例中暴露原始字段名。
5.3 出图前自检:我踩出来的三条检查铁律
第一条,查坐标参考。右上角查看工程 CRS,和原始数据包说明核对一次,确保所有图层都在同一套坐标参考下。第二条,数要素。行政区划三层分别选中,记录要素数,与属性列表总数对照;道路网按类别分列,核对筛选数量与预期范围是否匹配。第三条,算里程与面积。单条道路选中查看长度,和字段计算器结果对比,面积同理,精确到整数公里或平方公里即可。
这套内蒙古 SHP 用起来不算复杂,真正消耗时间的永远是坐标系判断、编码转码和拓扑修复。从那以后我每次出图前都强制走一遍校验清单:先看 CRS,再数要素,然后核对统计值,全过一遍才导出图片。养成这个习惯之后,交付物基本不会再因为“数据本身错了”被打了回来,希望帮到你。
本文还有配套的精品资源,点击获取