☰
四川省五级行政区划SHP数据:村级边界矢量底图与GIS实操指南
2026/10/27 3:10:27 网站建设 项目流程

简介:四川省五级行政区划SHP矢量数据是一套覆盖省、市、县、乡镇(街道)与村(社区)边界的完整GIS基础数据,面向地理信息开发者、规划人员、科研人员及高校GIS学习者,用于解决项目中缺少统一、现成、多级行政边界底图的问题,可直接支撑地图可视化、行政区划统计、空间叠加分析、选址评估与区域对比等工作。压缩包共39个文件,以Shp主文件、Shx几何索引、Dbf属性表、Prj投影文件为核心,辅以Sbn/Sbx空间索引、Cpg编码文件与XML元数据,能完整适配ArcGIS、QGIS等主流GIS平台;资源整体约300.56MB,省、市、县、乡镇、村界分别组织,目录清晰,方便按层级调用。目前已有772人学习下载,是日常制图与空间分析中实用的行政边界数据。使用这套数据,无需自行寻找和逐级拼接各级边界,下载解压即可用于专题图制作、公共服务设施覆盖评估、人口与经济数据挂接等实际项目,显著提升数据准备环节的效率。

1. 四川省五级行政区划 SHP 数据:一张能查到村级边界的现成矢量底图

做国土空间规划或者网格化管理的人,对“行政区划边界”这四个字应该不陌生。以前我常遇到的情况是:手头只有市级边界,想把指标细化到乡镇、村,就得自己翻年鉴、找图、拼接、校准,一套流程下来少说一两天,而且坐标系还经常对不齐。这份 2025 年版本的四川省五级行政区划 SHP 数据,把省、市、县、乡镇、村五层边界一次性打包成标准矢量数据,B 端项目里最耗时的“找底图”环节直接被跳过。打开 ArcGIS 或 QGIS,加载、查询、裁剪、关联属性,都能直接上手。适合做 GIS 可视化、区划统计、地图服务发布,以及把 CAD 规划方案与行政边界叠加对照的工程场景。

2. 拆开数据包:五级结构、坐标系和文件组成

2.1 五级层级的组织关系:行政区划代码才是真正的骨架

拿到数据包后先别急着拖进 GIS,先把层级关系理清。这份数据从省到村一共五个独立图层,每层对应一个行政级别:省级、市级、县级、乡镇级、村级。四川全省有 21 个市州、大约 180 多个县级区划、3000 多个乡镇街道、接近 27000 个行政村和社区,整体数据量不小。

五个图层之间靠什么关联?靠行政区划代码。这套代码是国家统计用的标准编码,每一个层级都自带固定的位数:省级两位数(四川是 51),市级四位(成都市是 5101),县级六位(锦江区是 510104),乡镇街道九位,村社区十二位。你只要拿到任意一条 PAC 字段,就能从代码前缀推断出它属于哪个市、哪个县、哪个镇。

层级图层示例行政区划代码位数典型字段
省级四川省_省界.shp2 位,如 51NAME、PAC、AREA
市级四川省_市界.shp4 位,如 5101NAME、PAC
县级四川省_县界.shp6 位,如 510104NAME、PAC
乡镇级四川省_乡镇界.shp9 位,如 510104100NAME、PAC
村级四川省_村界.shp12 位NAME、PAC

注意一个细节:村级图层的 PAC 前九位,理论上应该能在乡镇级图层的 PAC 字段里完整匹配。这个特性很重要,后文我会专门拿它做数据完整性校验。实际工程中字段名不一定叫 PAC,有的包叫 CODE 或者 XZQHDM,但含义相同,打开属性表看一眼就能确认。

2.2 坐标系:CGCS2000 与 WGS84 怎么选

SHP 数据包里通常有两种坐标系版本,最常见的标签是 CGCS2000 和 WGS84。CGCS2000 对应的是我国国土行业标准坐标系,很多政府项目、报批图件都要求用它;WGS84 是 GPS 和互联网地图常见的地理坐标系。两者在经纬度数值上相差很小,做一般可视化几乎看不出差别,但绝不能混用。

我的经验是:如果数据最终要进 ArcGIS 做面积统计、叠加分析,优先选 CGCS2000 带投影的版本;如果是要发到 Leaflet、Cesium 这类 Web 地图上展示,直接用 WGS84 经纬度版本最省事。数据包里如果给了 .prj 文件,打开后可以在图层属性里看到坐标系定义,这一步别省。

具体到投影选择,四川横跨多个经度带,做全省范围的面状统计时建议投影到适合四川的等积投影上,比如兰伯特等积圆锥投影;做县域精细测量时,沿中央经线选择高斯-克吕格 3 度带更稳妥。千万不要拿经纬度坐标直接算面积,结果会变成以“度”为单位的诡异数值,后面我会在避坑章节展开。

2.3 打开前先看文件清单:SHP 不只是那个 .shp

很多人从网盘下载后只看到 .shp 文件,以为复制走一个就够了,下次打开缺文件报错,才开始怀疑“数据是不是坏了”。实际上一个完整的 SHP 是由多个文件共同组成的,缺一不可。

文件后缀作用
.shp存储矢量几何图形本身
.dbf存储属性表,所有的 NAME、PAC 字段都在这里
.shx建立几何和属性的索引关系
.prj记录坐标系信息,缺失时软件会弹警告
.cpg声明 dbf 属性文件的编码格式

有时候还会看到 .qpj,这是 QGIS 自己生成的投影描述文件,不影响使用。拿到数据先核对这几件套是否齐全,尤其要确认 .prj 和 .cpg 存在。如果只有光秃秃一个 .shp,加载后大概率会出现坐标乱飞或者中文乱码两道关卡。

提示:下载后建议先用 QGIS 打开一个村级图层,把属性表调出来看 NAME 和 PAC 字段是否正常显示,再继续后面的操作。这个检查只要一分钟,能省掉后续一堆玄学问题。

3. 上手实操:在 QGIS 和 ArcGIS 里把五级数据用起来

3.1 QGIS 分层加载与分级渲染设置

我用 QGIS 处理这类多层级数据时,习惯按省、市、县、乡、村的顺序依次加载。顺序有讲究:先加载大范围的面,再加载小范围的,这样画布上能看到“大面套小面”的层级关系,后续做裁剪、叠置也直观。

加载后建一个分级样式,让五个图层在同一个视图里按行政级别显示不同的符号。在图层样式里选择“基于规则”的渲染,配置每条规则。比如市级图层只显示成都市范围时,可以在表达式里写:

"PAC" LIKE '5101%'

也就是把 PAC 以 5101 开头的要素全部保留,其他市州不显示。这个表达式在 QGIS 的“规则集过滤”里直接生效,图层没有真正删除数据,只是临时隐藏,随时可以改回来。

表达式的意思是:字段 PAC 中包含字符串 “5101”,% 是通配符,表示后面任意字符。同理,如果只要锦江区,就换成"PAC" LIKE '510104%'。比如要定位到某个镇,表达式就写"PAC" LIKE '510104100%',九位代码加上 % 就能过滤出该乡镇下辖的所有村级要素。

这种过滤方式比“图层属性 → 分类 → 唯一值”灵活得多,尤其在五级数据叠加时特别好用。QGIS 的表达式在执行时会自动调用索引,缓冲点数大的村界图层响应也快,实际体验比手动选择再导出舒服很多。

3.2 ArcGIS 属性关联:用区划代码对接业务指标

如果你手里有一张 Excel 统计表,里面是各个乡镇的常住人口、耕地面积、村集体收入,想把这些业务指标挂到地图上,这就要做属性关联。ArcGIS 里最常用的功能是“连接和关联”,在图层上右键 → 连接,选“基于关键字段连接”。

关键字段的选择直接决定成败。我的建议是永远用行政区划代码做关联,不要拿名称去匹配。原因很简单:村镇重名率远比你想象的高,比如“李家村”“金花村”在一个省里可能有好几个,用名称关联轻则数据错位,重则统计结果完全对不上。

ArcGIS 的连接界面里,第一个下拉框选当前图层的字段,我一般选 PAC;第二个下拉框选业务表的字段,前提是 Excel 里必须有一列完整的代码。如果 Excel 里只有中文名称,比如“三圣街道”,那就需要用 VLOOKUP 或 pandas 先在 Excel 端把 PAC 补全,再用代码关联。

关联后要注意一个坑:连接是一对一还是一对多。如果业务表里每个乡镇出现多次记录,ArcGIS 会生成重复要素,后续做汇总统计容易翻车。建议先用 Excel 数据透视表把数据聚合到每个 PAC 一条记录,再做关联,这是最稳的处理顺序。

3.3 按县/镇切片导出:属性筛选与 ogr2ogr 两种方式

很多时候不需要加载全省几万个村的面,只需要某个区域。比如项目只做锦江区,那就把锦江区下面的村级边界切出来。QGIS 里操作最直观:先对上文提到的表达式做属性过滤,右键图层 → 导出 → 另存为,勾选“仅保存所选要素”,格式继续保持 ESRI Shapefile 即可。

大批量切分多个县域时,我建议直接用 ogr2ogr 命令行,速度更快也方便批量跑脚本。假设原始村界文件在 D:/data 目录下:

ogr2ogr -f "ESRI Shapefile" D:/output/jinjiang_village.shp D:/data/四川省_村界.shp -where "PAC LIKE '510104%'"

-where参数后面的 SQL 表达式会先过滤再导出,导出的文件里只保留符合条件的数据。注意文件路径里不要带中文,部分 Windows 环境对中文路径支持不友好,容易报错提示“无法打开数据源”。

实际工程中,我一般会把一条ogr2ogr命令包一层循环,遍历一批 PAC 前缀,一次性生成十几个县的村界切片,然后打包发给前端。这样本地渲染的压力会小非常多,而且每个切片自带独立的 .dbf 属性,前端面板切换行政区时直接丢到地图上即可。

4. 格式转换实战:dwg 转 shp、shp 转 3dtiles、shp 转 wkt

4.1 dwg 转 shp:把 CAD 规划底图换成行政区划边界

做规划项目时,经常遇到设计院发来一个 .dwg 文件,里面画了地块红线、道路中心线、建筑轮廓,要和行政区划边界叠在一起看。CAD 的二进制格式在 GIS 软件里不能直接读属性,必须先转成 SHP。

QGIS 里处理比较顺:直接把 .dwg 文件拖进画布,它会调用 CAD 模块解析出多个子图层,比如 Polygon、Polyline、Text 等。规划地块一般是闭合多边形,对应的是 Polygon 图层。在图层树里找到 Polygon 图层,右键 → 导出 → 另存为 SHP,编码建议选 UTF-8。

这里有个常见坑:CAD 里的地块如果是 LWPOLYLINE(轻量多段线),而且是未闭合的,导入 QGIS 后会变成线要素而不是面。处理办法是在 CAD 里先用 BOUNDARY 命令生成闭合多段线再导出,或者在 QGIS 里用“线转面”工具把闭合线转换成面。

坐标问题也要留意,CAD 图纸往往用的是项目自定义坐标系,没有写 .prj 信息。导入 GIS 后面要素的位置可能偏移几公里。这时候只能做地理配准,找两个公共控制点做仿射变换,常见做法是用“GDAL 的 gcp 点”在 QGIS 里做变换,精度要求高的话建议原始坐标投影参数早点和设计方对齐。

4.2 shp 转 3dtiles:在三维场景里叠加矢量边界

这两年智慧城市项目多,浏览器里三维场景要叠加行政区划边界,目前最常用的格式是 3dtiles。转换路径通常分两步:先把 SHP 转成 GeoJSON,再用转换工具生成 3dtiles。

SHP 转 GeoJSON 可以直接用 QGIS 另存为,也可以用 ogr2ogr,关键是坐标系要转成 WGS84 经纬度(EPSG:4326),因为 Cesium 场景默认地球模型是 WGS84,坐标系不一致,叠加时边界会偏离底图。

ogr2ogr -f GeoJSON D:/out/sichuan_town.geojson D:/data/四川省_乡镇界.shp -t_srs EPSG:4326

-t_srs EPSG:4326的作用是把原数据的坐标系重新投影到 WGS84。生成 GeoJSON 后再交给转换工具生成 3dtiles。目前主流的免费工具是 CesiumLab,打开后选“矢量转 3dtiles”,把 GeoJSON 拖进去,设置 LOD 层级和最大误差阈值就可以批量生成。

如果数据是全省村界,几万个要素,建议在转换前先用“融合”工具把相邻同属性面合并,否则生成的 tile 数量过多,浏览器切片请求压力会非常大,页面交互明显卡顿。融合操作在 QGIS 里用“按字段融合”,字段选 PAC 的前六位,这样乡镇合并成县,再进入转换工具,性能会更合适。

4.3 shp 转 wkt:把矢量几何交给后端做空间查询

有一些后端判重、叠加计算的服务不直接读 SHP 文件,而是要求传一段文本格式的几何数据,这就是 WKT(Well-Known Text)。比如把村界几何传给 PostGIS,用ST_GeomFromText()函数写入数据库做空间检索。

用 Python 处理这种需求非常顺手。项目里安装 geopandas,一行就能读取 SHP 并把几何对象转成 WKT:

import geopandas as gpd gdf = gpd.read_file('D:/data/四川省_村界.shp', encoding='utf-8') # 取出锦江区某村级要素 one = gdf[gdf['PAC'] == '510104001001'] wkt = one.geometry.to_wkt() print(wkt.iloc[0])

read_file读取 SHP 后,geometry列存的就是每个面的几何对象;to_wkt()方法把几何对象序列化成文本,比如POLYGON((104.00 30.65, ...))。iloc[0]只是取第一行结果,因为one是一个筛选后的数据子集。

如果对精度要求高,to_wkt(rounding_precision=6)可以把坐标保留到小数点后六位,大约厘米级;如果要控制体积,先用gdf.simplify(tolerance=0.0001)抽稀,再转 WKT,文本大小能降到原来的四分之一左右。

5. 避坑指南:SHP 数据最常见的五个坑和排查方法

5.1 属性表中文乱码

现象:加载图层看属性表,NAME 字段显示成“�”或者类似“姘存潗”这样的乱码,完全没法读。

原因:绝大多数 SHP 的 dbf 属性表在生成时用的是 GBK 或 GB2312 编码,但发布方有时候存成 UTF-8,又没有写对 .cpg 文件,GIS 软件只能用默认编码解析,于是出现乱码。QGIS 相对宽容,ArcGIS 对编码的猜测经常不准,所以乱码集中在 ArcGIS 上比较常见。

解决:在 QGIS 中加载时,打开数据源管理器,把编码从自动改成 UTF-8 或 GBK,切换后就能恢复正常。如果还是乱码,用 ogr2ogr 重写一次属性编码:

ogr2ogr -f "ESRI Shapefile" -lco ENCODING=UTF-8 D:/output/out.shp D:/data/四川省_村界.shp

转换后生成的新文件会带上正确的 .cpg 声明,ArcGIS 再打开就不乱码了。

5.2 相邻村界之间出现缝隙或重叠

现象:把两个村的边界放大到 1:2000 比例尺,发现它们中间有一条白色的裂缝,或者两个面互相压了一小块。

原因:很多省市级小比例尺数据从原始测绘成果逐级综合后,行政村边界不是精确共享边,而是各自独立的折线,抽稀时差一个点,缝隙就出来了。还有的是不同批次拼接的数据,接边没做拓扑处理。

解决:如果只是做可视化展示,把面图层的边框设成与填充接近的颜色,缝隙视觉上就看不出来了。如果要做精确叠加统计,必须做拓扑修复。QGIS 里用“修复几何”工具,容差设 0.001(单位与坐标系一致),或者用 GRASS 的v.clean工具做一步“打断 + 融合”,能消掉重叠部分。这是存量数据普遍存在的接边问题,不算数据损坏。

5.3 算面积、算长度结果离谱

现象:用标识功能查一下某县面积,结果显示成 5000 多平方度,单位明显不对,数值完全不能用。

原因:图层坐标系是地理坐标 WGS84,单位是度,直接用$area算面积,结果自然是一堆平方度。只要涉及长度和面积计算,必须先投影到投影坐标系,这是很多刚接触 GIS 的人最容易翻车的地方。

解决:在 QGIS 里先右键图层,确认坐标系是 EPSG:4326,然后菜单里找“重投影图层”,目标坐标系选 CGCS2000 的 3 度带高斯-克吕格投影,中央经线选 105°E 覆盖四川中东部,或者选兰伯特等积圆锥投影覆盖全省。投影后再新建字段,用$area计算面积,得到的结果单位就是平方米,除以 1000000 就是平方公里。

5.4 数据版本不对:区划调整导致对不上

现象:图上某个乡镇明明还在,但和官方发布的 2025 年行政区划代码表一比对,发现这个代码已经撤销,或者乡改镇了名称都变了。

原因:行政区划每年都有微调,乡镇合并、村改居、析置街道等都会导致代码变化。数据标签写“2025”,指的是标注发布年份,不代表之后没有变化。

解决:拿到数据先把属性表导出一份,和官方发布的行政区划代码做一次逐条比对,重点核对乡镇级和村级。如果业务对现势性要求很高,改动频繁的地区必须重新获取最新版。包里的 PAC 字段始终以官方代码为准,名称可能因机构改革变化,但代码体系是稳定的,日常处理尽量用代码做唯一标识。

5.5 村级数据太大,加载卡顿

现象:把全省村界 SHP 拖进 ArcMap,转了三十秒的圈才出来;每次缩放地图都要等一秒钟,图层一旦打开整个工程都变慢。

原因:全省近三万个面要素,面边界往往带大量折点,原始数据没有做抽稀和简化。再加上 ArcMap 是 32 位应用,内存受限,处理几万要素非常吃力。

解决:首先,能用 QGIS 或 ArcGIS Pro 就用它们,64 位性能好很多。其次,展示层和数据层分开处理:展示层用“简化”工具(Douglas-Peucker 算法,地理坐标系下容差设 0.0001 左右)抽稀,肉眼几乎看不出差别;需要精确计算的村级边界保留原始数据单独使用。如果数据要发布成网页地图,更推荐直接转成 GeoPackage 或者矢量瓦片,加载性能立竿见影。

6. 进阶验证:用行政区划编码做闭环自查

6.1 父子级存在性检查与去重检查

拿到数据包后,与其等到分析结果对不上再返工,不如先花两分钟做一次自动检查。检查思路很简单:村级 PAC 前九位应该能在乡镇图层里找到;乡镇 PAC 前六位应该能在县级图层里找到。只要有“找不到”的情况,就说明图层之间有数据缺失或错位。

用 Python 和 geopandas 写脚本,几分钟内就能检查完所有层级:

import geopandas as gpd village = gpd.read_file('D:/data/四川省_村界.shp', encoding='utf-8') town = gpd.read_file('D:/data/四川省_乡镇界.shp', encoding='utf-8') # 村级前9位代码 village_code = village['PAC'].astype(str).str[:9] town_code = set(town['PAC'].astype(str)) # 找出在乡镇层里找不到的村 missing = village_code[~village_code.isin(town_code)] print(f"乡村对应不上个数: {len(missing)}") # 重复代码检查 dup = village[village['PAC'].astype(str).duplicated()] print(f"村级重复PAC个数: {len(dup)}")

astype(str).str[:9]是把 PAC 统一转成字符串再截取前九位;isin(town_code)判断村级前九位是否存在于乡镇集合中,~表示取反。输出的数量如果是 0,说明层级闭合关系正常;如果多余 10 条,就需要逐个看代码,判断是数据本身问题还是行政区划调整导致的旧代码残留。

重复 PAC 的要素会导致关联业务表时一对多,统计时反复重复计算。这个检查必须放在做任何叠加统计之前,等出图之后发现问题再回头,代价要高得多。

6.2 用融合结果做视觉验证

代码检查通过后,再做一层视觉验证:把乡镇图层按县级代码融合成县级面,和原始县级边界套在一起对比。按字段融合在 geopandas 里也很直接:

town_union = town.dissolve(by='PAC_6', aggfunc='first')

dissolve(by='PAC_6')是把所有 PAC_6 相同的乡镇面合成一个整体,类似于 ArcGIS 的融合工具。生成的结果如果和原始县级图层轮廓一致,说明乡镇面之间没有大的裂缝,县级边界与乡镇聚合结果匹配。如果两者相差明显,大概率是某些乡镇边界本来就超过了县界范围,后面做空间统计要特别小心。

这一套验证流程配上地图可视化,基本能把数据质量摸到八分。从那以后,我每次拿到省市县级 SHP,第一件事都不是急着出图,而是先跑一遍 PAC 去重和父级存在性检查,顺手把溶解后的轮廓叠到原始边界上看一眼。这个习惯帮我避开了无数次数据对不上的返工,也希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询