☰
粤港澳大湾区9+2政区图处理:坐标系转换与合并避坑指南
2026/10/19 2:16:31 网站建设 项目流程

简介:粤港澳大湾区“9+2”政区图是一套按省级权威底图整理的ArcGIS矢量数据,覆盖广州、深圳、珠海、佛山、惠州、东莞、中山、江门、肇庆九座内地城市,以及香港、澳门两个特别行政区。数据依据广东省自然资源厅发布的1:100万行政区划图重新制作,作者并未采用现成转载版本,而是花费大量时间处理海岸线和边界细节,尤其对珠江口周边岸线进行了手工校正,适合用于国土空间规划、人口经济数据关联、论文配图、课堂教学等场景。压缩包体积仅270KB,共7个文件,其中shp是几何主文件,dbf保存行政区名称与代码等属性,prj定义投影坐标系统,sbn/sbx提供空间索引可提升编辑与查询效率,xml则包含元数据信息;解压后可直接在ArcGIS、QGIS等工具中加载、编辑或出图。当前已有4365人浏览学习,无论是GIS初学者快速获取大湾区底图,还是研究者在此基础上结合业务数据进行专题分析,这套数据都能显著减少前期整理与校正工作量。

1. 先看清“9+2”是什么:一份政区图压缩包能省掉多少事

做粤港澳大湾区相关的项目,最磨人的往往不是分析本身,而是找一张能用的底图。所谓“9+2”,指的是珠三角九座城市,加上香港、澳门两个特别行政区,全称就是“粤港澳大湾区政区图(9+2)”。这一类压缩包解压以后,一般是一整套行政区划矢量数据,包含九市两区的边界、市名、区县名和常见属性字段。它的价值不在于“画好了一张图”,而在于把分散各处的政区边界收敛成一个数据源,不用再为广州找一个文件、深圳另找一个文件,坐标系还不一致。

适合做城乡规划、人口统计、物流可视化、高校课题区位图的开发者。但压缩包解开只是第一步,投影、编码、合并、校验这些事一步都省不了。下文按“先检查数据、再导入软件、再统一坐标、最后合并出图”的顺序展开,每一步都给出命令、参数和坑。

2. 解压后的第一件事:核对文件清单、字段和坐标系

rar 解压之后,别急着把 shp 拖进 GIS。先花十分钟搞清楚三件事:文件是否完整、属性表里有什么、坐标系是什么。这三件事决定了后面每一步的操作方向,跳过任何一个,后面的报错都要回来补课。

2.1 认清 shapefile 文件家族:不是单个 shp 就有全部信息

一个可用的 shapefile 是“一组文件”而不是“一个文件”。其中 .shp 存几何边界,.dbf 存属性表,.shx 是几何和属性之间的索引,这三者缺一不可。很多政区图压缩包还会带 .prj 和 .cpg,前者记录坐标系描述,后者记录属性表编码。对做政区图的人来说,.prj 几乎是整个包里最重要的文件:没有它,GIS 只能按默认坐标系去猜数据位置。以下是常见文件后缀及其缺失后果,建议对照压缩包逐个检查。

文件后缀作用缺失后果
.shp几何数据,面或线边界没有实际图形
.dbf属性表,存市名、区县名等图层开得出来但看不到名称
.shx几何与属性间的索引部分软件直接拒绝打开
.prj坐标系描述文本投影错乱、位置偏移
.cpg属性表编码声明中文属性乱码

注意一个常见的误判:在 Windows 里直接双击 .shp 文件,系统弹窗说“无法打开”,不代表数据损坏。换个思路,把整个文件夹拖进 QGIS,或者用下面的命令行工具先读一遍,再决定是否真的缺文件。

2.2 用 ogrinfo 快速检查图层边界与坐标系

我拿到任何一份政区图,第一件事就是打开终端跑 ogrinfo。它是 GDAL 自带的命令行工具,安装 QGIS 时一般会一并装好,也可以在终端单独安装 GDAL 后使用。命令很简单,进入解压目录,指定要看的 shp 文件即可。

cd /path/to/your/shp_dir ogrinfo -so -al guangzhou.shp

输出里需要重点看的四行是:Geometry 告诉你几何类型,是 Polygon 还是 MultiPolygon;Feature Count 是要素数量,对应区县数量;Extent 给出数据范围,如果数值是 113 到 114 之间的经纬度量级,说明是地理坐标系,如果变成几十万上百万的数量级,说明是投影坐标系;Layer SRS 如果有一长串坐标系描述,说明 .prj 存在。最怕的是输出里没有 SRS 这一行,那意味着这份数据没有坐标系定义,后面叠加在线底图时大概率要出问题。

这条命令是只读操作,不会改动原始文件,可以反复执行。如果目录里有十个城市的 shp,可以写一个 for 循环批量跑,把每个文件的 Extent 和 SRS 列出来,几分钟内就能完成整个压缩包的体检。

2.3 从命名和属性字段判断这份数据是市界还是区县界

政区图包常见两种组织方式:一种是按市拆分文件,比如 gz.shp、sz.shp、hk.shp 各管一片;另一种是把九市两区全部揉进一个文件,靠属性字段区分城市。后者的文件名常带“9+2”“dawanqu”一类的字样。判断粒度最直接的方法是看属性表:有“地市名称”和“区县名称”两个字段的,是区县级数据;只有“地市”字段的,通常只有市界线。

这个判断直接决定了后面能不能做按市聚合的统计。如果拿到的只是市界级数据,就别指望它包含乡镇街道边界;如果要做九市的精细图,还需要重新找更细粒度的来源。港澳数据在这个包里通常单独成文件,命名常见的是 hk.shp、mo.shp 或 gangao.shp。它们的位置、范围、坐标系和内地文件往往不一致,后面要单独处理。

3. 装进 QGIS 和 ArcGIS:空白、偏移和路径断链的三种处理

文件体检通过之后,进入软件才真正接触数据。最常见的异常无外乎三种:图层放进去界面空白、位置偏移到远处、ArcGIS 工程文件再次打开数据源失效。下面逐个说。

3.1 QGIS 打开后看不到图:先指定图层 CRS,别急着重投影

在 QGIS 里拖入一个政区 shp,结果什么都没有,这是碰到的最高频问题。多数情况下数据本身没坏,而是 QGIS 不知道它应该落在哪里。默认情况下 QGIS 会拿 WGS84 经纬度去解释所有坐标,如果这个文件原本是投影坐标,数值量级完全不同,图形就会画到视野之外。

处理的关键是分清两个概念:指定 CRS 和重投影。指定 CRS 是告诉软件“这份数据原本在哪个坐标系下”,好比告诉别人这张图纸用的是哪套尺子;重投影是把坐标数值换算到另一个坐标系,相当于把尺子换成另一套。很多人上来就点“导出-另存为-重投影”,如果原始坐标系本来就没定义,重投影只会错上加错。正确顺序是:先右键图层 → 图层属性 → 源 → 关联 CRS,选对原始坐标系,再把图层缩放到全图范围,然后导出重投影。

如果一次要处理十几个城市文件,用 PyQGIS 脚本批量赋 CRS 更省事。下面这段代码的作用是给单个图层声明坐标系,不改坐标数值:

from qgis.core import QgsVectorLayer, QgsCoordinateReferenceSystem, QgsProject layer = QgsVectorLayer("gz.shp", "gz", "ogr") crs = QgsCoordinateReferenceSystem("EPSG:4490") # CGCS2000 地理坐标系 layer.setCrs(crs) QgsProject.instance().addMapLayer(layer)

参数说明:EPSG:4490 是 CGCS2000 大地坐标系的代码,适合国内测绘数据;如果确认数据是 WGS84,就用 EPSG:4326;搞不清楚时先别写,去查这份数据的来源说明。setCrs 只是声明,等于给数据贴上坐标系标签。声明完之后,正常显示只是第一步,真正的坐标换算还要靠下一章的 ogr2ogr 或导出操作。

3.2 ArcGIS 工程文件打不开数据源:路径断链的修复

另一种常见事故发生在 ArcGIS 里:第一次打开数据正常,保存工程关闭,第二天再打开提示数据源缺失。原因通常是工程文件记录的是绝对路径,而数据所在目录有了变动,或者路径里带了中文导致解析失败。这个问题和政区图本身无关,但一旦发生在交付阶段非常尴尬。

修复分两步。第一步,打开“自定义 → ArcMap 选项 → 常规”,勾选“存储数据源的相对路径名”,这样以后移动工程文件夹时数据还能跟着走。第二步,对已经断链的图层,右键图层 → 数据 → 修复数据源,重新指向对应的 shp 文件。习惯上我会把解压后的数据全部放到同一个根目录,比如项目文件夹下的 data 子目录,保证相对路径始终成立。

值得留意的是,ArcGIS 对 shapefile 的字段名有长度限制,属性表里的中文字段名在导出时可能被截断或省略。做政区图交付时,建议字段名统一用拼音或英文,把中文名称放到字段值里,这是规避一系列乱码和断链问题的经验做法。

3.3 港澳两个图层为什么总对不上

“9+2”数据包里,香港和澳门两个文件往往是特殊的存在。香港政区数据常用香港 1980 网格坐标系,澳门也有自己的独立大地基准,跟内地的 CGCS2000 或 WGS84 不通用。直接把 hk.shp 拖进工程里和内地九市叠加,结果经常是香港跑到深圳北边或珠江口中央,澳门凭空悬在海面上——这就是典型的坐标系不统一的“玄学”。

判断方法看范围:单独加载 hk.shp,如果状态栏显示的范围是几十万上百万量级,而内地文件是 113.x、22.x 这种经纬度格式,两者不在一个坐标系下。更隐蔽的情况是两者都声明为经纬度,但使用的椭球参数不同,肉眼看到的是几百米级别的漂移,放大后沿着海岸线一看就能发现。

处理港澳数据的正确姿势不是手动改数字,也不是在图层属性里顺手换一个 CRS,而是分别查明原始坐标系,再统一重投影输出到同一目标坐标系。具体命令放在下一章,这里先记住一个原则:港澳图层一定要单独处理,不能跟着内地文件一起批量重投影,因为它们的源坐标系不同,一起处理等于拿错参数硬套。

4. 坐标转换与底图叠加:GCJ-02、WGS84、CGCS2000 怎么选

政区图值不值钱,一半看边界精度,另一半看坐标系是否统一。这一章把几套坐标系的关系、判断方式以及统一转换步骤讲清楚,顺便给命令和代码。

4.1 政区图坐标系乱的根源

国内能见到的政区图数据,坐标系大体分成四类。CGCS2000 是国家大地坐标系,测绘成果的标准格式;WGS84 是 GPS 原始坐标系,也是很多国际数据源的默认值;GCJ-02 是互联网地图常用的加密坐标;再老一点还有西安 80、北京 54。CGCS2000 和 WGS84 在省级尺度上的差异通常在一米以内,出图制图基本不需要处理。真正的坑集中在 GCJ-02:它不是单纯平移,而是经过非线性加密,整个湾区如果混用,边界偏移几百米很常见,而且面积统计也会跟着失真。

判断政区图是不是 GCJ-02,最直接的办法是看 .prj 里的描述词。打开 .prj 文件,如果出现“GCJ”“Mars”这类关键词,多半就是加密坐标。还有一部分数据源会直接注明“火星坐标”或“高精度坐标”,这类同样属于 GCJ-02 系统,不要和 WGS84 混着算。

坐标系常见来源与 WGS84 差异制图建议
CGCS2000测绘成果、国土数据米级可用,面积统计推荐
WGS84GPS、国际数据源基准一致叠加国际底图首选
GCJ-02互联网地图几百米级非线性偏移避免与其它数据混用
西安80/北京54历史数据十米级以上需七参数转换后再用

4.2 不读元数据也能判断坐标系的两个土办法

当 .prj 被删掉、元数据也找不到的时候,我用两个土办法兜底。第一个是地标点反推:找一个位置已知的地标,比如某城市电视塔,查它的公开经纬度,再在图层里找到同一个地标的坐标,对比两者的差值。如果整体偏移零点几度,基本可以断定是加密坐标或坐标系选错。第二个是叠加在线底图:加载一份卫星底图,把政区图叠上去,看珠江口轮廓、岛屿、岸线能否对齐。对不齐的时候先怀疑坐标系,再怀疑数据本身的精度。

需要注意,在线底图服务商使用的坐标系并不相同,叠加时要先确认底图用的是什么坐标系。多数标准在线瓦片基于 WGS84 或它的投影形式,而某些在线地图默认是 GCJ-02,叠加之前如果不弄清楚,反而会误判自己的数据。

4.3 用 ogr2ogr 和 geopandas 统一到目标坐标系

统一坐标系的落地方式,取决于最终用途。叠加在线底图出图,用 EPSG:4326 或 EPSG:3857;做面积计算和空间统计,用 CGCS2000 的分带投影坐标。下面这条命令把单个政区文件重投影到 WGS84 经纬度:

ogr2ogr -t_srs EPSG:4326 wgs84_dir/gz.shp raw_dir/gz.shp

参数说明:第一个参数是输出文件,第二个是输入文件;-t_srs 指定目标坐标系。这里最容易翻车的是把 -t_srs 和 -a_srs 搞混。-t_srs 是真正执行坐标换算,-a_srs 只是把坐标系声明写进文件,不移动任何坐标。用错 -a_srs 的结果是文件“看起来有了坐标系”,但叠到底图照样漂移。

批量处理整个压缩包时,我一般用 geopandas 写循环,比一条条敲命令直观,还方便顺便处理字段。

import geopandas as gpd cities = ["guangzhou", "shenzhen", "zhuhai", "foshan", "huizhou", "dongguan", "zhongshan", "jiangmen", "zhaoqing", "hk", "mo"] for name in cities: gdf = gpd.read_file(f"raw/{name}.shp") gdf = gdf.to_crs("EPSG:4326") gdf.to_file(f"wgs84/{name}.shp", encoding="utf-8")

这段代码把十一个文件全部读入、转坐标系、写出。两个注意点:其一,to_crs 的前提是源文件坐标系定义正确,如果源 .prj 本身就是错的,转完照样是错的;其二,输出时显式指定 encoding="utf-8",能提前拦住后面的属性表乱码问题。港澳两个文件在循环里虽然一起转,但源坐标系不同,所以转换结果需要单独核对,不要因为代码跑完了就默认没问题。

5. 避坑:政区图落地常见的 5 个翻车点

这一章的每一条都是实际项目里撞过的墙,统一按“现象 → 原因 → 解决”写。遇到对应问题可以直接跳到对应小节处理。

5.1 属性表汉字乱码:编码问题挡住九成新手

现象:打开属性表,市名和区县名变成“???”或一堆乱码,英文字段正常。 原因:shapefile 的属性表 dbf 大多以 GBK 或 ANSI 编码存储,而 QGIS 默认按 UTF-8 读取。ArcGIS 在中文系统里通常正常,一旦工程文件移到英文环境,同样的问题也会出现。 解决:在 QGIS 中打开数据源管理器,选中图层后指定编码为 GBK,重新加载;用 geopandas 读数据时显式传 encoding="gbk",再转存成 UTF-8:

import geopandas as gpd gdf = gpd.read_file("guangzhou.shp", encoding="gbk") gdf.to_file("guangzhou_utf8.shp", encoding="utf-8")

改完编码后务必检查一个中文地名,确认能正确显示,再继续后面的合并和出图。这个检查只需要十秒,能省掉后面所有属性关联环节的返工。

5.2 九市合并出现缝隙与重叠:拓扑修复不是可选项

现象:把九市 shp 合并成一个文件后,相邻市边界处出现白色缝隙,或者存在互相重叠的窄带。直接计算面积,总和对不上湾区陆地总面积。 原因:各市的边界线来自不同批次或不同数据源,相邻市界上的节点坐标不一致,面与面之间自然形成微小缝隙或重叠。 解决:合并之后做拓扑修复。QGIS 里可以用“修复几何”配合“消除”处理缝隙;ArcGIS 里用拓扑工具集,规则指定为“不能有间隙”和“不能重叠”,修复后再跑统计。如果只是出图展示,白缝可以用地图背景色掩盖,但以后一旦要做面积统计或空间查询,这条不能省。

5.3 港澳图层整体偏移:坐标系没统一就叠加

现象:内地九市显示正常,香港、澳门的边界单独看也没问题,一旦叠加进同一工程就整体错位。 原因:港澳文件与内地文件的坐标系不一致,加载时又没有先核对坐标系就直接混放。不少压缩包里的港澳数据还是从在线底图勾出来的,精度本身偏低,转换后仍会差几十米。 解决:按第 4 章的 ogr2ogr 命令,对港澳文件分别查明原始坐标系后重投影到统一目标坐标系,再做叠加。港澳数据转换完要放大到口岸、跨海通道近岸这些边界线密集的位置检查,确认与九市边界衔接自然,再进入下一步。

5.4 压缩包缺 .prj 或缺字段:拿到的数据不完整

现象:明明解压出一堆文件,导入 GIS 后提示“未知的空间参考”,或者图层能显示但属性表缺关键的市名、区县名字段。 原因:部分政区图包在整理上传时,为了压缩体积或表格处理方便,删掉了 .prj、.shx 这类看似次要的文件,导致坐标系信息丢失。 解决:先看同包内其它城市是否有 .prj,多数情况它们来自同一数据源,坐标系一致,把参考 .prj 复制过来改名即可。另一个更稳的做法是:在 QGIS 里按已知城市中心点手动指定 CRS,再另存为完整 shapefile。属性字段缺失只能回到压缩包元数据里找说明,找不到就先按当前可用的字段推进,出图时改用手工标注。

5.5 Dissolve 后字段丢了大半:合并前想清楚要留什么

现象:在 ArcGIS 里用 Dissolve 把区县面融合成市界面,结果输出图层只剩下几何和统计字段,城市名称、区县名称全没了。 原因:Dissolve 默认只保留用于融合的分组字段和统计字段,其它字段不会自动带过去。 解决:在 Dissolve 对话框的“字段映射”区域里,把需要保留的字段合并规则改成“第一条”,或者按需选择“总和”“平均值”。QGIS 的“融合”工具也一样,先在字段列表中勾选分组字段,再配置输出字段。这一步做完,再补一个“城市”字段用于配色和标注,就顺手多了。

6. 把九市两区合并成一个可用图层:字段整理与出图前校验

走到这一步,数据已经能显示、坐标系也统一了。最后收个尾:把九市两区合并成一个文件,补上城市字段,再做出图前校验。这也是交付给别人时最省心的形态。

6.1 批量合并与统一坐标系:一条命令跑完全部城市

ogr2ogr 支持追加模式。先以第一个城市建目标文件,后面每个城市用 -update -append 追加:

ogr2ogr -f "ESRI Shapefile" merged.shp guangzhou.shp -t_srs EPSG:4326 ogr2ogr -f "ESRI Shapefile" -update -append merged.shp shenzhen.shp -t_srs EPSG:4326 ogr2ogr -f "ESRI Shapefile" -update -append merged.shp hk.shp -t_srs EPSG:4326

每个城市一条,-t_srs EPSG:4326 保证追加进去的所有数据坐标系一致。全部跑完后用 ogrinfo 查看要素数量,九市两区一共是几十个区县单元,数量应该对上;对不上就回头查是哪个文件没追加上,别急着出图。

6.2 补一个“城市”字段,让配色和标注不再靠猜

合并后的文件通常没有城市字段,配色只能一个颜色到底。补字段用 geopandas 最直接,按区县名称映射到城市,再写回文件:

import geopandas as gpd gdf = gpd.read_file("merged.shp", encoding="utf-8") district_city = {"越秀区": "广州", "天河区": "广州"} # 示意,按实际属性替换 gdf["城市"] = gdf["区县名称"].map(district_city) gdf.to_file("merged_city.shp", encoding="utf-8")

实际数据里的区县名跟示例未必对得上,先跑一条 print 把不重复的区县名列出来,再写映射表。漏写一个区县就会多出一个“其他”分类,配色阶段才发现就要返工。

6.3 出图前最后校验:三处边界看完就能放心用

个人经验是放大到三处跨市地物密集的位置检查:一处跨市河口的入海口、一处跨海通道的东岸落点、一处陆地口岸两侧。这三个位置边界交错,最容易暴露坐标系不一致、缝隙和缺边问题。每处都要对比九市与港澳的边界是否自然衔接,再叠加一张在线底图确认岸线轮廓。

我给自己定了个老规矩:任何一份政区图,先跑 ogrinfo、先看 .prj、先叠在线底图,三件套做完才动手分析。这套流程不是流程本身,而是给自己留后悔药——坐标系问题越早发现,返工成本越低。希望你拿到的下一份“9+2”政区图,能一次跑通、少踩两个坑。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询