七大地理区划Shapefile实战:从数据整理到空间分析 简介这份资源面向地理信息、区域经济与城乡规划方向的研究者及GIS初学者提供中国七大地理区划华北、东北、华中、华东、西北、西南、华南的标准Shape文件解决区域研究缺乏统一边界底图的问题。压缩包共65个文件约1.26MB以shp、shx、dbf、prj、cpg等Shapefile核心组件为主辅以xml元数据与sbx、sbn空间索引另含一份七大分区合并文件坐标系规范、属性字段统一可直接在ArcGIS、QGIS等软件中加载。目前已有962人学习下载。借助汇总与单个区划两套数据读者可快速完成气候生态对比、土地利用统计、区域差异分析与专题地图制作省去自行数字化边界的繁琐工作为科研绘图与政策分析提供可靠底图支撑。1. 七大地理区划 Shapefile 汇总从数据整理到空间分析的落地路径做区域统计的人多半遇到过这种局面手头有一份全国尺度的点位数据领导要按华北、东北、华中、华东、西北、西南、华南七个地理区划分别出图、分别算面积、分别做汇总而你翻遍本地磁盘只找到一份全国省级边界属性表里连个大区字段都没有。七大地理区划标准 Shapefile 要解决的正是这个问题——它把全国拆成七个大区每个大区一份独立矢量文件同时提供一份合并后的汇总文件字段结构统一、坐标系一致、边界可直接参与空间运算。这套数据适合做区域经济统计、气象分区聚合、物流覆盖分析、人口密度对比的从业者也适合需要快速搭建分区底图的可视化开发者。它的价值不在于数据本身多复杂而在于省掉了从省级边界手工归并大区的那一步而这一步恰恰是最容易出错的地方。2. 七大区划 Shapefile 的字段结构与坐标系统选型拿到一套区划 Shapefile第一件事不是急着加载而是先搞清楚它的属性表里有什么、坐标系是什么、几何类型是什么。这三项决定了后续能不能直接做空间连接、能不能和别的数据叠加、要不要做投影转换。2.1 属性表字段从区划名称到编码的完整设计一套可用的七大区划 Shapefile属性表通常包含以下字段。字段名可能因制作者习惯不同而有差异但语义基本一致字段名类型含义示例值region_name字符串大区中文名称华北region_code字符串大区编码100000sub_region字符串省级行政区名称某省sub_code字符串省级行政区编码110000geom_area浮点数几何面积平方公里156000.00region_code 的设计值得多说一句。常见做法是用行政区划代码的前两位作为大区标识比如华北用 10、东北用 20 这样依次排下去。但不同来源的数据编码规则不统一有的用 GB/T 2260 的前两位有的自定义。我一般会先检查 region_code 是否唯一、是否与 region_name 一一对应避免后续按编码聚合时出现一个编码对应两个名称的情况。注意如果属性表里只有省级字段没有大区字段说明这份数据是省级边界而非大区划数据需要先做归并。归并逻辑见 2.3 节。2.2 坐标系选择WGS84 与 CGCS2000 的取舍坐标系是 Shapefile 最容易翻车的地方。七大区划数据常见的坐标系有两种WGS84EPSG:4326和 CGCS2000EPSG:4490。两者在经纬度数值上差异极小但在做面积计算和距离量测时必须投影到平面坐标系。import geopandas as gpd # 读取七大区划汇总文件 gdf gpd.read_file(china_seven_regions.shp) # 查看当前坐标系 print(gdf.crs) # 输出示例EPSG:4326 # 如果要做面积计算投影到等面积投影 # 常用 Albers 等面积投影适合全国尺度 gdf_proj gdf.to_crs(projaea lat_125 lat_247 lat_00 lon_0105 x_00 y_00 datumWGS84 unitsm no_defs) # 计算每个大区的面积平方公里 gdf_proj[area_km2] gdf_proj.geometry.area / 1e6 print(gdf_proj[[region_name, area_km2]])这段代码的逻辑是先读取 Shapefile 确认原始坐标系再用to_crs转换到 Albers 等面积投影最后用geometry.area计算面积并换算成平方公里。参数说明lat_1和lat_2是标准纬线全国尺度常用 25 和 47lon_0是中央经线取 105 能较好覆盖中国范围。如果直接用 EPSG:4326 算面积得到的是平方度没有实际意义。2.3 从省级边界归并七大区划的完整流程如果手头只有省级边界需要自己归并七大区划。核心思路是给每个省级行政区打上大区标签然后按标签融合几何。import geopandas as gpd import pandas as pd # 读取省级边界 prov gpd.read_file(china_provinces.shp) # 定义七大区划映射以省级名称匹配 region_map { 某省A: 华北, 某省B: 华北, 某省C: 东北, 某省D: 东北, 某省E: 东北, 某省F: 华中, 某省G: 华中, 某省H: 华中, 某省I: 华东, 某省J: 华东, 某省K: 华东, 某省L: 华东, 某省M: 华东, 某省N: 华东, 某省O: 华东, 某省P: 西北, 某省Q: 西北, 某省R: 西北, 某省S: 西北, 某省T: 西北, 某省U: 西南, 某省V: 西南, 某省W: 西南, 某省X: 西南, 某省Y: 西南, 某省Z: 华南, 某省AA: 华南, 某省AB: 华南, } # 打标签 prov[region_name] prov[name].map(region_map) # 检查是否有未匹配的省份 unmatched prov[prov[region_name].isna()] if len(unmatched) 0: print(未匹配省份, unmatched[name].tolist()) # 按大区融合 regions prov.dissolve(byregion_name, as_indexFalse) # 保存汇总文件 regions.to_file(china_seven_regions.shp, encodingutf-8) # 保存单个大区文件 for name in regions[region_name].unique(): single regions[regions[region_name] name] single.to_file(fregion_{name}.shp, encodingutf-8)逻辑说明dissolve是 GeoPandas 里按属性字段融合几何的核心方法它会把同一大区下的所有省级多边形合并成一个或多个多边形。参数as_indexFalse让融合后的结果保留 region_name 作为普通列而不是索引。保存时指定encodingutf-8是为了避免中文属性在 Shapefile 的 DBF 文件里出现乱码——这是血泪经验不指定编码的话ArcGIS 打开可能显示成问号。注意Shapefile 单文件有 2GB 大小限制字段名也有 10 个字符限制。如果字段名超过 10 字符会被自动截断。建议在导出前把字段名改短比如 region_name 改成 rname。3. 用 GeoPandas 和 QGIS 分别跑通七大区划的加载与可视化数据整理好之后下一步是验证它能不能被常用工具正常加载、能不能正确渲染。我一般会同时用代码和桌面端各跑一遍代码端确认数据逻辑桌面端确认视觉效果。3.1 GeoPandas 加载与分区统计的最小命令import geopandas as gpd import matplotlib.pyplot as plt # 加载汇总文件 gdf gpd.read_file(china_seven_regions.shp) # 查看基本信息 print(几何类型, gdf.geom_type.unique()) print(坐标系, gdf.crs) print(记录数, len(gdf)) print(字段列表, gdf.columns.tolist()) # 按大区统计面积 gdf_proj gdf.to_crs(EPSG:3857) # Web Mercator仅用于快速查看 gdf_proj[area_km2] gdf_proj.geometry.area / 1e6 summary gdf_proj.groupby(region_name)[area_km2].sum().reset_index() print(summary) # 快速出图 fig, ax plt.subplots(figsize(12, 8)) gdf.plot(axax, columnregion_name, legendTrue, cmapSet3, edgecolorblack, linewidth0.5) ax.set_title(七大地理区划分布) ax.set_axis_off() plt.tight_layout() plt.savefig(seven_regions_map.png, dpi150)这段代码做了三件事检查数据完整性、按大区做面积汇总、生成分区着色图。columnregion_name让每个大区自动分配不同颜色cmapSet3是一套适合分类数据的配色。如果加载时报错说找不到 .prj 文件说明坐标系信息丢失需要手动指定gdf.crs EPSG:4326再继续。3.2 QGIS 中加载七大区划并配置标注QGIS 加载 Shapefile 的步骤很直接图层 → 添加图层 → 添加矢量图层 → 选择 .shp 文件。但有几个配置项直接影响使用体验第一编码设置。在图层属性 → 源 → 数据源编码里选 UTF-8否则中文标注可能乱码。第二标注配置。右键图层 → 属性 → 标注选择 region_name 字段字体建议用支持中文的字体比如思源黑体。第三样式配置。在符号化里选“分类”按 region_name 字段分类每个大区给一个区分度高的颜色。如果要在 QGIS 里做分区统计可以用“按位置连接属性”工具把点位数据和七大区划做空间连接然后按 region_name 分组统计。这个流程比写代码直观适合不熟悉 Python 的从业者。3.3 单个区划文件与汇总文件的配合使用汇总文件适合做全国尺度的整体分析单个区划文件适合做局部放大和专题制图。我一般会这样配合先用汇总文件确定分析范围和大区边界再按需加载单个区划文件做精细化处理。# 按需加载单个大区 huabei gpd.read_file(region_华北.shp) print(华北几何类型, huabei.geom_type.unique()) print(华北面积, huabei.to_crs(EPSG:3857).geometry.area.sum() / 1e6, 平方公里) # 与点位数据做空间连接 points gpd.read_file(sample_points.shp) joined gpd.sjoin(points, huabei, howinner, predicatewithin) print(落在华北的点位数, len(joined))sjoin的predicatewithin表示点位完全落在多边形内部才算匹配。如果点位在边界上可能需要改成intersects。这个参数选择取决于业务对边界点的处理规则没有绝对对错但要在文档里写清楚。4. 七大区划 Shapefile 避坑指南五个真实踩坑记录这一章记录的是我在使用七大区划数据时实际遇到的问题每条按现象、原因、解决三段式写方便对照排查。4.1 中文属性乱码DBF 文件的编码陷阱现象用 ArcGIS 打开 Shapefile属性表里 region_name 显示为乱码或问号但用 QGIS 打开正常。原因Shapefile 的属性数据存在 .dbf 文件里默认编码是系统本地编码。在中文 Windows 上可能是 GBK在 Linux 上可能是 UTF-8。如果导出时没指定编码跨平台打开就会乱码。解决导出时显式指定encodingutf-8。如果已经乱码可以用 QGIS 的“重新编码”功能修复或者用 Python 的 dbfread 库读取后重新写入。更彻底的做法是改用 GeoPackage 格式它原生支持 UTF-8没有这个问题。4.2 几何无效自相交多边形导致空间运算失败现象做dissolve或intersection时抛出 TopologyException提示某条边自相交。原因省级边界在归并时相邻省份的共享边界可能不完全重合产生极小的缝隙或重叠融合后形成自相交几何。解决在融合前先做几何修复。gdf.geometry gdf.geometry.buffer(0)是常用的一招buffer(0) 能修复大部分自相交问题。如果还不行用gdf.geometry gdf.geometry.make_valid()这是 Shapely 2.0 提供的更可靠的修复方法。4.3 面积计算偏差投影选错导致数据失真现象用 EPSG:4326 直接算面积得到的结果是零点几和实际面积对不上。原因EPSG:4326 是地理坐标系单位是度不是米。直接算面积得到的是平方度没有实际意义。解决先投影到等面积投影再算面积。全国尺度推荐 Albers 等面积投影参数见 2.2 节。如果只做单个大区分析可以用该大区所在的 UTM 带精度更高。4.4 字段名截断Shapefile 的 10 字符限制现象导出后发现 region_name 变成了 region_namsub_region 变成了 sub_regi。原因Shapefile 的 DBF 格式限制字段名最多 10 个字符超出部分被自动截断。解决导出前把字段名改短比如 region_name → rnamesub_region → sname。或者在导出后手动重命名。如果字段名很重要不能改建议改用 GeoPackage 或 File Geodatabase。4.5 单个区划文件缺失批量导出时的命名冲突现象批量导出单个大区文件时发现某个大区的文件没有生成或者被覆盖。原因大区名称里可能包含文件系统不支持的字符比如斜杠或冒号。或者两个大区名称在截断后相同。解决导出前对文件名做清洗把特殊字符替换成下划线。用 region_code 而不是 region_name 做文件名更安全因为编码是纯数字不会有特殊字符问题。5. 七大区划数据的进阶用法从分区统计到自动化出图数据加载和基本统计跑通之后真正体现价值的是把它嵌入到自动化流程里。我一般会把七大区划 Shapefile 作为底图数据配合点位数据做批量分区统计和出图省掉每次手工筛选的麻烦。5.1 批量分区统计的封装函数import geopandas as gpd import pandas as pd import os def batch_region_stats(region_shp, points_shp, output_dir): 批量计算每个大区内的点位数量和统计指标 region_shp: 七大区划汇总文件路径 points_shp: 点位数据路径需包含 value 字段 output_dir: 输出目录 regions gpd.read_file(region_shp) points gpd.read_file(points_shp) # 确保坐标系一致 if points.crs ! regions.crs: points points.to_crs(regions.crs) results [] for _, region in regions.iterrows(): name region[region_name] geom region[geometry] # 筛选落在当前大区内的点位 mask points.within(geom) subset points[mask] if len(subset) 0: results.append({ region_name: name, point_count: 0, value_sum: 0, value_mean: 0 }) continue results.append({ region_name: name, point_count: len(subset), value_sum: subset[value].sum(), value_mean: subset[value].mean() }) df pd.DataFrame(results) os.makedirs(output_dir, exist_okTrue) df.to_csv(os.path.join(output_dir, region_stats.csv), indexFalse, encodingutf-8-sig) return df # 调用示例 stats batch_region_stats( china_seven_regions.shp, sample_points.shp, ./output ) print(stats)这个函数的逻辑是遍历每个大区用within筛选落在其中的点位然后计算计数、求和、均值。encodingutf-8-sig是为了让 Excel 打开 CSV 时中文不乱码。参数说明points必须包含value字段如果字段名不同需要改函数里的列名。如果点位数据量很大逐大区筛选会慢可以改用sjoin一次性连接再分组效率更高。5.2 自动化出图每个大区一张专题图import matplotlib.pyplot as plt import matplotlib # 设置中文字体 matplotlib.rcParams[font.sans-serif] [SimHei] matplotlib.rcParams[axes.unicode_minus] False def plot_each_region(region_shp, points_shp, output_dir): regions gpd.read_file(region_shp) points gpd.read_file(points_shp) if points.crs ! regions.crs: points points.to_crs(regions.crs) os.makedirs(output_dir, exist_okTrue) for _, region in regions.iterrows(): name region[region_name] geom region[geometry] fig, ax plt.subplots(figsize(10, 8)) # 绘制当前大区边界 gpd.GeoSeries([geom]).plot(axax, colorlightgray, edgecolorblack, linewidth1) # 绘制落在其中的点位 mask points.within(geom) subset points[mask] if len(subset) 0: subset.plot(axax, columnvalue, cmapYlOrRd, markersize20, legendTrue) ax.set_title(f{name}区划专题图) ax.set_axis_off() plt.tight_layout() plt.savefig(os.path.join(output_dir, f{name}_map.png), dpi150) plt.close() # 调用 plot_each_region(china_seven_regions.shp, sample_points.shp, ./maps)这段代码为每个大区单独生成一张图边界用灰色填充点位按 value 值着色。cmapYlOrRd是一套从黄到红的渐变色适合表示数值高低。plt.close()很重要不调用的话批量出图时会因为内存泄漏越来越慢。5.3 与 GeoPackage 的互转规避 Shapefile 的先天限制Shapefile 是上世纪 90 年代的格式字段名限制、编码问题、2GB 大小限制都是硬伤。如果项目允许我建议把七大区划数据转成 GeoPackage 格式它支持长字段名、UTF-8 编码、单文件存储而且 QGIS 和 GeoPandas 都原生支持。# Shapefile 转 GeoPackage gdf gpd.read_file(china_seven_regions.shp) gdf.to_file(china_seven_regions.gpkg, layerregions, driverGPKG) # 从 GeoPackage 读取 gdf2 gpd.read_file(china_seven_regions.gpkg, layerregions) print(gdf2.columns.tolist()) # 字段名不会被截断转换后字段名完整保留中文也不会乱码。如果下游工具只认 Shapefile再转回去也不麻烦但建议把 GeoPackage 作为主存储格式。我自己的习惯是拿到任何区划数据先转 GeoPackage 存一份再按需导出 Shapefile 给下游。这样既保留了完整字段又兼容了老工具。七大区划数据本身不复杂但字段结构和坐标系这两件事如果一开始没理清楚后面做空间连接和分区统计时会反复踩坑。希望帮到你。本文还有配套的精品资源点击获取