七大分区GIS数据包实战:Shapefile、坐标系与区域统计避坑
简介中国七大地理分区华北、东北、华中、华东、西北、西南、华南标准GIS矢量边界数据包面向区域规划、生态评估、政策研究等中尺度分析场景。每个分区单独成集另附全国七区合并Shape文件可直接用于ArcGIS、QGIS及Pythongeopandas/shapely等主流平台解决宏观地理单元快速制图与空间统计的底图需求。压缩包共68个文件以shp、shx、dbf、prj、cpg等格式为主均已完成坐标系统一、属性结构规范化与编码声明开箱即用整体仅1.26MB轻量易载。已有151人查看学习。配套的gis_viewer.py脚本可帮助不熟悉桌面GIS的初学者快速预览与检索分区边界适合地理信息相关专业学生、科研人员及需要宏观分区底图的从业者。1. 同样是全国矢量为什么这份“七大分区包”比单层全国文件更好用很多人在拿到一份中国七大地理分区标准 GIS 数据包之后第一反应是解压、双击.shp文件、看地图长什么样。这个习惯不算错但真正决定这份数据能不能用于后续统计、能不能跟其他图层叠加、能不能放心交给下游的不是图形好不好看而是压缩包里那几个几 KB 的附属文件。七大地理分区包的价值恰恰在于它把“全国”这个巨大范围拆成了华北、东北、华中、华东、西北、西南、华南七个可独立操作的单元同时又保留了合并版让整体统计不必自己拼图。对做区域分析、可视化大屏、选址评估或者教学演示的从业者来说这套数据解决的是三个具体问题一是单层全国 Shapefile 动辄几百 MB裁剪一个片区要等半天二是自己按省界手动合并分区经常出现属性丢失和边界重叠三是分区口径五花八门不同来源的数据边界对不齐。下面我按自己处理这类数据的流程从文件结构讲到加载检查再讲划分口径和踩坑最后给出一套能直接落到项目里的用法。2. 拆解数据包分区 Shapefile 与合并版到底装了什么2.1 一个标准分区 Shapefile 的文件清单与命名约定Shapefile 不是单个文件而是至少三个文件组成的集合。打开压缩包时你会看到每个分区对应一组文件命名通常类似region_north.shp、region_north.shx、region_north.dbf、region_north.prj有时还有region_north.cpg和region_north.sbn。这套命名本身没有强制标准但“一个分区一组文件”的结构是通用的。先搞清楚这些后缀名的分工.shp几何数据主文件存点、线、面的坐标和形状。.shx几何索引文件让 GIS 软件能快速定位某条记录的位置删除会导致读取极慢。.dbf属性表文件存每个要素的非空间属性比如名称、分区码、面积。.prj坐标系描述文件纯文本告诉软件“这份数据的坐标是经纬度还是投影坐标基于哪个椭球体”。.cpg声明.dbf的字符编码常见内容是UTF-8或GBK。很多人只复制.shp文件走到了同事那里一加载就报错这叫“文件不完整”不是软件问题。交付数据时.shp、.shx、.dbf和.prj四个文件必须整套拷贝缺一个都不能保证正常使用。我一般会把每个分区文件夹单独命名例如01_huabei/、02_dongbei/这种带序号的结构。序号不是随便排的它决定了后续脚本遍历分区时的顺序。如果你用 Python 批量处理稳定命名的好处很快能体会到。2.2 合并版和分区版结构、字段与适用场景的差别数据包里通常有两种形态分区版和合并版。分区版是七个独立的 Shapefile每个文件只包含对应区域的全部要素合并版则是把七张图融合成一张文件名常见的是china_merged.shp或china_7regions.shp。分区版适合做“局部操作”。举例来说你要做西南片区的路网密度分析直接读取region_southwest.shp裁剪、投影变换都在这个图层内完成不会被其他片区干扰。如果只有一张全国合并版你还得先用裁剪工具把西南区域切出来多一步操作而且剪切边界处容易产生碎屑多边形。合并版适合做“整体统计”和“跨区对比”。因为合并版通常会在属性表里额外增加一个分区字段比如REGION值为NORTH、EAST等分区代码。用 SQL 或 pandas 按这个字段分组汇总一次就能输出七个分区的统计数据不必循环读七个文件再拼接。值得注意的是合并版有两种生成方式第一种是简单 Merge也就是把七张图直接拼接不删除内部边界这种合并版仍然保留了每个分区作为独立多边形的属性第二种是 Dissolve也就是按分区字段融合删除相邻分区之间的共同边界使整个片区变成一个大面。拿到数据包后先看一眼属性表里有多少要素如果要素数量是几十个说明内部还留存着市级甚至县级边界如果只剩七个要素说明已经做了溶解。两种都能用但统计逻辑不一样后面会说。2.3 坐标系WGS84 与 CGCS2000 怎么选prj 文件在说什么“标准”二字在 GIS 数据里最容易引起误会。同一套几何边界用 WGS84 经纬度存储和用 CGCS2000 高斯投影存储坐标数字完全不同但在地球上的位置几乎一致。绝大多数网上下载的免费数据包会用 WGS84 经纬度也就是 EPSG 代码 4326因为这是在线底图如卫星影像、街道图的通用坐标系叠加时最省事。如果你的下游是国土、测绘相关业务可能会要求 CGCS2000也就是 EPSG 4490 或带投影的相应分带。打开.prj文件能直接看到坐标系定义比如 WGS84 的.prj里会有GEOGCS[GCS_WGS_1984, DATUM[D_WGS_1984, SPHEROID[WGS_1984,6378137.0,298.257223563]]]这样的文本。CGCS2000 的写法类似但椭球体参数不同。我的习惯是先看.prj再决定要不要转换。如果只是画专题图和做省级汇总WGS84 完全够用如果要做面积计算且要求数值与国土口径对得上建议把数据投影到 Albers 等积投影或 CGCS2000 的分带投影。这里有个细节很多人用 WGS84 经纬度坐标直接算面积算出来是“度²”数值毫无意义。用geopandas计算面积前必须先投影这个坑在第 5 章会展开。3. 从压缩包到能用的地图加载与完整性检查3.1 用 QGIS 把分区包变成一张可编辑地图拿到数据后我通常先做三件事解压到纯英文路径、打开 QGIS、把七个分区拖进去。路径用中文很多时候也能跑但在后续做数据处理或编写脚本时中文路径会引发各种莫名其妙的编码错误这是一条省心的基础习惯。操作步骤很简单解压下载的压缩包确认文件夹内有完整文件注意检查.prj是否存在。打开 QGIS直接把region_north.shp等文件拖入图层窗口。如果同时拖入多个分区软件会提示选择坐标参考系选择与.prj一致的选项即可。右键图层选择“打开属性表”确认要素数量和字段内容。在图层列表里右键进入“图层属性 → 信息”查看“坐标系”一栏是否显示WGS 84或CGCS2000。拖进去之后看到地图只是第一步真正的检查在第三个小节。3.2 用 Python 读取 Shapefile打印几何数量与范围QGIS 适合肉眼检查但要做质量验证我习惯写一段 Python 脚本。使用geopandas读取 Shapefile并输出几何数量、坐标系和范围四至。代码长这样import geopandas as gpd # 读取分区 Shapefile gdf gpd.read_file(01_huabei/region_north.shp) # 打印要素数量和几何类型 print(要素数量:, len(gdf)) print(几何类型:, gdf.geom_type.unique()) # 打印坐标系 print(坐标系:, gdf.crs) # 打印范围四至minx, miny, maxx, maxy print(范围四至:, gdf.total_bounds) # 检查几何有效性 print(无效几何数量:, (~gdf.geometry.is_valid).sum())这段代码的意图很直接gdf.crs会返回一个CRS对象如果显示为空或None说明.prj缺失或读取失败total_bounds返回四个浮点数分别是左下角和右上角的坐标is_valid是 Shapely 提供的几何自相交检验返回False表示该要素存在自相交等拓扑问题。建议把这段脚本保存为check_data.py每次拿到新数据都跑一遍。参数上没有太多要改的唯一要注意的是gpd.read_file()的路径分割符Windows 下用双反斜杠或pathlib.Path更稳妥。如果文件读取报中文编码错误可以在read_file里加上encodingutf-8或encodinggbk参数。3.3 三个必看的质量指标边界闭合、要素数、范围四至加载成功不代表数据可靠。我筛选数据时只看三个指标其余交给业务验证。第一是范围四至。七大分区合并版的纬度下界应当覆盖到我国最南端的岛屿区域数值大约在纬度 3° 附近。如果合并版的四至中最小纬度是 18°说明数据只覆盖到大陆和海南岛的一部分漏掉了南部岛礁。这种情况在网上下载的廉价数据包里很常见做“全国完整”展示时就会翻车。用刚才打印的total_bounds就能快速判断。第二是要素数量。分区版每个文件应包含几十到几百个要素具体取决于数据粒度。如果某个分区只有一个要素那大概率是已经被 Dissolve 成整体了如果分区文件里出现上千个要素说明还带着乡镇级碎片进行区域统计时会产生偏差。合理的数量要和你的业务粒度匹配不用强求一致。第三是边界闭合。检查方式是看is_valid是否有 False以及用gdf.explode()之后看看是否有零长度线段。闭合问题通常肉眼看不出来但会在计算面积、生成缓冲区时暴露。如果在检查时发现无效几何较多可以用gdf.geometry gdf.geometry.buffer(0)做一次修复这是 GIS 圈常用的“后悔药”效果立竿见影但要注意它会微调坐标精度。4. 七大分区不是拍脑袋口径差异与属性字段设计4.1 自然地理、行政大区与经济分区同一片区的边界为何有多个版本七大地理分区这个概念在中学课本、气象预报、经济统计里都会出现但口径并不统一。常见做法是把全国划分为华北、东北、华东、华中、华南、西南、西北七个区域可“华北”具体包含哪些省级单元至少有三套说法。自然地理分区看山脉和河流比如秦岭-淮河一线是南北方分界长城沿线是农牧交错带华北平原和黄土高原的边界在不同地貌学教材里画法不同。行政大区则沿用了历史上大区机构的管辖范围与自然边界并不完全重合。经济区划又会把一些地理上属于华南的省份划入华东经济圈。所以当你手里拿着两个来源的七大分区数据时边界对不上不一定是谁错了很可能是口径不同。市面上的 GIS 数据包一般标注了采用哪种口径。我拿到数据后会先看属性表里的名称字段再对比一个已知片区的范围比如把华北的轮廓跟省级边界叠加看是否与官方行政边界一致。这一步虽然基础但能避免你拿“自然地理版华北”去做“行政统计版华北”的决策那是实打实的黑匣子风险。4.2 属性表字段分区码、名称、面积字段怎么对应标准数据包的属性表通常包含以下几类字段要素名称、拼音或英文名、分区代码、要素类型和面积。以合并版为例字段常设计为FID要素序号软件自动生成无实际业务含义。NAME要素名称可能是省级名称或地市级名称。PYNAME拼音名称便于程序匹配。REGION分区码值为NORTH、EAST等七种之一。AREA面积字段单位为平方米或平方千米。SHAPE_LEN/SHAPE_AREA软件自动生成的周长和面积由原数据集的坐标系决定。有一个参数要特别注意老式 Shapefile 的.dbf字段名最长不超过 10 个字节中文最多只能存 3 个汉字所以很多数据包会用拼音作为字段名比如XZQMC表示行政区名称。用geopandas读取后看到奇怪字符时不要慌先打印gdf.columns查看所有字段名。关于面积字段如果数据带的AREA是按原坐标系算出来的而你把数据重新投影到另一个坐标系这个字段就失效了。正确做法是投影后自己用gdf.geometry.area重新计算。计算时注意单位WGS84 经纬度下geometry.area得到的是平方度不是实际面积。4.3 合并版数据的拓扑真相共享边界与独立多边形分区版和合并版最容易被误读的一点是相邻两个区域是否共享同一条边界。在分区版中华北和东北是两张独立的表中间的行政边界在两张表中各画了一遍理论上坐标一致但实际生产中常因数据源不同差几米到几十米。合并版如果没有经过拓扑处理内部仍然保留这些重复线段看起来是一张图地理上却是相互重叠的面。正确合并流程是先校验几何再执行 Dissolve。用geopandas做 Dissolve 的代码如下import geopandas as gpd # 读取七个分区并合并 regions gpd.read_file(01_huabei/region_north.shp) for name in [02_dongbei, 03_huazhong, 04_huadong, 05_xibei, 06_xinan, 07_huanan]: path f{name}/region_{name.split(_)[1]}.shp gdf gpd.read_file(path) regions pd.concat([regions, gdf], ignore_indexTrue) # 按分区字段融合消除内部边界 merged regions.dissolve(byREGION) # 输出融合后的分区块数 print(merged[REGION].value_counts())这段代码的第 7 行执行了核心操作dissolve(byREGION)会按分区码聚合几何对象相邻多边形的公共边界被移除输出结果中每个分区变成单一要素。参数by支持任意字段如果你只想保留省级边界就改成按省份字段溶解。dissolve之后的属性表会丢失非聚合字段所以需要提前把重要字段保存在列表里。需要说明的是dissolve解决的是共享边界问题但如果原始七个分区之间存在缝隙融合后的几何依然有洞。这类缝隙通常出现在河流改道后的边界调整区肉眼难见后续做面积统计时会出现“面积缺失”。处理办法是下一章要说的几何修复流程。5. 避坑排查打开 Shapefile 后最常见的五个翻车现场5.1 投影警告一加载就提示“未知坐标系”现象把 Shapefile 拖进 QGIS 或 ArcGIS软件弹窗提示“未知空间参考”地图自动叠加到了错误位置与其他图层错位明显。原因八成是.prj文件丢失或者.prj文件与.shp文件不配套。少数情况是.prj里写了合法的坐标系但软件不识别其文本写法。解决先看文件目录里有没有.prj。没有的话根据数据来源判断坐标系常见做法是选择WGS 84 / EPSG:4326进行手动指定。有.prj但软件不识别时用文本编辑器打开.prj把坐标系文本替换为标准写法。事后必须再跑一次 3.2 小节的脚本确认gdf.crs不再是空值。5.2 面积统计翻倍看似“完整”的合并版其实有重叠面现象用合并版计算各分区面积总和发现比官方统计面积大了将近一倍尤其是相邻分区交界处的区域面积明显异常。原因分区块之间没有做拓扑融合而是直接把多个多边形拼接在一起。当dissolve没有正确执行或者原始数据本身就存在重叠要素时面积被重复计算。这类数据在图形上几乎看不出问题属于典型的“黑匣子”隐患。解决先用 3.2 节的脚本检查无效几何数量再用dissolve重新融合。融合后如果依然异常可以用geopandas的overlay(howunion)检查重叠区输出重叠区域的面积分布定位到具体是哪个板块出了问题。这一步我通常放在所有面积统计之前。5.3 属性表中文乱码编码问题的三个排查步骤现象在 QGIS 里打开属性表中文名称全部显示为“鍖楀寳”这类乱码但图形本身正常。导出为 CSV 后同样是乱码。原因Shapefile 的.dbf文件不是标准文本文件它的编码靠.cpg文件声明。当.cpg缺失或被误写软件只能按系统默认编码读取。国内数据多为GBK部分新制数据用UTF-8读错就会乱码。解决按三步排查。第一步查看有没有.cpg文件用文本编辑器打开看内容是UTF-8还是GBK。第二步QGIS 中右键图层选择“图层属性 → 数据源”手动切换编码设置。第三步如果还是乱码检查数据是在哪个环节被重新导出过因为有些转换工具会统一转成UTF-8并重新生成.cpg。用 Python 读取时可在read_file()中显式指定encodingGBK没有万金油参数试这两个值即可。5.4 相邻分区边界对不齐看到的白缝其实不是 bug现象缩小视图时两个分区之间的边界出现一条细细的白线或者放大后发现边界两侧图形有轻微错位。原因一是数据显示精度问题较小的缩放级别下 GPU 渲染对多边形边界的插值取舍不同二是两个分区数据的原始边界坐标确实不一致差几个小数点后的位数缩放后肉眼可见。前者是渲染问题不是数据错误后者才是数据精度差异。解决先放大到最大精度检查确认错位是否超过数据精度。QGIS 中可在“工程属性”里开启“快取矢量”并在渲染设置中调高几何精度。若确认是数据边界不一致需要以权威行政边界为准进行对齐这属于高级拓扑编辑一般分析场景下不必强求。5.5 要素包含海域片区统计时把岛屿也算成了“陆地”现象计算华南区域的土地面积时数值比陆地面积大不少或者在做专题图时整个片区底部被大面积色块覆盖看起来连海都填了颜色。原因很多全国矢量包在制作时直接以海岸线为边界提取要素而海岸线数据可能包含大陆与近海岛屿之间的水体。此外河流入海口处的面要素常常跨水陆两界。简单按分区或按名称筛选无法解决因为问题出在几何数据本身。解决用陆地面数据做裁剪。准备一份全国陆地面矢量或使用带海陆属性的基础要素执行overlay(howintersection)将数据限制在陆地范围内。如果只是制图需求可以在符号化时设置透明度把海域底图透出来看起来就不像“陆地侵海”。但做统计时一定要裁剪否则结果不能用于业务决策。6. 把标准包用出花区域聚合、专题制图与数据验证6.1 按 REGION 字段做聚合统计一分钟出区域报表数据包最有价值的用法之一是按分区做聚合统计。假设你的数据表里有每个地市的人口字段POP按七大分区汇总只需几行代码import pandas as pd import geopandas as gpd # 读取合并版 gdf gpd.read_file(china_merged.shp, encodingutf-8) # 按分区字段聚合人口 report gdf.groupby(REGION)[POP].agg([sum, mean, count]) report.columns [总人口, 平均人口, 要素数量] # 按总人口排序 report report.sort_values(总人口, ascendingFalse) print(report)这段代码默认读取字段名为POP如果你的数据字段名不同改尖括号里的字段名即可。agg([sum, mean, count])同时计算总和、均值与数量适用于大多数区域对比场景。注意如果POP字段是字符串类型会报分组异常先执行gdf[POP] pd.to_numeric(gdf[POP], errorscoerce)做类型转换。6.2 专题制图用规则分级还是分类配色制图是区域数据的核心呈现方式。七大分区做渲染时我一般不采用“每个分区一个颜色”的定性配色因为分区之间不具备连续渐变关系。更好的做法是按你统计的数值做分级比如人口密度、GDP 总量或其他指标。QGIS 中操作流程是右键图层 → 符号化 → 选择“分级”或“分类” → 选择数值字段 → 设置分级数量推荐 5 到 7 级。色带选择建议用色盲友好的方案例如YlOrRd或Blues系列。分级方法有“等间距”“分位数”“自然间断点”三种分位数适合方差大的数据自然间断点适合有明显聚类的数据。用规则分级还是分类配色本质取决于数据分布而不是个人审美。6.3 交付前用三个指标验证数据可用性最后分享一个我固定的验收习惯。所有 GIS 数据包不管来源我都会跑一遍同样的验证脚本记录三个指标要素总数、无效几何数、坐标系标准。只要无效几何数为 0坐标系与业务要求一致要素总数符合预期粒度这份数据就可以进入生产流程。如果任何一个不达标直接退回修数而不是带病使用。这套习惯帮我在不止一个项目里避免了大返工。有一回做某跨平台系统的区域统计数据包的华北片区要素看起来正常但跑完dissolve后出现了几百条重叠边界导致统计面积虚高。后来定位到是原始文件里藏了两套边界线一套是行政边界一套是地貌边界。从那之后我拿到任何数据都会先跑完整检查再动手。严谨不是强迫症是对数据负责。希望帮到你。本文还有配套的精品资源点击获取