简介广东省行政区划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 设备拿到的经纬度、从国际开源数据集拿到的数据通常是 WGS84EPSG:4326。两个坐标系在中国范围内差距很小量级在几十厘米到一两米画大区域底图看不出差别做高精度分析就会暴露。更麻烦的是国内互联网地图用的 GCJ-02 加密坐标和 WGS84 差了几百米。如果把 shp 直接叠加到国内互联网地图底图上会看到县界和道路错开一截这不是数据坏了是坐标系没对齐。网上很多坐标纠偏工具就是专门处理这个的。拿到 shp 第一件事先看 .prj 文件里写了什么。用文本编辑器打开 .prj能看到类似 PROJCS[CGCS2000 / 3-degree Gauss-Kruger CM 114E] 的描述。如果 .prj 缺失GIS 软件会按 WGS84 解释这是后续一切偏移的根源。坐标系EPSG使用场景与 WGS84 差异WGS844326GPS、国际数据、GeoJSON基准一致CGCS20004490地理/ 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, encodinggbk) # 查看前几行确认 NAME 字段正常显示 print(gdf.head()) # 查看字段列表和坐标系信息 print(gdf.columns.tolist()) print(gdf.crs)encodinggbk是多数国内 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, encodinggbk) # PAC 统一转成字符串再判断前缀 gdf[PAC] gdf[PAC].astype(str) guangzhou gdf[gdf[PAC].str.startswith(4401)] # 导出子集输出编码指定为 UTF-8 guangzhou.to_file(广州_区县.shp, driverESRI Shapefile, encodingutf-8) print(guangzhou.shape)astype(str)是为了防止数字类型导致前缀判断失败部分数据把 PAC 存成整数短代码的前导零会丢。to_file里的encodingutf-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, encodinggbk) # 转换到 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 或 GB18030Python 读取时加encodinggbk还乱就换gb18030。如果数据要分发用 ogr2ogr 统一转成 UTF-8ogr2ogr -f ESRI Shapefile 广东_区县_utf8.shp 广东_区县.shp -lco ENCODINGUTF-8-lco ENCODINGUTF-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, encodinggbk) # 检查有效几何数量 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, encodinggbk) 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_onPAC, right_on区县代码, howleft) merged[密度] merged[人口] / merged[面积_km2]zfill(9)补齐前导零很多代码存成数字后开头的 0 会丢。howleft保留所有区县要素匹配不上的行显示为 NaN这批数据要重点检查通常是统计年报和行政区划底图的代码版本不一致导致的。关联好之后用 matplotlib 出图是最快的验证方式。分级方法选分位数Quantiles保证每档要素数量接近适合人口密度这类偏态分布数据import matplotlib.pyplot as plt fig, ax plt.subplots(figsize(10, 12)) merged.plot( column密度, schemeQuantiles, k5, cmapYlOrRd, axax, legendTrue, legend_kwds{fmt: {:.0f} 人/km², loc: lower right}, ) ax.set_axis_off() plt.tight_layout() plt.savefig(广东人口密度.png, dpi300, bbox_inchestight)schemeQuantiles表示分位数分级k5是 5 档cmapYlOrRd黄到红渐变适合密度类数据。dpi300出印刷级清晰度屏幕预览 150 足够。这套参数我反复调过深色渐变配白底最稳妥很少翻车。5.2 导出 PNG 与转换为 Web 底图论文配图用上面导出的 PNG 就够但做 Web 可视化就得转成 GeoJSON坐标系必须转成 WGS84前端地图控件基本只认这个ogr2ogr -f GeoJSON 广东_区县.geojson 广东_区县.shp -t_srs EPSG:4326 -lco RFC7946YES-t_srs EPSG:4326做坐标转换-lco RFC7946YES按 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看坐标系和字段再确认编码第三步才算面积验证最后才进入可视化。这套动作十分钟不到帮我拦下了至少三次坐标系错配和两次编码乱码导致的返工。希望这篇笔记能让你少走同样的弯路拿到数据先摸清底细再动手画图。本文还有配套的精品资源点击获取