简介:广东省行政区划SHP文件,面向GIS学习者、规划分析人员及开发者的矢量数据包。内含广东省及下辖地市、县域行政边界,三级行政区要素均可单独提取,适用于地图可视化、空间分析、选址与区域统计等场景。压缩包共17个文件,主体为.shp几何数据、.dbf属性数据、.shx索引、.prj投影文件,并含.adf辅助数据及xml元数据,整体大小17.55MB,数据结构完整。目前已有5625人学习下载,是开展广东省地理数据分析的实用基础数据。借助ArcGIS、QGIS等软件可加载边界,进行行政区域划分、距离量测、设施分布查询等操作;配合属性表还可查看城市名称与编码字段,便于专题制图和数据关联。通过Python GDAL/OGR库可转换为GeoJSON或KML,服务Web端展示与自动化分析。资源适合入门练习与项目应用,能为区域经济、交通规划、人口分布等研究提供可靠的地理框架,免去自行搜集与配准底图的环节。
1. 广东行政区划 SHP 文件:先确认你要的是哪一层
做区域统计、画分级设色图、或者给可视化平台配底图时,广东省行政区划 shp 文件几乎是绕不开的基础矢量数据。我拆过不少这类资源,见过太多人第一次拿到就直接拖进 GIS 软件,随后撞上坐标系偏移、中文乱码、面积算错三道坎——问题往往不在数据本身,而在没有先搞清层级、字段和坐标系这三件事。这份资源解决的是「省—市—区县」边界底图与行政区划代码挂接的问题,适合做地图可视化、空间统计、政务大屏和论文配图的开发者和数据分析师。动手之前多花十分钟确认数据版本,后面能少踩一半坑。
2. 数据底细:层级、字段与坐标系三件套
2.1 四个层级:省界、市界、区县界、乡镇界的取舍
一份完整的广东行政区划 shp 通常按省、市、区县、乡镇四个层级拆成多个独立文件,也有打包成一个文件、用字段区分层级的做法。拿到资源先别急着加载,先列目录看文件后缀和命名,常见命名是「广东_省界.shp」「广东_市界.shp」「广东_区县.shp」,乡镇级文件通常带「乡镇」或 township 字样。
四个层级怎么选,取决于用途。做全省大屏总览,省界文件就够了;做市级 GDP 对比,用市界;做人口密度、教育医疗资源配置这类县级分析,必须落到区县层;街道一级的展示才需要乡镇层。要素数量差别非常大,文件体积也跟着涨,区县层一般几百 KB 到几个 MB,乡镇级可能到几十 MB,加载和渲染速度差一个量级。我帮某开发者做过区县财政数据可视化,他一开始把乡镇层也加载进来,缩放到省界时明显卡顿,去掉乡镇层后流畅很多。数据本身没问题,用错场景就要付出性能代价。
| 层级 | 要素数量(广东) | 典型用途 |
|---|---|---|
| 省界 | 1 | 全省总览底图 |
| 市界 | 21 个地级市 | 市级指标对比 |
| 区县界 | 百余个区县 | 县域专题图、空间统计 |
| 乡镇界 | 一千多个乡镇街道 | 街道级精确展示 |
另一个要确认的是数据精度和出图年份。同样一套省界,1:100 万比例尺的简化版和 1:25 万精细版,边界细节差别很明显,尤其是沿海岸线和岛屿周边。做全省概览用简化版完全没问题,但做某个市或区县的局部放大图,简化版边界会显得很「糙」,这时候必须换精细层级的数据。我一般拿到资源先缩放到区县边界看一眼,如果锯齿太明显,就说明这版数据不适合局部特写。
2.2 字段结构:NAME、PAC、ADCODE 各管什么
shapefile 不是一个单文件,而是至少四个 sidecar 文件组成的集合:.shp 存几何、.shx 存索引、.dbf 存属性、.prj 存坐标系描述。很多人只拷贝了 .shp 就发给别人,结果对方打不开,或者只能看到图形看不到属性,问题多半出在这里。
属性表里最常见的字段是 NAME、PAC 和 ADCODE,不同来源叫法略有差异。NAME 存中文名称,比如「广州市」;PAC 和 ADCODE 本质都是行政区划代码,只是有些数据叫 PAC、有些叫 ADCODE、还有的叫 CODE。这个数字代码是挂接统计数据的核心,比名称可靠得多,因为名称可能出现「市」「区」后缀不一致的问题,而代码是唯一且稳定的。
行政区划代码有明确的层级规则。以广东省为例,前两位 44 表示广东省,第 3、4 位表示地级市,第 5、6 位表示区县,最后三位表示乡镇。比如 440103 拆开就是 44(广东)、01(广州)、03(越秀区)。这个规律在做按前缀过滤时非常有用,后面章节会用到。
| 位置 | 含义 | 广东示例 |
|---|---|---|
| 前 2 位 | 省 | 44 |
| 第 3、4 位 | 地级市 | 01(广州)、03(深圳)、06(佛山) |
| 第 5、6 位 | 区县 | 03(越秀区) |
| 后 3 位 | 乡镇 | 001 |
用 PAC 做关联时我踩过一个坑:有的数据是 6 位代码(只到区县级),有的是 9 位甚至 12 位,直接 merge 永远匹配不上。必须先把位数统一,再转成字符串关联,不然查半天都不知道错在哪里。某些资源里 PAC 字段还会被读成数字类型,前导零被丢掉,440103 变成 440103 倒还好,但像 4401 这类短代码就有大问题。
2.3 坐标系选型:CGCS2000、WGS84 与 GCJ-02 怎么选
坐标系是 shp 里最容易被忽略、也最容易出问题的部分。广东省这套数据,正规来源一般基于 CGCS2000 国家大地坐标系,对应 EPSG:4490(地理坐标)或带号的高斯投影。而从 GPS 设备拿到的经纬度、从国际开源数据集拿到的数据,通常是 WGS84(EPSG:4326)。两个坐标系在中国范围内差距很小,量级在几十厘米到一两米,画大区域底图看不出差别,做高精度分析就会暴露。
更麻烦的是国内互联网地图用的 GCJ-02 加密坐标,和 WGS84 差了几百米。如果把 shp 直接叠加到国内互联网地图底图上,会看到县界和道路错开一截,这不是数据坏了,是坐标系没对齐。网上很多坐标纠偏工具就是专门处理这个的。
拿到 shp 第一件事,先看 .prj 文件里写了什么。用文本编辑器打开 .prj,能看到类似 PROJCS["CGCS2000 / 3-degree Gauss-Kruger CM 114E"] 的描述。如果 .prj 缺失,GIS 软件会按 WGS84 解释,这是后续一切偏移的根源。
| 坐标系 | EPSG | 使用场景 | 与 WGS84 差异 |
|---|---|---|---|
| WGS84 | 4326 | GPS、国际数据、GeoJSON | 基准一致 |
| CGCS2000 | 4490(地理)/ 4547 等(投影) | 国内官方数据、天地图 | 厘米级 |
| GCJ-02 | 无官方 EPSG | 国内互联网地图 | 数百米偏移 |
如果只是做 Web 可视化、把数据转成 GeoJSON 给前端用,选 WGS84 最省事;做国土、规划相关的严肃分析,保留 CGCS2000 原坐标系,不要随意转换。我在某项目里遇到过把 CGCS2000 当 WGS84 用的情况,边界和遥感影像对不上,排查半天才发现是 .prj 描述被软件自动忽略了。
3. 把数据跑起来:QGIS 加载、过滤与导出
3.1 加载与中文编码修复
拿到 shp 之后,我习惯先用 QGIS 打开看一眼。加载方式很简单:菜单 Layer → Add Layer → Add Vector Layer,或者直接把 .shp 文件拖进地图窗口。
第二步是确认属性表有没有乱码。右键图层 → Open Attribute Table,如果 NAME 字段显示成「鍦嬪尯」这类乱码,说明 .dbf 文件是 GBK/GB18030 编码,而 QGIS 默认按 UTF-8 读取了。修复习惯是:加载时在数据源管理器里手动指定编码为 GBK 或 GB18030。已经加载进来的图层也可以右键图层 → Layer Properties 修改编码,但某些版本改完不生效,直接重新加载更省事。
如果用 Python 做批量处理,常用 geopandas 读取,编码参数必须显式指定:
import geopandas as gpd # 关键:dbf 属性表是 GBK 编码,必须和文件实际编码一致 gdf = gpd.read_file("广东_区县.shp", encoding="gbk") # 查看前几行,确认 NAME 字段正常显示 print(gdf.head()) # 查看字段列表和坐标系信息 print(gdf.columns.tolist()) print(gdf.crs)encoding="gbk"是多数国内 shp 资源属性表使用的编码,读取乱码时依次试gbk、gb18030、utf-8,哪个不乱码就用哪个。gdf.crs会输出坐标系描述,如果打印结果是None,说明 .prj 文件缺失或没被识别,后面要手动指定。
3.2 属性表过滤与子集导出
很多场景下不需要全省数据,只要某个市的区县边界。比如做广州的专题分析,用行政区划代码前缀过滤即可。广州是 4401,深圳是 4403,佛山是 4406,东莞是 4419。
QGIS 里的操作是右键图层 → Filter,输入表达式:
"PAC" LIKE '4401%'这条表达式的含义是从属性表筛选 PAC 字段以 4401 开头的所有要素,得到广州市范围内的区县。LIKE 是模糊匹配,% 是通配符。用代码过滤比名称匹配更稳,因为名称可能带「市」「区」后缀,而且有些数据里名称字段是繁体或带空格。
代码方式更直接,过滤后还能导出子集:
import geopandas as gpd gdf = gpd.read_file("广东_区县.shp", encoding="gbk") # PAC 统一转成字符串再判断前缀 gdf["PAC"] = gdf["PAC"].astype(str) guangzhou = gdf[gdf["PAC"].str.startswith("4401")] # 导出子集,输出编码指定为 UTF-8 guangzhou.to_file("广州_区县.shp", driver="ESRI Shapefile", encoding="utf-8") print(guangzhou.shape)astype(str)是为了防止数字类型导致前缀判断失败,部分数据把 PAC 存成整数,短代码的前导零会丢。to_file里的encoding="utf-8"建议显式写,不写的话默认输出系统编码,换电脑就会出现第二次乱码。
提示:用
startswith做前缀过滤时,先把全部代码zfill(9)补足位数,否则 6 位代码和 9 位代码混在一起,过滤结果会少数据。
3.3 投影转换与面积计算
画图可以先用原始坐标系,但涉及面积计算,就要在正确的投影坐标系里做。直接在地理坐标系(经纬度)下算面积,结果单位是「度²」,毫无实际意义。常见做法是把数据转到高斯-克吕格投影或等积投影再计算。
广东东西跨度大,大致从东经 109° 到 117°,覆盖 3 度带的 111°E、114°E、117°E 三条中央经线,用单一投影带算全省面积必然有误差。只算珠三角某几个市,选中央经线 114°E 的 CGCS2000 3 度带投影比较合适:
import geopandas as gpd gdf = gpd.read_file("广东_区县.shp", encoding="gbk") # 转换到 CGCS2000 3 度带,中央经线 114°E,单位是米 gdf_proj = gdf.to_crs("EPSG:4547") # 投影坐标直接算面积,平方米换算成平方公里 gdf_proj["area_km2"] = gdf_proj.geometry.area / 1_000_000 print(gdf_proj[["NAME", "area_km2"]].head())EPSG:4547是 CGCS2000 3 度高斯投影、中央经线 114°E 的编码,适用于广州、深圳、佛山、东莞等珠三角城市。geometry.area / 1_000_000把平方米换算成平方公里。数据覆盖全省不同经度时,更好的选择是改用等积投影,或者在 QGIS 字段计算器里用$area——它调用项目的椭球参数,不受显示投影影响。我做全省面积统计时,习惯把$area结果和to_crs("EPSG:4547")的结果对比一次,偏差超过 1% 就说明投影选择有问题。
注意:
EPSG:4547只适用于中央经线 114°E 附近区域,湛江、汕头等东西两头的城市要对应换到 111°E 或 117°E 的带号,别指望一个投影带吃下整个广东。
4. 避坑排查:五个高频翻车现场与处理思路
4.1 中文乱码:属性表全是「鍦嬪尯」
现象:加载 shp 后,NAME、市、区等中文属性字段显示为一串乱码,或被问号替代。
原因:shapefile 的 .dbf 属性表使用本地系统编码,国内数据多为 GBK/GB18030,而现代 GIS 软件默认按 UTF-8 读取,编码不一致导致解码错乱。部分资源的 .cpg 文件(记录编码)缺失或内容为空,软件只能靠猜。
解决:加载时手动指定编码。QGIS 数据源管理器里选 GBK 或 GB18030;Python 读取时加encoding="gbk",还乱就换gb18030。如果数据要分发,用 ogr2ogr 统一转成 UTF-8:
ogr2ogr -f "ESRI Shapefile" 广东_区县_utf8.shp 广东_区县.shp -lco ENCODING=UTF-8-lco ENCODING=UTF-8在写入 .dbf 时显式声明编码,下游不管用 QGIS 还是代码读取,都能正确显示中文。
4.2 图形偏移几公里:.prj 缺失导致坐标系被默认
现象:图层能加载,但叠加到遥感影像或互联网底图时,边界整体偏移几十米到几百米,形状不变,位置不对。
原因:最常见的是 .prj 文件缺失或损坏。软件无法得知坐标系,默认按 WGS84 处理。如果数据真实坐标系是 CGCS2000,差异虽不大,但叠加影像依然看得出错位;如果真实坐标系是某个投影带,偏差可能到几公里。
解决:先用ogrinfo查看完整元数据,确认坐标系描述:
ogrinfo 广东_区县.shp -so -al | grep -i crs如果 .prj 缺失,在 QGIS 里右键图层 → Layer CRS,手动选择正确坐标系,如 EPSG:4490 或对应投影带,不要让软件用默认值。代码里用 geopandas 则显式赋值gdf = gdf.set_crs("EPSG:4490")。
注意:
set_crs是声明已有坐标系,to_crs是转换坐标系,两行代码效果完全不同,写反了数据就真的偏了。
4.3 面积算出来离谱:在 Web 墨卡托或经纬度下算面积
现象:算出来某个区县面积只有几平方公里,或者全省面积和公开统计数据差一个数量级。
原因:在 EPSG:4326 下,几何单位是度,area算出来是度²;在 Web 墨卡托 EPSG:3857 下单位虽然是米,但墨卡托投影在纬度越高处面积扭曲越严重,广东在北回归线附近,面积偏差可达 20% 以上。
解决:用等积投影,或者用 QGIS 项目设置里的椭球面积。代码里最稳妥是转换到合适的投影再计算。一个快速验证方法是 QGIS 字段计算器里直接用$area,这个表达式基于项目设置的椭球参数,不受显示投影影响。把$area的结果和to_crs("EPSG:4547")的结果对比一次,误差在 0.5% 以内说明投影带选对了。
4.4 合并后出现「飞地」与多部件多边形:统计口径出错
现象:两个相邻区县合并后,某些要素内部出现小洞,或者一个区县由多个不相连的多边形组成,叠加统计时数据重复或漏算。
原因:行政区划数据存在多部件要素(MultiPolygon),比如区县包含江心岛,或历史上存在飞地。另外,原始数据自相交或缝隙未闭合,也会在空间操作时产生异常。
解决:先做几何有效性检查,再用零缓冲修复:
import geopandas as gpd gdf = gpd.read_file("广东_区县.shp", encoding="gbk") # 检查有效几何数量 print(gdf.geometry.is_valid.sum(), "个有效,共", len(gdf)) # buffer(0) 是经典修复手法,处理自相交和缝隙问题 gdf["geometry"] = gdf.geometry.buffer(0) print(gdf.geometry.is_valid.sum(), "个有效")buffer(0)零缓冲技巧是处理多边形拓扑问题的常规手段,让每个要素重新构建边界,消除自相交和未闭合缝隙。做完之后再跑空间合并、相交统计,结果才可信。多部件要素存在不代表数据错误,展示时保留即可,统计时要按行政区划代码去重,避免一个区县被算多次。
4.5 文件打不开或合并报错:sidecar 文件缺失
现象:双击 .shp 没反应,软件报 Failed to open file,或者 QGIS 里只显示空图层。
原因:shapefile 是复合格式,.shp、.shx、.dbf 缺一不可。有人只传了 .shp,几何数据有了但属性数据和索引缺失,软件无法完整解析。另一个原因是文件损坏,下载中断导致截断。
解决:确认同一目录下至少有 .shp、.shx、.dbf 三个文件,.prj 最好也有。收到压缩包先解压再加载,不要直接拖压缩包。文件损坏就重新下载,或者用 QGIS 的修复几何工具跑一遍。分发给别人之前,我的习惯是压缩成 zip 再发,避免单个 sidecar 文件被漏发。
5. 进阶用法:用这份数据做一张区县人口密度专题图
5.1 外接统计表与分级设色
把 shp 的几何和外部统计数据关联起来,是这份资源最常用的进阶玩法。外接表可以是 CSV、Excel 或数据库查询结果,关联键建议用行政区划代码,因为名称常带「市」「区」后缀,容易对不上。关联前先把两边的代码都转成字符串并补足位数:
import pandas as pd import geopandas as gpd gdf = gpd.read_file("广东_区县.shp", encoding="gbk") pop = pd.read_csv("区县人口.csv", dtype={"区县代码": str}) # 关键:两边的关联键统一成字符串,位数也要一致 gdf["PAC"] = gdf["PAC"].astype(str).str.zfill(9) pop["区县代码"] = pop["区县代码"].str.zfill(9) merged = gdf.merge(pop, left_on="PAC", right_on="区县代码", how="left") merged["密度"] = merged["人口"] / merged["面积_km2"]zfill(9)补齐前导零,很多代码存成数字后开头的 0 会丢。how="left"保留所有区县要素,匹配不上的行显示为 NaN,这批数据要重点检查,通常是统计年报和行政区划底图的代码版本不一致导致的。
关联好之后用 matplotlib 出图是最快的验证方式。分级方法选分位数(Quantiles),保证每档要素数量接近,适合人口密度这类偏态分布数据:
import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=(10, 12)) merged.plot( column="密度", scheme="Quantiles", k=5, cmap="YlOrRd", ax=ax, legend=True, legend_kwds={"fmt": "{:.0f} 人/km²", "loc": "lower right"}, ) ax.set_axis_off() plt.tight_layout() plt.savefig("广东人口密度.png", dpi=300, bbox_inches="tight")scheme="Quantiles"表示分位数分级,k=5是 5 档,cmap="YlOrRd"黄到红渐变适合密度类数据。dpi=300出印刷级清晰度,屏幕预览 150 足够。这套参数我反复调过,深色渐变配白底最稳妥,很少翻车。
5.2 导出 PNG 与转换为 Web 底图
论文配图用上面导出的 PNG 就够,但做 Web 可视化就得转成 GeoJSON,坐标系必须转成 WGS84,前端地图控件基本只认这个:
ogr2ogr -f GeoJSON 广东_区县.geojson 广东_区县.shp -t_srs EPSG:4326 -lco RFC7946=YES-t_srs EPSG:4326做坐标转换,-lco RFC7946=YES按 GeoJSON 官方标准输出。原始数据过细导致文件几十 MB 时,前端加载会明显卡顿,再加一个简化参数:
ogr2ogr -f GeoJSON 广东_区县_简化.geojson 广东_区县.shp -t_srs EPSG:4326 -simplify 0.001-simplify 0.001是 Douglas-Peucker 算法的容差,单位与目标坐标系一致,0.001 度约等于 100 米,做全省概览完全够用。用 ECharts 注册地图时,还要确认每个要素都带 name 属性,转换命令里别把属性字段丢了。
我在多个项目里养成一个习惯:拿到任何 shp,先跑一遍ogrinfo看坐标系和字段,再确认编码,第三步才算面积验证,最后才进入可视化。这套动作十分钟不到,帮我拦下了至少三次坐标系错配和两次编码乱码导致的返工。希望这篇笔记能让你少走同样的弯路,拿到数据先摸清底细,再动手画图。
本文还有配套的精品资源,点击获取