简介:面向需用GIS软件完成制图与空间分析的人员,这份资源聚焦粤港澳大湾区各市区行政边界矢量数据,可直接用于专题图配色、区域统计、大湾区分区展示等场景,省去自行收集与预处理底图的环节。压缩包共20个文件,以shp、dbf、prj为核心:shp存储几何边界,dbf内附行政区属性信息,prj提供坐标投影定义,sbn/sbx/shx为空间索引文件,xml为元数据描述,整体仅272KB,轻量易携带,也便于项目交付与版本管理。资源发布以来已有290人学习浏览,适合GIS初学者在制图练习中快速搭好基础底图,也可作为中高级GIS人员开展大湾区可视化项目的底图基础。内容涵盖大湾区主体面状边界,并附有局部线状要素,既能支撑大范围区域对比,也能配合局部界线或辅助线进行叠加表达,制图灵活性更高。
1. 先回答一个问题:你手里的 shp,边界口径对得上吗
搜索框里输入“粤港澳大湾区shp数据”,能得到一堆下载链接,但真正把数据加载进 ArcGIS 或 QGIS 的人,十有八九会遇到同一个困惑:图是出来了,可深圳和香港之间的边界对不齐,广州的轮廓和统计年鉴里的行政区划差了一截,甚至整个湾区图形飘在海上。问题不在下载源,而在 shp 这种矢量格式本身只负责装几何和属性,它不负责告诉你这份数据是按哪套口径、哪个坐标系画的。大湾区恰好是行政区划数据里口径最杂的区域之一:内地九市的民政边界、香港特别行政区的陆地边界、澳门特别行政区的填海区边界,分属不同年份、不同数据来源、不同投影体系。这篇文章就沿着“选口径、对齐坐标系、整理几何、处理属性、验证结果”这条路径,把你拿到的任意一份大湾区 shp 收拾成能直接用于制图、统计和空间分析的标准数据。适合三类人:做城市规划的、做自然资源调查的、以及只想画一张不闹笑话的湾区专题图的。
2. 边界口径是第一道分水岭:先确定你的大湾区是哪一版
2.1 大湾区的三种边界口径,选错了就全错
“大湾区”不是一个法定行政区划名称,它是《粤港澳大湾区发展规划纲要》提出来的区域概念,覆盖珠三角九市加香港、澳门两个特别行政区。因为不是法定政区,所以你做图或做分析时,首先要回答“大湾区范围到底画到哪”。从业者口中常说的有三种口径:
第一种最常用,叫“9+2”完整口径:广州、深圳、珠海、佛山、惠州、东莞、中山、江门、肇庆九市完整行政区域,加上香港全境、澳门全境。适合做湾区整体格局图、人口经济对比、交通路网串联分析这类宏观选题。
第二种是“内地九市”口径:只画珠三角九市,港澳单独用点状符号或标注代替。常见于内地统计类专题图,因为港澳的统计口径和内地不衔接,放在同一张属性表里容易出逻辑矛盾。
第三种是“核心区”口径:比如广州南沙、深圳前海、珠海横琴这类平台范围的拼接版,多为特定政策研究定制,市面上流通很少,多数是自己用区县边界裁出来的。
问题在于,很多下载站提供的“大湾区 shp”根本不说自己用的是哪种口径。你拿到的可能是一个别人把九市矢量胡乱合并后的结果,也可能是一份把港澳边界和内地边界硬拼在一起但没做拓扑检查的半成品。我见过最离谱的一次,用户拿到的“大湾区 shp”打开后只有巴掌大——因为那份数据只包含肇庆一个市的轮廓,文件名却叫“大湾区”。所以拿到任何数据,第一步不是画图,是翻开属性表数要素:应该有 11 个行政区要素,或者 9 个,再不济也是 1 个合并后的整体边界。要素数不对,后面全白做。
2.2 从市级 shp 合成大湾区:合并操作的两种做法
如果你手上只有珠三角九市和港澳的独立 shp 文件,想拼出一份大湾区,常见做法有两种。第一种是直接在 ArcGIS Pro 里用「合并」工具,把 11 个面要素合并成一个要素类,再用「融合」按某个字段消除共同边界。第二种是用 Python 的 geopandas 库,一次脚本搞定,便于重复执行和参数调整。这里我推荐第二种,因为大湾区你迟早要更新——一年一版的行政区划调整你不可能每次都在 GUI 里点半天。
import geopandas as gpd # 读入九市加港澳,city_path 是你本地存放市级 shp 的目录 cities = [ "guangzhou.shp", "shenzhen.shp", "zhuhai.shp", "foshan.shp", "huizhou.shp", "dongguan.shp", "zhongshan.shp", "jiangmen.shp", "zhaoqing.shp", "hongkong.shp", "macau.shp" ] gdf_list = [] for name in cities: gdf = gpd.read_file(f"./data/{name}") # 统一坐标系,避免合并后出现几何错位 gdf = gdf.to_crs("EPSG:4490") gdf_list.append(gdf) # concat 只是简单堆叠,不做边界消除 combined = gpd.GeoDataFrame( pd.concat(gdf_list, ignore_index=True), crs="EPSG:4490" ) # dissolve 按 country 字段融掉内部边界,得到整体轮廓 merged = combined.dissolve(by="country", aggfunc="first") merged.to_file("./output/gba_merged.shp", encoding="utf-8")这段脚本的核心有两点。一是to_crs("EPSG:4490")把所有数据先转成 CGCS2000 地理坐标系,这一步是合并前的保险,避免一份数据是经纬度、另一份是投影坐标导致拼接时错位。二是dissolve(by="country")里的分组字段,你可以换成自己的字段名,比如按“城市”分组,那得到的就是保持九市加港澳边界、但属性表简洁的要素类;如果不传 by 参数,则所有要素融合成一个多边形,适合后续做裁剪或范围判断。
需要注意的是:dissolve 只能处理面要素之间的共享边。如果两份数据的边界本来就不重合(比如深圳的陆地边界和香港的陆地边界之间隔着一条河,两边画得不一样),融合后就会出现“接缝空洞”或“重叠区域”。这点后面避坑章节单独讲。
2.3 用 ArcGIS 手动合并的替代路径
不想碰代码也可以,ArcGIS Pro 的「合并」加「融合」两步能完成同样的事。合并时注意勾选“匹配字段”,否则属性表里每个城市的名称字段可能对不齐;融合时按城市名字段操作,融合后记得做一次「检查几何」看有没有图形错误。
一个容易被忽略的点:港澳的 shp 文件名、字段名经常是英文或粤语拼音,比如香港的 district 字段里叫“Yuen Long”,澳门的常用字段叫“PARISH”。合并前先把字段名统一成拼音或中文,否则融合后属性表没法用。别问为什么做规划的同事总在大湾区数据上加班,大多是在这种小地方耗掉的。
3. 坐标系对不上,数据再全也是废的:把 CGCS2000、WGS-84、香港 1980 格网对齐
3.1 大湾区常见的三种坐标系与它们的坑
大湾区是典型的多坐标系混居区。内地的九市 shp 绝大多数基于 CGCS2000(EPSG:4490 是经纬度版本,EPSG:4547 起是各种分带投影版),这个体系与 WGS-84 在厘米级差异,一般分析不用区分。但香港公开数据用的是香港 1980 格网坐标系(Hong Kong 1980 Grid),澳门则常用澳门格网(Macao Grid)。三者的基准面、投影方式、单位都不同,直接叠加会看到香港漂在深圳湾里,澳门跑到珠海横琴的南边。
最坑的一种情况:你下载的“大湾区 shp”里面没有 .prj 文件(坐标系定义文件)。ArcGIS 打开这种数据会默认按 WGS-84 或未知坐标系处理,结果就是图能显示、但所有距离和面积计算都是错的。你量出来的香港面积可能比真实值大 20%,而你根本不知道。
3.2 用 pyproj 和 geopandas 把坐标系统一到 CGCS2000
拿到原始数据后,第一步是用input_gdf.crs检查坐标系有没有被正确识别。如果显示为空,优先从数据来源页面找坐标系说明;实在没有,再根据经纬度范围反推。下面是标准处理流程:
import geopandas as gpd from pyproj import CRS gdf = gpd.read_file("./data/hk_district.shp") # 检查坐标系,如果为空或报错,说明缺少 .prj print(gdf.crs) # 已知是香港1980格网,显式指定 CRS hk_grid = CRS.from_epsg(2326) # Hong Kong 1980 Grid System gdf = gdf.set_crs(hk_grid, allow_override=True) # 转回 CGCS2000 经纬度 gdf_cgcs = gdf.to_crs("EPSG:4490") # 导出时带坐标系定义,避免下一次打开又变成未知坐标系 gdf_cgcs.to_file("./output/hk_cgcs2000.shp", encoding="utf-8")逻辑说明:set_crs是“告诉软件这份数据原本是什么坐标系”,to_crs是“转换成目标坐标系”,两者次序不能反。很多人直接to_crs导致报错,就是因为源坐标系未知,软件不知道从哪转起。EPSG:2326 是香港 1980 格网的投影坐标系,单位是米,适合做面积、距离量算;转成 EPSG:4490 后单位变成度,适合制图和与经纬度数据叠加。如果你要算面积,建议在投影坐标系下用area字段,而不是在经纬度下硬算。
澳门的格网坐标系是 EPSG:2327(针对旧澳门地图)和较新的 EPSG:2328,具体用哪个要看你那份数据的生产年份。老数据的坑在澳门回归前后的测绘基准变动,遇到 90 年代末的澳门 shp,直接按 EPSG:2328 设可能还是有米级偏移,这时只能找地面控制点做配准,属于测绘专业范畴,这里不展开。
3.3 两个高频转换:dwg 转 shp、shp 转 kml
日常项目中,大湾区的建筑、道路、宗地数据经常以 DWG 格式从设计院流出来,你得转成 shp 才能进 GIS 分析。常见做法是在 ArcGIS Pro 里用「CAD 至地理数据库」工具直接导入,或者用 QGIS 的“CAD 导入”插件。多边形的闭合线要注意:CAD 里的地块是“线”而不是“面”,转 shp 后是线要素,需要再用「要素转面」工具成面。转完务必检查字段里有没有 CAD 的图层名残留,那会影响后续符号化。
另一个方向是 shp 转 kml,这是给项目汇报、移动端查看用的最常见诉求。在 ArcGIS 里用「图层转 KML」就能生成,关键设置是“输出图像大小”和“镶嵌”选项;用代码则是借助fiona读 shp、simplekml或ogr写 kml。要注意 KML 的坐标系是 WGS-84 经纬度,转之前把数据先to_crs("EPSG:4326"),否则 Google Earth 里图形会偏到海里。这是 shp 转 kml 最常见的翻车点,没有之一。
4. 把杂乱的原始 shp 整理成能用的大湾区数据:清理、合并、裁剪、抽稀
4.1 清理几何错误与重复要素
公开下载的大湾区 shp 常带三类问题:重复要素、自相交多边形、以及属性表的乱码或空值。重复要素最典型的场景是同一份数据被不同博主转载时“加工”过多次,同一个深圳南山区出现两遍且面积略有不同。自相交则多见于从 CAD 线转面的数据,一条边界线交叉折叠,面计算时面积全是错的。
import geopandas as gpd gdf = gpd.read_file("./raw/gba_raw.shp") # 去掉完全重复的几何与属性行 gdf_clean = gdf.drop_duplicates() # 检查无效几何 invalid_mask = ~gdf_clean.geometry.is_valid print(f"invalid geometries: {invalid_mask.sum()}") # 修复无效几何:buffer(0) 是最经典的自相交修复法 gdf_clean.geometry = gdf_clean.geometry.buffer(0) # 重新验证 print(f"still invalid: {(~gdf_clean.geometry.is_valid).sum()}") gdf_clean.to_file("./clean/gba_clean.shp", encoding="utf-8")逻辑说明:drop_duplicates()默认按整行属性与几何去重,如果两份数据的属性略有差异(比如年份字段不同),就不能用这个方法,得改按几何对象去重:gdf.geometry.geom_type配合自写循环判断。buffer(0)是几何修复的万能膏药,对自相交、缝隙、反绕向等问题一次见效,原理是对图形外部做 0 距离缓冲使拓扑重新规范化。但对坐标精度有极高要求的做不动产宗地分析,buffer(0) 可能会微小改动边界顶点位置,最好只用于制图或常规统计,不用于精确界址。
4.2 合并出整体轮廓与按范围裁剪
清理完要素后,用unary_union()把全部面合并成一个 MultiPolygon,得到大湾区整体轮廓;要裁剪时再拿这个轮廓去切其他数据。边界处理的一个实务是:做宏观图时你通常不需要一条精确的界河走向,但裁剪时切出来的碎屑要素需要过滤,避免满图都是指甲盖大小的碎面。
from shapely.ops import unary_union # 先合并成整体轮廓 union_geom = unary_union(gdf_clean.geometry) # 用轮廓框选一个研究范围(示例:只保留东经113度以西的区域) west_boundary = gpd.GeoSeries([box(112, 21.5, 113.5, 23.5)], crs="EPSG:4490") # 裁剪:使用 overlay 或 clip 均可 clipped = gpd.clip(gdf_clean, west_boundary) # 过滤掉裁剪后面积小于阈值的碎片 clipped = clipped[clipped.geometry.area > 0.00001] clipped.to_file("./output/gba_clipped.shp", encoding="utf-8")这里比较值得说的是裁剪结果的面积过滤参数。0.00001 这个阈值单位是坐标系的平方单位——当前 CRS 是经纬度,那算出来的是“平方度”,不是平方公里。实际生产中建议先用to_crs转投影坐标系再算面积,再去过滤。按 API 习惯,clip可以接受 GeoSeries 或 GeoDataFrame 作为掩膜,但掩膜与目标数据要处于同一坐标系,否则裁剪结果可能只有零星几个点。如果你在 ArcGIS 里操作,「裁剪」工具对应同一个逻辑,注意勾选“保留要素类”属性来防止输出外围空白。
4.3 抽稀边界:simplify 的参数怎么给
Canvas 上画大湾区边界有时候不需要 1:500 地形图的精度,尤其是插图、PPT 用途,一个带几万个节点的大湾区面会拖慢渲染。这时用简化几何工具(ArcGIS 的「简化」、geopandas 的simplify())来抽稀。
# simplify 的 tolerance 参数:容差越大,结果越粗糙 simplified = gdf_clean.geometry.simplify(tolerance=0.001, preserve_topology=True) # 容差为0.001度,约合100米左右tolerance的取值要按图幅和用途来:A4 插图用 0.005 度(约 500 米)级别没问题,打印大幅面挂图要 0.0005 度级别。关键参数preserve_topology=True一定要开,否则简化后相邻面之间会出现空隙和重叠。ArcGIS 里的「简化」对话框里对应“保留拓扑”勾选项,意义相同。抽稀后务必做一次拓扑检查或叠合检查,确保香港和深圳的边界没有因为抽稀而交叉。
5. 避坑清单:大湾区 shp 上最容易翻车的 6 个细节
5.1 打开 shp 后图形被压扁成一条线
现象:加载粤港澳 shp 到 ArcGIS,整个图形是一条横贯屏幕的细线,缩放后能看到城市轮廓但比例严重变形。原因:.prj 文件缺失或损坏,软件按 WGS-84 经纬度打开,但数据实际是投影坐标(比如香港 1980 格网),坐标值从几十万变成了一百多度的“经度”,导致图形被拉伸压扁。解决:在「图层属性」里手动指定源坐标系,或者在 Python 里用set_crs修正;修正后立刻另存一份新数据,别再覆盖原文件。
5.2 香港澳门边界与内地错位半条街
现象:内地九市能对上天地图,香港却漂移到海上,澳门和珠海重叠。原因:内地数据基于 CGCS2000,港澳数据基于本地格网,两个坐标系的地球基准面不同,互相偏差可达数十米到数百米。解决:统一转成 CGCS2000地理坐标系后叠加;如果只是做示意,可以接受偏差;如果做精确的规划划线,必须用国内公开的控制点做七参数转换,这个属测绘专业工具,普通 GIS 人员不建议硬碰。另一个次常见原因:你那份香港数据用的是 1997 年前的坐标系,需要先转香港 1980 格网再转 CGCS2000。
5.3 合并后出现“接缝空洞”和重叠区
现象:把广州和佛山的 shp 合并,交界处出现一条亮色缝隙或暗色重叠。原因:两份区划数据的边界不是同源生产,一边沿道路中心线画,一边沿河中间线画;叠加后没有拓扑对齐。解决:用union找出两个面的交集和差集,人工判断该归属谁;或者直接以高精度数据为准裁掉低精度的多余部分。市县级合并之间这种接缝问题几乎无可避免,只能说尽量用同一来源的数据做融合。
5.4 关键属性字段全是空值或乱码
现象:属性表里打算用来做融合和符号化的“城市名称”字段全是空白,或者中文显示为 ???。原因:下载的 shp 带上 .dbf 文件,若原始数据用非 UTF-8 编码保存,字段中文会乱码;若属性表本身就是残缺的独立文件,则会空值。解决:在 QGIS 里以“UTF-8”或“GBK/GB2312”两种编码重新加载一次选择正确的;Python 里则修改encoding参数读入后再转出。
5.5 合并出来的大湾区面积比统计公报少一大截
现象:用 ArcGIS 算面积,大湾区总面积比官方口径少几万平方公里。原因:算面积时数据在经纬度坐标系(单位是度),!shape.area!算出来的是“平方度”不是平方公里,而很多人直接对结果做了求和。解决:先把数据投影到 Albers 等积投影(如 EPSG:4547 等地方投影),再计算面积字段,或者直接用calculate geometry选择平面单位。对大湾区这种跨 4 个经度的区域,等积投影比 UTM 分带更合适。
5.6 数据带缺口:缺岛屿、缺填海区
现象:深圳和香港的 shp 都完整显示,但伶仃洋上的岛屿一个都没有,澳门也缺了新城填海区的地块。原因:不同年份发布的行政边界数据对海域和填海区的处理不同,部分版本只保留大陆陆地边界。解决:核实数据来源的时间戳,填海区这十多年变化剧烈,旧数据缺失属正常现象;如果项目需要最新边界,优先用当地规划部门发布的数字线划图或公开的影像底图配合手工修订。
6. 验证跑通后,让这份大湾区 shp 真正活起来
6.1 做一次空间连接,把宏观数据“贴”到城市面上
你千辛万苦整理好的大湾区 shp,如果只是用来画一张填色图,投效比太低了。常见进阶做法是把经济、人口、碳排放等统计指标通过字段连接注入属性表,做空间分析或专题制图。另一种做法是空间连接:把企业点数据、气象站点数据、断面监测点数据落到对应的行政区面上,统计出每个城市的 POI 数量或污染均值。
# 读取你整理好的大湾区 shp 和一份 POI 点数据 gba = gpd.read_file("./clean/gba_clean.shp") poi = gpd.read_file("./data/shenzhen_poi.shp") # 空间连接:点落到面,统计每区 POI 数量 joined = gpd.sjoin(gba, poi, how="left", predicate="contains") counts = joined.groupby("city_name").size().reset_index(name="poi_count") # 合并回原面,即可制图 result = gba.merge(counts, on="city_name", how="left") result.to_file("./output/gba_poi_count.shp", encoding="utf-8")逻辑说明:sjoin的predicate="contains"要求点在面内才算命中,这样能避开边界线上的含混;如果你的点数据在边界上精度一般,改用“intersects”会宽松很多,但统计结果会偏高。这种“面-点”空间连接是自然资源和规划口最常见的操作,熟练后可以举一反三:配套 Excel 里的经纬度点转 shp,行业里常说的“arxgis excel 点转 shp”,本质上就是你手里有经纬度两列数据,用 Excel 表加载成 XY 事件,再导出成 shp。Excel 里中文表头常有空格或特殊字符,导出前用 Python 或 ArcGIS 字段计算器清洗一下,否则后续按字段 join 时会找不到列名。
6.2 一次有意义的校验:把 shp 转 3D Tiles 前的准备
这几年 Cesium 和 WebGIS 可视化越来越热,很多人想把大湾区 shp 转成 3D Tiles 在浏览器里做展示。但直接拿原始 shp 转 3D Tiles 会踩大坑:面要素没有高度信息、坐标系是地心坐标而不是 Web Mercator、边界节点太多导致瓦片体积爆炸。所以转之前至少做三件事:一是清洗几何并抽稀到制图精度,二是用建筑物高度字段或 DEM 给面赋 Z 值,三是确认坐标系经过转换能被 Cesium 正确读取。这样转出来的 3D Tiles 才能控制在可接受的加载体积内。
验证方法也很简单:把转换后的 3D Tiles 放本地服务,用浏览器打开对比影像底图,看城市边界是否和天地图的行政区划吻合。我在一个实际项目里这么干过,当时用了带楼层数属性的建筑轮廓数据生成 3D Tiles,凌晨两三点看一眼渲染结果,发现澳门塔的位置完全偏离了塔的实际坐标,排查到最后是源 shp 的属性表里有一行政府大楼的几何数据损坏。所以每次拿到新 shp,第一件事永远是is_valid检查几何,这是血泪经验。
6.3 一句忠告,希望帮到你
大湾区数据的整理,90% 的时间花在坐标系和边界口径的核对上,只有 10% 是真正“画图”。这些工作没什么玄学,就是把每一步都验证一遍,别嫌麻烦。你按这套流程把数据从下载源收拾到自己能信的版本,以后再做湾区任何分析,都能省下几天的返工。希望帮到你。
本文还有配套的精品资源,点击获取