简介:这份资源是2022年7月整理的内蒙古自治区GIS矢量数据集,面向地理信息研究者、交通规划人员、区域经济分析者及高校师生,用于行政区划研究、路网分析与空间制图等场景。压缩包约26.32MB,内含省级、地市、区县三级行政边界,以及道路网与铁路网数据,配套.prj坐标系统定义文件与.dbf属性表,可确保地图正确投影并与其它数据集对齐,属性字段涵盖行政区域代码、道路等级等信息。借助这些数据,读者可开展行政边界变化对比、道路与铁路分布及连通性评估、结合人口经济数据的区域发展统计、项目环境影响评估与应急响应定位等工作,并通过GIS软件完成可视化、空间查询与专题制图。目前已有1338人学习下载,适合需要内蒙古基础地理底图与交通网络数据的中高级GIS用户参考使用。
1. 内蒙古 GIS 底图选型:为什么这套 2022.07 的 SHP 值得先收着
做内蒙古相关项目的同行大概都经历过这种场面:项目跑到一半,甲方突然要一张“全区+盟市+旗县”三级边界叠加路网的图,你翻遍硬盘发现手头只有一份 2018 年的全国县级边界,属性字段还是拼音缩写,道路数据更是只有主干道。这时候最省事的办法不是去在线底图截屏,而是手里常备一套现成的、字段规整的 SHP 文件包。这次拆的这套 2022.07 版内蒙古行政区划数据,包含省级、地市(盟市)、区县(旗县)三级边界,外加道路网和公路网两个线图层,正好覆盖了“行政边界+交通网络”这个最常见的底图组合。它适合谁?做区域规划出图的、跑可达性分析的、给三维场景铺底图的,以及需要离线数据不能联网调服务的场景。下面按“数据里到底有什么 → 怎么加载和检查 → 坐标系和字段怎么处理 → 常见翻车点 → 进阶用法”这条线走一遍,每一步都落到能直接抄的命令和参数上。
2. 拆开数据包:三级边界与两类路网图层的字段结构
2.1 图层清单与几何类型判断
拿到一个 SHP 包,第一件事不是急着往 QGIS 里拖,而是先看清楚里面有几个图层、各自什么几何类型、属性表长什么样。SHP 格式本身一个文件只能存一种几何类型,所以边界和路网必然是分开的 shapefile。常见做法是在终端里先列一遍:
# 列出目录下所有 shp 文件及其配套文件 ls -lh *.shp *.dbf *.prj *.shx 2>/dev/null # 用 ogrinfo 快速查看每个图层的摘要信息(GDAL 自带工具) for f in *.shp; do echo "===== $f =====" ogrinfo -so -al "$f" doneogrinfo -so只输出摘要不打印要素,-al表示所有图层。重点看三样:Geometry 是 Polygon 还是 LineString、Feature Count 有多少条、Extent 的经纬度范围是否落在内蒙古大致范围(约东经 97° 到 126°,北纬 37° 到 53°)。如果某个边界图层的要素数是 12 左右,那大概率是盟市级;如果是 100 上下,那是旗县级;省级应该只有 1 条。这一步能帮你确认文件没有缺漏,也能提前发现几何类型搞混的情况。
2.2 属性字段的命名规律
行政区划类 SHP 的字段通常分几组:行政代码、名称、层级标识、备注。常见命名有adcode、name、level、parent这类,也有用拼音全拼的。用 ogrinfo 看字段定义:
# 只看字段定义,不打印要素 ogrinfo -so 内蒙古_盟市.shp 内蒙古_盟市 | head -40输出里Field 1: adcode (String.15.0)这种就是字段名加类型加宽度。这里有个血泪经验:不同来源的 SHP 里,行政代码字段可能是字符串也可能是整数,字符串能保留前导零(比如某些旗县代码以 0 开头),整数会丢。如果你后续要拿代码去关联其他数据表,先确认类型,必要时统一转成字符串。名称字段里可能带“盟”“市”“旗”“县”“区”后缀,做匹配时别直接拿名称当主键,用行政代码更稳。
2.3 道路网与公路网的区别
标题里同时出现“道路网”和“公路网”,这两个图层不是重复的。常见做法是:道路网覆盖范围更广,包含城市道路、乡村道路、部分未铺装路面;公路网则聚焦国道、省道、高速公路这类等级公路,属性里往往带道路等级、编号、路面类型。判断方法还是看属性字段:
ogrinfo -so 内蒙古_公路网.shp 内蒙古_公路网 | grep -i "Field"如果字段里有grade、road_code、type这类,基本就是分级公路;如果字段很少只有名称和长度,那可能是通用道路网。做可达性分析时用公路网更合适,因为等级信息能换算车速;做底图渲染时道路网更全,视觉上更密。两个都留着,按场景切换。
3. 加载与坐标处理:从 WGS84 到投影坐标的完整操作
3.1 先确认坐标系再动手
SHP 的坐标系信息存在.prj文件里,但有些数据包会漏掉这个文件,或者 prj 写的是地理坐标系(WGS84,单位度),而你要做面积和长度计算就必须转投影坐标系(单位米)。先读 prj:
# 查看 prj 文件内容 cat 内蒙古_区县.prj # 或者用 ogrinfo 看图层坐标系 ogrinfo -so 内蒙古_区县.shp 内蒙古_区县 | grep -A2 "Layer SRS"如果输出是GEOGCS["WGS 84"...],说明是经纬度。内蒙古跨度大,跨了多个 UTM 带,直接用 UTM 会有边缘变形问题。常见做法是用 Albers 等积投影,中央经线取 114°E 左右,标准纬线取 40°N 和 50°N。这个参数组合在区域尺度上面积和长度误差都比较小。
3.2 用 GDAL 批量重投影
不想开桌面软件的话,ogr2ogr一条命令搞定:
# 将 WGS84 的区县边界转为 Albers 等积投影 ogr2ogr -f "ESRI Shapefile" \ -t_srs "+proj=aea +lat_1=40 +lat_2=50 +lat_0=0 +lon_0=114 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs" \ output/内蒙古_区县_albers.shp \ input/内蒙古_区县.shp # 道路网同样处理 ogr2ogr -f "ESRI Shapefile" \ -t_srs "+proj=aea +lat_1=40 +lat_2=50 +lat_0=0 +lon_0=114 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs" \ output/内蒙古_公路网_albers.shp \ input/内蒙古_公路网.shp-t_srs是目标坐标系,+lat_1和+lat_2是两条标准纬线,+lon_0是中央经线。参数不是随便填的:标准纬线选在数据纬度范围的中段,中央经线选在经度范围中间,这样变形最小。转完之后用ogrinfo -so再看一次,确认单位变成米、Extent 数值变成六位数以上。
3.3 在 Python 里读取和检查
如果你后续要用 GeoPandas 做分析,读取和检查可以一步到位:
import geopandas as gpd # 读取区县边界 gdf = gpd.read_file("output/内蒙古_区县_albers.shp") # 基础检查:要素数、几何类型、坐标系、字段 print(f"要素数: {len(gdf)}") print(f"几何类型: {gdf.geom_type.unique()}") print(f"坐标系: {gdf.crs}") print(f"字段列表: {list(gdf.columns)}") # 检查几何有效性,无效几何会导致后续空间运算报错 invalid = gdf[~gdf.is_valid] print(f"无效几何数量: {len(invalid)}") # 面积统计(投影坐标系下单位是平方米) gdf["area_km2"] = gdf.geometry.area / 1e6 print(gdf[["name", "area_km2"]].sort_values("area_km2", ascending=False).head(10))is_valid这一步别省。SHP 数据经过多次转换后容易出现自相交、重复节点这类问题,直接拿去做叠加分析会报拓扑错误。发现无效几何可以用gdf.geometry.buffer(0)做一次修复,但修复后要重新检查面积有没有异常变化。
4. 避坑排查:SHP 处理里最容易翻车的五个地方
4.1 中文属性乱码
现象:用 QGIS 打开属性表,名称字段显示成问号或方块。原因:DBF 文件的字符编码没有统一,常见是 GBK 和 UTF-8 混用,而 SHP 规范本身对编码标识支持不好。解决:先确认原始编码,用ogrinfo加-oo ENCODING=GBK试读,确认后在转换时用-lco ENCODING=UTF-8输出统一编码。如果已经乱码且无法恢复,只能找原始数据重新导出。
4.2 行政代码前导零丢失
现象:区县代码从010变成10,关联其他表时匹配不上。原因:DBF 字段被定义成数值型,数值型不保留前导零。解决:转换时用-sql "SELECT CAST(adcode AS CHARACTER(12)) AS adcode, * FROM layer"强制转字符串,或者在 GeoPandas 里gdf["adcode"] = gdf["adcode"].astype(str).str.zfill(12)补齐位数。
4.3 道路网断线导致路径分析失败
现象:做最短路径分析时提示网络不连通,明明图上看着是连着的。原因:道路网在数字化时节点没有严格捕捉,两条线在视觉上交叉但实际没有共享顶点。解决:用 QGIS 的“拓扑检查器”或 PostGIS 的ST_Snap做节点捕捉,容差设 1 到 5 米(投影坐标系下)。捕捉后重新构建网络数据集。这个坑在跨盟市边界处尤其常见,因为不同批次数据拼接时节点对不上。
4.4 边界图层重叠或缝隙
现象:相邻旗县边界之间有细缝,或者叠在一起出现双线。原因:不同来源的边界数据在拼接时没有做拓扑一致性处理。解决:如果只是出图,缝隙不影响视觉;如果要做面积汇总,必须做一次拓扑修复。常见做法是用gdf.geometry.union_all()合并后重新切分,或者用ST_MakeValid加ST_SnapToGrid统一节点。注意修复后总面积可能变化,要跟官方统计值对一下。
4.5 属性表字段名超长被截断
现象:字段名从road_grade_level变成road_grad。原因:DBF 格式字段名限制 10 个字符。解决:这是 SHP 格式的硬限制,没法绕过。要么接受截断,要么转成 GeoPackage 或 GeoJSON 格式存储。如果后续流程必须用 SHP,就在文档里记好字段映射关系,别等到别人接手时看不懂。
5. 进阶用法:用这套数据做一张可复用的底图模板
数据拆完、坑排完,最后落到一个实际能反复用的技巧上。我一般会把处理好的图层固化成一个 QGIS 工程模板,下次新项目直接改数据源路径就行,不用重新配样式。具体做法是:先按层级建好图层组(省级、盟市、旗县、公路网、道路网),每个图层配好样式——边界用不同线宽区分层级,公路网按等级分颜色,道路网用细灰线打底。然后在 QGIS 里用“图层样式”导出.qml文件,跟数据放在一起。
# 批量导出 QML 样式的思路(QGIS 命令行方式因版本而异,这里给的是文件组织约定) # 建议目录结构: # project/ # data/ # 放处理好的 shp # styles/ # 放对应的 qml # template.qgz # QGIS 工程模板模板建好后,验证方法很简单:随便挑一个旗县,用“按位置选择”选中它范围内的公路网要素,看选中数量是否合理;再用字段计算器算一下该旗县内公路总长度,跟常识对一下量级。如果长度明显偏小,多半是投影没转对或者道路网有断线。
还有一个习惯:每次拿到新的 SHP 数据,我都会先跑一遍ogrinfo -so -al加gdf.is_valid这两步,确认数据完整性和几何有效性之后再进入正式流程。这个习惯帮我省过很多次返工——有一次一批区县边界里有三条无效几何,直接做叠加分析会崩,提前发现后单独修复,十分钟搞定,要是等到出图阶段才发现,那就是半天的事。希望帮到你。
本文还有配套的精品资源,点击获取